[PATCH 3/3] rrd_daemon.c: modified struct listen_socket_s to use
variable length addr field

Index: rrdtool-1.4.8.new/src/rrd_daemon.c
===================================================================
--- rrdtool-1.4.8.new.orig/src/rrd_daemon.c	2013-08-07 13:36:06.000000000 +0200
+++ rrdtool-1.4.8.new/src/rrd_daemon.c	2013-08-07 13:38:52.000000000 +0200
@@ -124,7 +124,7 @@
 struct listen_socket_s
 {
   int fd;
-  char addr[PATH_MAX + 1];
+  char *addr;
   int family;
 
   /* state for BATCH processing */
@@ -2199,6 +2199,7 @@
 
   free(sock->rbuf);  sock->rbuf = NULL;
   free(sock->wbuf);  sock->wbuf = NULL;
+  free(sock->addr);  sock->addr = NULL;
   free(sock);
 } /* }}} void free_listen_socket */
 
@@ -2328,6 +2329,8 @@
 
 static int open_listen_socket_unix (const listen_socket_t *sock) /* {{{ */
 {
+  // FIXME
+  //int fd, len;
   int fd;
   struct sockaddr_un sa;
   listen_socket_t *temp;
@@ -2355,8 +2358,8 @@
         dir, rrd_strerror(errno));
     return (-1);
   }
-
-  free(path_copy);
+  // FIXME
+  //free(path_copy);
 
   temp = (listen_socket_t *) rrd_realloc (listen_fds,
       sizeof (listen_fds[0]) * (listen_fds_num + 1));
@@ -2424,8 +2427,11 @@
 
   listen_fds[listen_fds_num].fd = fd;
   listen_fds[listen_fds_num].family = PF_UNIX;
-  strncpy(listen_fds[listen_fds_num].addr, path,
-          sizeof (listen_fds[listen_fds_num].addr) - 1);
+  // FIXME
+  //len = strlen(path) + 1;
+  //listen_fds[listen_fds_num].addr = malloc(len);
+  strcpy(listen_fds[listen_fds_num].addr, path_copy);
+  free(path_copy);
   listen_fds_num++;
 
   return (0);
@@ -2575,6 +2581,8 @@
 
     if (listen_fds[i].family == PF_UNIX)
       unlink(listen_fds[i].addr);
+    // FIXME
+    free (listen_fds[i].addr);
   }
 
   free (listen_fds);
@@ -2699,7 +2707,7 @@
 
 static int daemonize (void) /* {{{ */
 {
-  int pid_fd;
+  int pid_fd, len;
   char *base_dir;
 
   daemon_uid = geteuid();
@@ -2721,9 +2729,9 @@
   }
   else
   {
-    strncpy(default_socket.addr, RRDCACHED_DEFAULT_ADDRESS,
-        sizeof(default_socket.addr) - 1);
-    default_socket.addr[sizeof(default_socket.addr) - 1] = '\0';
+   len = strlen(RRDCACHED_DEFAULT_ADDRESS) + 1;
+   default_socket.addr = malloc(len);
+   strcpy(default_socket.addr, RRDCACHED_DEFAULT_ADDRESS);
 
     if (default_socket.permissions == 0)
       socket_permission_set_all (&default_socket);
@@ -2812,6 +2820,9 @@
 
   free(queue_threads);
   free(config_base_dir);
+  // FIXME: Put at the right place
+  // see free_listen_sockets(listen_fds):
+  //free(default_socket.addr);
 
   pthread_mutex_lock(&cache_lock);
   g_tree_destroy(cache_tree);
@@ -2848,7 +2859,9 @@
 
       case 'l':
       {
+	// FIXME: struct member being malloced
         listen_socket_t *new;
+        int len;
 
         new = malloc(sizeof(listen_socket_t));
         if (new == NULL)
@@ -2858,7 +2871,15 @@
         }
         memset(new, 0, sizeof(listen_socket_t));
 
-        strncpy(new->addr, optarg, sizeof(new->addr)-1);
+        len = strlen(optarg) + 1;
+        // FIXME: Find out where to free new->addr and new
+        new->addr = malloc(len);
+        if (new->addr == NULL)
+         {
+           fprintf(stderr, "read_options: malloc failed.\n");
+           return(2);
+         }
+        strcpy(new->addr, optarg);
 
         /* Add permissions to the socket {{{ */
         if (default_socket.permissions != 0)
@@ -2879,8 +2900,15 @@
                          &config_listen_address_list_len, new))
         {
           fprintf(stderr, "read_options: rrd_add_ptr failed.\n");
+	  // FIXME
+          //free(new->addr);
+          //free(new);
           return (2);
         }
+	// FIXME: This removes unix:... in open_listen_socket_unix
+	// FIXME: This makes vagrind unhappy
+	//free(new->addr);
+	//free(new);
       }
       break;
 
_______________________________________________
rrd-developers mailing list
rrd-developers@lists.oetiker.ch
https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers

Reply via email to