Make snprintf() return full strlen when truncating
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 18 Jul 2015 19:17:18 +0000 (15:17 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 24 Jul 2015 07:05:13 +0000 (03:05 -0400)
Previously, we would only return the amount of bytes written, excluding
null.  This is what glibc does too, for success.  But although we always
returned that amount, when the buffer is too small and the string is
truncated, glibc returns the total that *would* be written.

This change brings our snprintf() more in line with glibc; though I
still prefer not returning errors and just returning 0.

Note that this common pattern still works:

  l += snprintf(p + l, READSTR - l, "ierrs %d\n", ctlr->ierrs);
  l += snprintf(p + l, READSTR - l, "etxth %d\n", ctlr->etxth);
  l += snprintf(p + l, READSTR - l, "taligned %d\n", ctlr->taligned);

If we overrun the buffer, READSTR - l will be negative, at which point
snprintf() does not print into the buffer (and returns 0 for us).

kern/src/printfmt.c

index bf25f83..4bbceb2 100644 (file)
@@ -279,10 +279,9 @@ typedef struct sprintbuf {
 
 static void sprintputch(int ch, sprintbuf_t **b)
 {
-       if ((*b)->buf < (*b)->ebuf) {
+       if ((*b)->buf < (*b)->ebuf)
                *((*b)->buf++) = ch;
-               (*b)->cnt++;
-       }
+       (*b)->cnt++;
 }
 
 int vsnprintf(char *buf, int n, const char *fmt, va_list ap)