Re: Bug#644657: libmemcached: FTBFS on hurd-i386
On Fri, 2011-10-07 at 23:04 +0200, Svante Signell wrote:
> Package: libmemcached
> Version: 0.44-1.1
> Severity: important
> Tags: patch
> User: debian-hurd@lists.debian.org
> Usertags: hurd
>
> Hi,
>
> libmemcached FTBFS mainly due to PATH_MAX issues on GNU/Hurd. The
> attached patch resolves these problems, and enables a portable solution for all
> architectures.
Attached is an updated patch, mainly fixing some indentation and coding
style issues and not limiting msghdr if there is no IOV_MAX limit
defined (as on GNU/Hurd).
Thanks!
diff -ur libmemcached-0.44//clients/ms_conn.c libmemcached-0.44.modified//clients/ms_conn.c
--- libmemcached-0.44//clients/ms_conn.c 2010-07-22 17:06:58.000000000 +0200
+++ libmemcached-0.44.modified//clients/ms_conn.c 2011-10-13 17:47:16.000000000 +0200
@@ -2125,12 +2125,14 @@
limit_to_mtu= c->udp;
/* We may need to start a new msghdr if this one is full. */
+#ifdef IOV_MAX
if ((m->msg_iovlen == IOV_MAX)
|| (limit_to_mtu && (c->msgbytes >= UDP_MAX_SEND_PAYLOAD_SIZE)))
{
ms_add_msghdr(c);
m= &c->msglist[c->msgused - 1];
}
+#endif
if (ms_ensure_iov_space(c) != 0)
return -1;
diff -ur libmemcached-0.44//clients/ms_setting.c libmemcached-0.44.modified//clients/ms_setting.c
--- libmemcached-0.44//clients/ms_setting.c 2010-08-03 02:34:02.000000000 +0200
+++ libmemcached-0.44.modified//clients/ms_setting.c 2011-10-13 18:20:53.000000000 +0200
@@ -304,13 +304,17 @@
*/
static void ms_no_config_file()
{
- char userpath[PATH_MAX];
+ char *userpath= NULL;
+ size_t len;
struct passwd *usr= NULL;
FILE *fd;
usr= getpwuid(getuid());
- snprintf(userpath, PATH_MAX, "%s/%s", usr->pw_dir, DEFAULT_CONFIG_NAME);
+ len= strlen(usr->pw_dir) + 1 + strlen(DEFAULT_CONFIG_NAME) + 1;
+ if ((userpath = malloc(len)) == NULL)
+ exit(1);
+ snprintf(userpath, len, "%s/%s", usr->pw_dir, DEFAULT_CONFIG_NAME);
if (access (userpath, F_OK | R_OK) == 0)
goto exit;
@@ -321,13 +325,14 @@
{
fprintf(stderr, "Could not create default configure file %s\n", userpath);
perror(strerror(errno));
+ free(userpath);
exit(1);
}
fprintf(fd, "%s", DEFAULT_CONGIF_STR);
fclose(fd);
exit:
- ms_setting.cfg_file= strdup(userpath);
+ ms_setting.cfg_file= userpath;
} /* ms_no_config_file */
diff -ur libmemcached-0.44//tests/server.c libmemcached-0.44.modified//tests/server.c
--- libmemcached-0.44//tests/server.c 2010-08-03 08:30:54.000000000 +0200
+++ libmemcached-0.44.modified//tests/server.c 2011-10-13 18:11:24.000000000 +0200
@@ -117,18 +117,30 @@
}
}
- char buffer[PATH_MAX];
- snprintf(buffer, sizeof(buffer), PID_FILE_BASE, x);
+ char *buffer= NULL;
+ size_t len= 0;
+
+ len= strlen(PID_FILE_BASE) + sizeof(int) - 2 + 1;
+ if ((buffer = malloc(len)) == NULL)
+ assert(buffer);
+ snprintf(buffer, len, PID_FILE_BASE, x);
kill_file(buffer);
if (x == 0)
{
- snprintf(buffer, sizeof(buffer), "%s -d -u root -P "PID_FILE_BASE" -t 1 -p %u -U %u -m 128",
+ len= strlen("%s -d -u root -P "PID_FILE_BASE" -t 1 -p %u -U %u -m 128") + strlen(MEMCACHED_BINARY) + 3*sizeof(int)- 4*2 + 1;
+ if ((buffer = malloc(len)) == NULL)
+ assert(buffer);
+ snprintf(buffer, len, "%s -d -u root -P "PID_FILE_BASE" -t 1 -p %u -U %u -m 128",
MEMCACHED_BINARY, x, port, port);
}
else
{
- snprintf(buffer, sizeof(buffer), "%s -d -u root -P "PID_FILE_BASE" -t 1 -p %u -U %u",
+ len= strlen("%s -d -u root -P "PID_FILE_BASE" -t 1 -p %u -U %u") +
+ strlen(MEMCACHED_BINARY) + 3*sizeof(int) - 4*2 + 1;
+ if ((buffer = malloc(len)) == NULL)
+ assert(buffer);
+ snprintf(buffer, len, "%s -d -u root -P "PID_FILE_BASE" -t 1 -p %u -U %u",
MEMCACHED_BINARY, x, port, port);
}
if (libmemcached_util_ping("localhost", port, NULL))
@@ -142,6 +154,7 @@
}
count= sprintf(end_ptr, "localhost:%u,", port);
end_ptr+= count;
+ free(buffer);
}
*end_ptr= 0;
@@ -149,9 +162,13 @@
int *pids= calloc(construct->count, sizeof(int));
for (uint32_t x= 0; x < construct->count; x++)
{
- char buffer[PATH_MAX]; /* Nothing special for number */
+ char *buffer= NULL; /* Nothing special for number */
+ size_t len= 0;
- snprintf(buffer, sizeof(buffer), PID_FILE_BASE, x);
+ len= strlen(PID_FILE_BASE) + sizeof(int) - 2 + 1;
+ if ((buffer= malloc(len)) == NULL)
+ assert(buffer);
+ snprintf(buffer, len, PID_FILE_BASE, x);
uint32_t counter= 3000; // Absurd, just to catch run away process
while (pids[x] <= 0 && --counter)
@@ -198,8 +215,10 @@
if (pids[y] > 0)
kill(pids[y], SIGTERM);
}
+ free(buffer);
abort();
}
+ free(buffer);
}
free(pids);
@@ -229,9 +248,15 @@
{
for (uint32_t x= 0; x < construct->count; x++)
{
- char file_buffer[PATH_MAX]; /* Nothing special for number */
- snprintf(file_buffer, sizeof(file_buffer), PID_FILE_BASE, x);
+ char *file_buffer= NULL; /* Nothing special for number */
+ size_t len= 0;
+
+ len= strlen(PID_FILE_BASE) + sizeof(int) - 2 + 1;
+ if ((file_buffer = malloc(len)) == NULL)
+ assert(file_buffer);
+ snprintf(file_buffer, len, PID_FILE_BASE, x);
kill_file(file_buffer);
+ free(file_buffer);
}
free(construct->server_list);
Reply to: