]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Fix "checked_write" function
authorAlan T. DeKok <aland@freeradius.org>
Tue, 14 Dec 2010 15:29:54 +0000 (16:29 +0100)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 14 Dec 2010 15:29:54 +0000 (16:29 +0100)
- call va_end(args)
- call fwrite(), not fputs()

src/modules/rlm_detail/rlm_detail.c

index 1f4c6cb286ab296d960abfe53e1c734ae2821774..696b20a4426025ed1da53d62cd9c0d1301e18b9e 100644 (file)
@@ -186,8 +186,16 @@ static int checked_write(REQUEST *request, off_t *bytes_accum, FILE *fp,
 
        va_start(args, format);
        buf_used = vsnprintf(buf, sizeof(buf), format, args);
+       va_end(args);
 
-       written = fputs(buf, fp);
+       if (buf_used == 0) return 0;
+
+       if (buf_used >= (int) sizeof(buf)) {
+               radlog_request(L_ERR, 0, request, "Truncated vsnprintf");
+               return -1;
+       }
+
+       written = fwrite(buf, 1, buf_used, fp);
        if (written > 0) {
                *bytes_accum += written;
        }
@@ -199,7 +207,8 @@ static int checked_write(REQUEST *request, off_t *bytes_accum, FILE *fp,
                ftruncate(fileno(fp), ftell(fp) - *bytes_accum);
                fclose(fp);
 
-               radlog_request(L_ERR, 0, request, "Truncated write");           
+               radlog_request(L_ERR, 0, request, "Truncated write (wanted %d, wrote %d)",
+                              buf_used, written);              
                return -1;
        }
        return written;