Index: subr_prf.c =================================================================== RCS file: /cvsroot/src/sys/kern/subr_prf.c,v retrieving revision 1.143 diff -u -p -u -r1.143 subr_prf.c --- subr_prf.c 29 Sep 2011 20:52:39 -0000 1.143 +++ subr_prf.c 20 Nov 2011 18:10:04 -0000 @@ -1024,8 +1024,9 @@ sprintf(char *bf, const char *fmt, ...) va_start(ap, fmt); retval = kprintf(fmt, TOBUFONLY, NULL, bf, ap); va_end(ap); - *(bf + retval) = 0; /* null terminate */ - return(retval); + if (bf) + bf[retval] = '\0'; /* nul terminate */ + return retval; } /* @@ -1038,8 +1039,9 @@ vsprintf(char *bf, const char *fmt, va_l int retval; retval = kprintf(fmt, TOBUFONLY, NULL, bf, ap); - *(bf + retval) = 0; /* null terminate */ - return (retval); + if (bf) + bf[retval] = '\0'; /* nul terminate */ + return retval; } /* @@ -1052,14 +1054,13 @@ snprintf(char *bf, size_t size, const ch va_list ap; char *p; - if (size < 1) - return (-1); - p = bf + size - 1; + p = bf + size; va_start(ap, fmt); retval = kprintf(fmt, TOBUFONLY, &p, bf, ap); va_end(ap); - *(p) = 0; /* null terminate */ - return(retval); + if (bf && p < bf + size) + *p = '\0'; /* nul terminate */ + return retval; } /* @@ -1071,12 +1072,11 @@ vsnprintf(char *bf, size_t size, const c int retval; char *p; - if (size < 1) - return (-1); - p = bf + size - 1; + p = bf + size; retval = kprintf(fmt, TOBUFONLY, &p, bf, ap); - *(p) = 0; /* null terminate */ - return(retval); + if (bf && p < bf + size) + *p = '\0'; /* nul terminate */ + return retval; } /* @@ -1134,13 +1134,10 @@ vsnprintf(char *bf, size_t size, const c #define KPRINTF_PUTCHAR(C) { \ if (oflags == TOBUFONLY) { \ - if ((vp != NULL) && (sbuf == tailp)) { \ - ret += 1; /* indicate error */ \ - goto overflow; \ - } \ - *sbuf++ = (C); \ + if ((vp == NULL) || (sbuf < tailp)) \ + *sbuf++ = (C); \ } else { \ - putchar((C), oflags, (struct tty *)vp); \ + putchar((C), oflags, vp); \ } \ } @@ -1181,9 +1178,10 @@ kprintf(const char *fmt0, int oflags, vo char bf[KPRINTF_BUFSIZE]; /* space for %c, %[diouxX] */ char *tailp; /* tail pointer for snprintf */ - tailp = NULL; /* XXX: shutup gcc */ if (oflags == TOBUFONLY && (vp != NULL)) tailp = *(char **)vp; + else + tailp = NULL; cp = NULL; /* XXX: shutup gcc */ size = 0; /* XXX: shutup gcc */ @@ -1526,7 +1524,5 @@ done: if ((oflags == TOBUFONLY) && (vp != NULL)) *(char **)vp = sbuf; (*v_flush)(); -overflow: - return (ret); - /* NOTREACHED */ + return ret; }