[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