[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
[email protected]
https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers