]> source.dussan.org Git - tigervnc.git/commitdiff
Fix build on systems without HOST_NAME_MAX 1289/head
authorAlex Richardson <Alexander.Richardson@cl.cam.ac.uk>
Wed, 14 Jul 2021 13:01:15 +0000 (14:01 +0100)
committerAlex Richardson <Alexander.Richardson@cl.cam.ac.uk>
Thu, 15 Jul 2021 08:44:11 +0000 (09:44 +0100)
Some operating systems such as FreeBSD don't define a HOST_NAME_MAX
macro. The portable approach to determine the real host name limit is
calling sysconf(_SC_HOST_NAME_MAX) so do that instead.

unix/vncserver/vncsession.c
unix/x0vncserver/x0vncserver.cxx
unix/xserver/hw/vnc/vncExtInit.cc

index 784d5daeb30bb5054711c1bb72c631d416b5f5eb..3573e5e9b2dd191900c9306f168eb0951c27d284 100644 (file)
@@ -339,7 +339,8 @@ static void
 redir_stdio(const char *homedir, const char *display)
 {
     int fd;
-    char hostname[HOST_NAME_MAX+1];
+    size_t hostlen;
+    char* hostname = NULL;
     char logfile[PATH_MAX];
 
     fd = open("/dev/null", O_RDONLY);
@@ -361,13 +362,21 @@ redir_stdio(const char *homedir, const char *display)
         }
     }
 
-    if (gethostname(hostname, sizeof(hostname)) == -1) {
+    hostlen = sysconf(_SC_HOST_NAME_MAX);
+    if (hostlen < 0) {
+      syslog(LOG_CRIT, "sysconf(_SC_HOST_NAME_MAX): %s", strerror(errno));
+      _exit(EX_OSERR);
+    }
+    hostname = malloc(hostlen + 1);
+    if (gethostname(hostname, hostlen + 1) == -1) {
         syslog(LOG_CRIT, "gethostname: %s", strerror(errno));
+        free(hostname);
         _exit(EX_OSERR);
     }
 
     snprintf(logfile, sizeof(logfile), "%s/.vnc/%s%s.log",
              homedir, hostname, display);
+    free(hostname);
     fd = open(logfile, O_CREAT | O_WRONLY | O_TRUNC, 0644);
     if (fd == -1) {
         syslog(LOG_CRIT, "Failure creating log file \"%s\": %s", logfile, strerror(errno));
index 89c9817e4bf8e5d42150793d8e3e2691173bfabc..29bc3d4c0262cfe30e46bfca53de7caa2cfac0cd 100644 (file)
@@ -71,29 +71,25 @@ BoolParameter localhostOnly("localhost",
 
 static const char* defaultDesktopName()
 {
-  static char* name = NULL;
-
-  char hostname[HOST_NAME_MAX + 1];
-  struct passwd* pwent;
-
-  size_t len;
-
-  delete [] name;
+  size_t host_max = sysconf(_SC_HOST_NAME_MAX);
+  if (host_max < 0)
+    return "";
 
-  if (gethostname(hostname, sizeof(hostname)) == -1)
+  std::vector<char> hostname(host_max + 1);
+  if (gethostname(hostname.data(), hostname.size()) == -1)
     return "";
 
-  pwent = getpwuid(getuid());
+  struct passwd* pwent = getpwuid(getuid());
   if (pwent == NULL)
     return "";
 
-  len = snprintf(NULL, 0, "%s@%s", pwent->pw_name, hostname);
+  size_t len = snprintf(NULL, 0, "%s@%s", pwent->pw_name, hostname.data());
   if (len < 0)
     return "";
 
-  name = new char[len + 1];
+  char* name = new char[len + 1];
 
-  snprintf(name, len + 1, "%s@%s", pwent->pw_name, hostname);
+  snprintf(name, len + 1, "%s@%s", pwent->pw_name, hostname.data());
 
   return name;
 }
index e6e802e3efc63526916c9b3b45d520a3bbe8c754..6025de912e70b6065cc6f0c59a3903a4c51ac304 100644 (file)
@@ -102,29 +102,25 @@ rfb::BoolParameter sendPrimary("SendPrimary",
 
 static const char* defaultDesktopName()
 {
-  static char* name = NULL;
-
-  char hostname[HOST_NAME_MAX + 1];
-  struct passwd* pwent;
-
-  size_t len;
-
-  delete [] name;
+  size_t host_max = sysconf(_SC_HOST_NAME_MAX);
+  if (host_max < 0)
+    return "";
 
-  if (gethostname(hostname, sizeof(hostname)) == -1)
+  std::vector<char> hostname(host_max + 1);
+  if (gethostname(hostname.data(), hostname.size()) == -1)
     return "";
 
-  pwent = getpwuid(getuid());
+  struct passwd* pwent = getpwuid(getuid());
   if (pwent == NULL)
     return "";
 
-  len = snprintf(NULL, 0, "%s@%s", pwent->pw_name, hostname);
+  size_t len = snprintf(NULL, 0, "%s@%s", pwent->pw_name, hostname.data());
   if (len < 0)
     return "";
 
-  name = new char[len + 1];
+  char* name = new char[len + 1];
 
-  snprintf(name, len + 1, "%s@%s", pwent->pw_name, hostname);
+  snprintf(name, len + 1, "%s@%s", pwent->pw_name, hostname.data());
 
   return name;
 }