Bug:
The following program outputs "-lpthrea\n" instead of "-lpthread\n"
because of confstr(3)'s wrong return value.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(void)
{
size_t z;
char *b;
z = confstr(_CS_POSIX_V7_THREADS_LDFLAGS, NULL, 0);
b = malloc(z);
confstr(_CS_POSIX_V7_THREADS_LDFLAGS, b, z);
printf("%s\n", b);
}
Patch:
Index: src/lib/libc/gen/confstr.c
===================================================================
RCS file: /cvs/src/lib/libc/gen/confstr.c,v
retrieving revision 1.9
diff -p -u -r1.9 confstr.c
--- src/lib/libc/gen/confstr.c 1 Mar 2013 21:19:42 -0000 1.9
+++ src/lib/libc/gen/confstr.c 4 Mar 2013 05:22:52 -0000
@@ -55,9 +55,11 @@ static const char v7_width_restricted_en
size_t
confstr(int name, char *buf, size_t len)
{
+#define SCPY(x) (strlcpy(buf, (x), len) + 1)
+
switch (name) {
case _CS_PATH:
- return (strlcpy(buf, _PATH_STDPATH, len));
+ return (SCPY(_PATH_STDPATH));
/* no configuration-defined value */
case _CS_POSIX_V6_ILP32_OFF32_CFLAGS:
@@ -111,13 +113,13 @@ confstr(int name, char *buf, size_t len)
return (1);
case _CS_POSIX_V7_THREADS_LDFLAGS:
- return (strlcpy(buf, "-lpthread", len));
+ return (SCPY("-lpthread"));
case _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS:
- return (strlcpy(buf, v6_width_restricted_envs, len));
+ return (SCPY(v6_width_restricted_envs));
case _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS:
- return (strlcpy(buf, v7_width_restricted_envs, len));
+ return (SCPY(v7_width_restricted_envs));
default:
errno = EINVAL;