Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 11 Dec 2010 17:47:28 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r216380 - head/bin/sh
Message-ID:  <201012111747.oBBHlSJw013722@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201012111747.oBBHlSJw013722>