summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtc%google.com <devnull@localhost>2007-05-14 20:16:25 +0000
committerwtc%google.com <devnull@localhost>2007-05-14 20:16:25 +0000
commita0b074c0ebd7b3cd4c731d632be274e1a6fe0b53 (patch)
tree75cdf94563c9c0f58fa8177f3429db8ce4f0566c
parentf63ed8ea26b88f93b2fbc4bf75ec2a02452ed2ea (diff)
downloadnspr-hg-a0b074c0ebd7b3cd4c731d632be274e1a6fe0b53.tar.gz
Bug 377451. Fix crash in cvt_s when string is longer than precision.
r=wtc,julien.pierre Tag: NSPRPUB_PRE_4_2_CLIENT_BRANCH
-rw-r--r--pr/src/io/prprf.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/pr/src/io/prprf.c b/pr/src/io/prprf.c
index cd5760a9..fa444e2c 100644
--- a/pr/src/io/prprf.c
+++ b/pr/src/io/prprf.c
@@ -373,7 +373,7 @@ static int cvt_f(SprintfState *ss, double d, const char *fmt0, const char *fmt1)
** width. "prec" is the maximum number of characters of "s" to output,
** where -1 means until NUL.
*/
-static int cvt_s(SprintfState *ss, const char *s, int width, int prec,
+static int cvt_s(SprintfState *ss, const char *str, int width, int prec,
int flags)
{
int slen;
@@ -382,15 +382,22 @@ static int cvt_s(SprintfState *ss, const char *s, int width, int prec,
return 0;
/* Limit string length by precision value */
- slen = s ? strlen(s) : 6;
+ if (!str) {
+ str = "(null)";
+ }
if (prec > 0) {
- if (prec < slen) {
- slen = prec;
- }
+ /* this is: slen = strnlen(str, prec); */
+ register const char *s;
+
+ for(s = str; prec && *s; s++, prec-- )
+ ;
+ slen = s - str;
+ } else {
+ slen = strlen(str);
}
/* and away we go */
- return fill2(ss, s ? s : "(null)", slen, width, flags);
+ return fill2(ss, str, slen, width, flags);
}
/*