]> source.dussan.org Git - tigervnc.git/commitdiff
Handle failure getting VNC directories
authorPierre Ossman <ossman@cendio.se>
Thu, 29 Aug 2024 15:19:40 +0000 (17:19 +0200)
committerPierre Ossman <ossman@cendio.se>
Thu, 29 Aug 2024 15:23:56 +0000 (17:23 +0200)
Although rare, there are cases where we might fail to determine our base
directories. Make sure the code can handle it.

vncviewer/vncviewer.cxx

index 0aec191060d66cd10ac107d779831b1a99fbd0d4..c206427b22d3101086e6b1b3d77f8e4eb423ab1c 100644 (file)
@@ -540,28 +540,47 @@ migrateDeprecatedOptions()
 static void
 create_base_dirs()
 {
-  char *confdir = strdup(os::getvncconfigdir());
+  const char *dir;
+
+  dir = os::getvncconfigdir();
+  if (dir == nullptr) {
+    vlog.error(_("Could not determine VNC config directory path"));
+    return;
+  }
+
 #ifndef WIN32
-  char *dotdir = strrchr(confdir, '.');
+  const char *dotdir = strrchr(dir, '.');
   if (dotdir != nullptr && strcmp(dotdir, ".vnc") == 0)
     vlog.info(_("~/.vnc is deprecated, please consult 'man vncviewer' for paths to migrate to."));
 #else
-  char *vncdir = strrchr(confdir, '\\');
+  const char *vncdir = strrchr(dir, '\\');
   if (vncdir != nullptr && strcmp(vncdir, "vnc") == 0)
     vlog.info(_("%%APPDATA%%\\vnc is deprecated, please switch to the %%APPDATA%%\\TigerVNC location."));
 #endif
 
-  if (os::mkdir_p(os::getvncconfigdir(), 0755) == -1) {
+  if (os::mkdir_p(dir, 0755) == -1) {
     if (errno != EEXIST)
       vlog.error(_("Could not create VNC config directory: %s"), strerror(errno));
   }
 
-  if (os::mkdir_p(os::getvncdatadir(), 0755) == -1) {
+  dir = os::getvncdatadir();
+  if (dir == nullptr) {
+    vlog.error(_("Could not determine VNC data directory path"));
+    return;
+  }
+
+  if (os::mkdir_p(dir, 0755) == -1) {
     if (errno != EEXIST)
       vlog.error(_("Could not create VNC data directory: %s"), strerror(errno));
   }
 
-  if (os::mkdir_p(os::getvncstatedir(), 0755) == -1) {
+  dir = os::getvncstatedir();
+  if (dir == nullptr) {
+    vlog.error(_("Could not determine VNC state directory path"));
+    return;
+  }
+
+  if (os::mkdir_p(dir, 0755) == -1) {
     if (errno != EEXIST)
       vlog.error(_("Could not create VNC state directory: %s"), strerror(errno));
   }