Closed Bug 162786 Opened 22 years ago Closed 20 years ago

PR_snprintf returns wrong string length

Categories

(NSPR :: NSPR, defect)

defect
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: warrensomebody, Assigned: wtc)

Details

PR_snprintf can return the wrong print length in the case where the buffer
overflows:

char buf[5];
size_t len = PR_snprintf(buf, sizeof(buf), "too_many_characters");

=>

buf = "too_\0"
len = 3

(buf is correct, but should be len = 4)

because, in:

 C:\checkout\third_party\mozilla\nsprpub\pr\src\io\prprf.c(1166):
PR_IMPLEMENT(PRUint32) PR_snprintf(char *out, PRUint32 outlen, const char
*fmt, ...)

in the code fragment:

    /* If we added chars, and we didn't append a null, do it now. */
    if( (ss.cur != ss.base) && (*(ss.cur - 1) != '\0') )
        *(--ss.cur) = '\0';

the --ss.cur should be ss.cur - 1

When there's no buffer overflow, ss.cur will point 1
char past the terminating NUL, but if there is an overflow, it will point at
the terminating NUL.  So the return value, which is 1 less than the
difference between ss.cur and the beginning of the buffer, will be 1 too
small in the overflow case.

Jonathan Tash (tash@kontiki.com)
Neither can it return -1, as documented in prprf.h :-/
The change that Jonathan Tash proposed is correct. r=wtc.

I checked it in on the NSPR tip (NSPR 4.6) and
NSPRPUB_PRE_4_2_CLIENT_BRANCH (Mozilla 1.8 alpha).
Status: NEW → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Target Milestone: --- → 4.6
You need to log in before you can comment on or make changes to this bug.