getservbyport_r: fix wrong result if getnameinfo fails with EAI_OVERFLOW
[musl] / src / legacy / cuserid.c
index 4e78798..dcaf73d 100644 (file)
@@ -2,13 +2,21 @@
 #include <pwd.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <string.h>
 
 char *cuserid(char *buf)
 {
+       static char usridbuf[L_cuserid];
        struct passwd pw, *ppw;
        long pwb[256];
-       if (getpwuid_r(geteuid(), &pw, (void *)pwb, sizeof pwb, &ppw))
-               return 0;
-       snprintf(buf, L_cuserid, "%s", pw.pw_name);
+       if (buf) *buf = 0;
+       getpwuid_r(geteuid(), &pw, (void *)pwb, sizeof pwb, &ppw);
+       if (!ppw)
+               return buf;
+       size_t len = strnlen(pw.pw_name, L_cuserid);
+       if (len == L_cuserid)
+               return buf;
+       if (!buf) buf = usridbuf;
+       memcpy(buf, pw.pw_name, len+1);
        return buf;
 }