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;

Reply via email to