Author: jilles
Date: Sat Dec 11 17:47:27 2010
New Revision: 216380
URL: http://svn.freebsd.org/changeset/base/216380

Log:
  sh: Use vsnprintf() rather than crafting our own in fmtstr().
  Add INTOFF/INTON as longjmp out of vsnprintf may cause memory leaks or
  undefined behaviour.

Modified:
  head/bin/sh/output.c

Modified: head/bin/sh/output.c
==============================================================================
--- head/bin/sh/output.c        Sat Dec 11 16:06:52 2010        (r216379)
+++ head/bin/sh/output.c        Sat Dec 11 17:47:27 2010        (r216380)
@@ -64,8 +64,7 @@ __FBSDID("$FreeBSD$");
 
 
 #define OUTBUFSIZ BUFSIZ
-#define BLOCK_OUT -2           /* output to a fixed block of memory */
-#define MEM_OUT -3             /* output to dynamically allocated memory */
+#define MEM_OUT -2             /* output to dynamically allocated memory */
 #define OUTPUT_ERR 01          /* error occurred on output */
 
 static int doformat_wr(void *, const char *, int);
@@ -180,18 +179,12 @@ outbin(const void *data, size_t len, str
                outc(*p++, file);
 }
 
-static char out_junk[16];
-
 void
 emptyoutbuf(struct output *dest)
 {
        int offset;
 
-       if (dest->fd == BLOCK_OUT) {
-               dest->nextc = out_junk;
-               dest->nleft = sizeof out_junk;
-               dest->flags |= OUTPUT_ERR;
-       } else if (dest->buf == NULL) {
+       if (dest->buf == NULL) {
                INTOFF;
                dest->buf = ckmalloc(dest->bufsize);
                dest->nextc = dest->buf;
@@ -282,18 +275,12 @@ void
 fmtstr(char *outbuf, int length, const char *fmt, ...)
 {
        va_list ap;
-       struct output strout;
 
-       strout.nextc = outbuf;
-       strout.nleft = length;
-       strout.fd = BLOCK_OUT;
-       strout.flags = 0;
+       INTOFF;
        va_start(ap, fmt);
-       doformat(&strout, fmt, ap);
+       vsnprintf(outbuf, length, fmt, ap);
        va_end(ap);
-       outc('\0', &strout);
-       if (strout.flags & OUTPUT_ERR)
-               outbuf[length - 1] = '\0';
+       INTON;
 }
 
 static int
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to