diff options
| author | Matthias Melcher <git@matthiasm.com> | 2020-01-03 17:42:22 +0100 |
|---|---|---|
| committer | Matthias Melcher <git@matthiasm.com> | 2020-01-03 17:42:22 +0100 |
| commit | 462b681679d6c78b695c5394c21b5140b4fb7bd2 (patch) | |
| tree | 057fec8d5b75bdd3708cca12f7f4cd10043dd9a2 /src/drivers/X11 | |
| parent | 8147199a41e8cc39b0268433916dfccfcfc8e6eb (diff) | |
Linux/MSWindows: improved Fl_Preferences file path checking
Diffstat (limited to 'src/drivers/X11')
| -rw-r--r-- | src/drivers/X11/Fl_X11_System_Driver.cxx | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/src/drivers/X11/Fl_X11_System_Driver.cxx b/src/drivers/X11/Fl_X11_System_Driver.cxx index b84aba8ea..11e56de23 100644 --- a/src/drivers/X11/Fl_X11_System_Driver.cxx +++ b/src/drivers/X11/Fl_X11_System_Driver.cxx @@ -24,6 +24,10 @@ #include <X11/Xlib.h> #include <locale.h> #include <time.h> +#include <unistd.h> +#include <sys/types.h> +#include <pwd.h> + #if defined(_AIX) extern "C" { @@ -397,24 +401,37 @@ void Fl_X11_System_Driver::newUUID(char *uuidBuffer) char *Fl_X11_System_Driver::preference_rootnode(Fl_Preferences *prefs, Fl_Preferences::Root root, const char *vendor, const char *application) { - static char filename[ FL_PATH_MAX ]; filename[0] = 0; + static char *filename = 0L; + if (!filename) filename = (char*)::calloc(1, FL_PATH_MAX); const char *e; switch (root&Fl_Preferences::ROOT_MASK) { case Fl_Preferences::USER: - if ((e = getenv("HOME")) != NULL) { + e = getenv("HOME"); + // make sure that $HOME is set to an existing directory + if ( (e==0L) || (e[0]=0) || (::access(e, F_OK)==-1) ) ) { + struct passwd *pw = getpwuid(getuid()); + e = pw->pw_dir; + } + if ( (e==0L) || (e[0]=0) || (::access(e, F_OK)==-1) ) ) { + return 0L; + } else { strlcpy(filename, e, sizeof(filename)); - - if (filename[strlen(filename)-1] != '/') { - strlcat(filename, "/.fltk/", sizeof(filename)); - } else { - strlcat(filename, ".fltk/", sizeof(filename)); - } - break; + if (filename[strlen(filename)-1] != '/') + strlcat(filename, "/", sizeof(filename)); + strlcat(filename, ".fltk/", sizeof(filename)); } + break; case Fl_Preferences::SYSTEM: strcpy(filename, "/etc/fltk/"); break; } + + // Make sure that the parameters are not NULL + if ( (vendor==0L) || (vendor[0]==0) ) + vendor = "unknown"; + if ( (application==0L) || (application[0]==0) ) + application = "unknown"; + snprintf(filename + strlen(filename), sizeof(filename) - strlen(filename), "%s/%s.prefs", vendor, application); return filename; |
