]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Fix GNU strerro_r usage
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 29 Jun 2017 03:12:12 +0000 (23:12 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 29 Jun 2017 03:12:12 +0000 (23:12 -0400)
src/lib/util/syserror.c

index 4d4b9f1754de2bec582fd94a9d0cdddfbf8663f7..a81bcb7fed70c966c10c07acb9bbb2ad72928e7a 100644 (file)
@@ -207,8 +207,10 @@ char const *fr_syserror(int num)
         */
 #else
        {
-               p = strerror_r(num, p, end - p);
-               if (!p) {
+               char *q;
+
+               q = strerror_r(num, p, end - p);
+               if (!q) {
 #  ifndef NDEBUG
                        fprintf(stderr, "strerror_r() failed to write error for errno %i to buffer %p "
                                "(%zu bytes): %s\n", num, buffer, (size_t)FR_SYSERROR_BUFSIZE, strerror(errno));
@@ -217,6 +219,18 @@ char const *fr_syserror(int num)
                        return buffer;
                }
 
+               /*
+                *      If strerror_r used a static string, copy it to the buffer
+                */
+               if (q != p) {
+                       size_t len;
+
+                       len = strlen(q) + 1;
+                       if (len >= (end - p)) len = end - p;
+
+                       strlcpy(p, q, len);
+               }
+
                return buffer;
        }
 #endif