Subject: Re: port-xen/29887: sysctl kern.consdev coredumps
To: None <gnats-bugs@netbsd.org, port-xen-maintainer@netbsd.org,>
From: Christos Zoulas <christos@zoulas.com>
List: netbsd-bugs
Date: 04/07/2005 10:48:35
On Apr 7,  1:07pm, atatat@atatdot.net (Andrew Brown) wrote:
-- Subject: Re: port-xen/29887: sysctl kern.consdev coredumps


I would say that the proper fix is to make puts(NULL), and fputs(fp, NULL)
behave like printf("%s\n", NULL) and fprintf(fp, "%s", NULL) respectively:

Index: fputs.c
===================================================================
RCS file: /cvsroot/src/lib/libc/stdio/fputs.c,v
retrieving revision 1.13
diff -u -u -r1.13 fputs.c
--- fputs.c	7 Aug 2003 16:43:24 -0000	1.13
+++ fputs.c	7 Apr 2005 14:47:13 -0000
@@ -61,11 +61,11 @@
 	struct __siov iov;
 	int r;
 
-	_DIAGASSERT(s != NULL);
 	_DIAGASSERT(fp != NULL);
+	if (s == NULL)
+		s = "(null)";
 
-	/* LINTED we don't touch s */
-	iov.iov_base = (void *)s;
+	iov.iov_base = __UNCONST(s);
 	iov.iov_len = uio.uio_resid = strlen(s);
 	uio.uio_iov = &iov;
 	uio.uio_iovcnt = 1;
Index: puts.c
===================================================================
RCS file: /cvsroot/src/lib/libc/stdio/puts.c,v
retrieving revision 1.12
diff -u -u -r1.12 puts.c
--- puts.c	7 Aug 2003 16:43:29 -0000	1.12
+++ puts.c	7 Apr 2005 14:47:13 -0000
@@ -56,16 +56,15 @@
 puts(s)
 	char const *s;
 {
-	size_t c = strlen(s);
+	size_t c;
 	struct __suio uio;
 	struct __siov iov[2];
 	int r;
 
-	_DIAGASSERT(s != NULL);
-
-	/* LINTED we don't touch the string */
-	iov[0].iov_base = (void *)s;
-	iov[0].iov_len = c;
+	if (s == NULL)
+		s = "(null)";
+	iov[0].iov_base = __UNCONST(s);
+	iov[0].iov_len = c = strlen(s);
 	iov[1].iov_base = "\n";
 	iov[1].iov_len = 1;
 	uio.uio_resid = c + 1;