From: Alan T. DeKok Date: Tue, 14 Dec 2010 15:29:54 +0000 (+0100) Subject: Fix "checked_write" function X-Git-Tag: release_2_1_11~186 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=703c85a25f1abc7b78ac9f09d84a43e6379f7ffd;p=thirdparty%2Ffreeradius-server.git Fix "checked_write" function - call va_end(args) - call fwrite(), not fputs() --- diff --git a/src/modules/rlm_detail/rlm_detail.c b/src/modules/rlm_detail/rlm_detail.c index 1f4c6cb286a..696b20a4426 100644 --- a/src/modules/rlm_detail/rlm_detail.c +++ b/src/modules/rlm_detail/rlm_detail.c @@ -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;