Module Name:    src
Committed By:   dsl
Date:           Sat Oct 24 14:50:48 UTC 2009

Modified Files:
        src/lib/libc/stdio: fgets.c

Log Message:
Check for EOF before erroring fgets() with length <= 0.
If length is invalid, set errno = EINVAL and __SERR as well returning NULL.
Should let me close PR/41992.


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/lib/libc/stdio/fgets.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/stdio/fgets.c
diff -u src/lib/libc/stdio/fgets.c:1.23 src/lib/libc/stdio/fgets.c:1.24
--- src/lib/libc/stdio/fgets.c:1.23	Wed Oct 14 21:25:52 2009
+++ src/lib/libc/stdio/fgets.c	Sat Oct 24 14:50:48 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: fgets.c,v 1.23 2009/10/14 21:25:52 dsl Exp $	*/
+/*	$NetBSD: fgets.c,v 1.24 2009/10/24 14:50:48 dsl Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -37,12 +37,13 @@
 #if 0
 static char sccsid[] = "@(#)fgets.c	8.2 (Berkeley) 12/22/93";
 #else
-__RCSID("$NetBSD: fgets.c,v 1.23 2009/10/14 21:25:52 dsl Exp $");
+__RCSID("$NetBSD: fgets.c,v 1.24 2009/10/24 14:50:48 dsl Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
 #include <assert.h>
 #include <stdio.h>
+#include <errno.h>
 #include <string.h>
 #include "reentrant.h"
 #include "local.h"
@@ -61,14 +62,12 @@
 	int n;
 	FILE *fp;
 {
-	size_t len;
+	int len;
 	char *s;
 	unsigned char *p, *t;
 
 	_DIAGASSERT(buf != NULL);
 	_DIAGASSERT(fp != NULL);
-	if (n <= 0)					/* sanity check */
-		return (NULL);
 
 	FLOCKFILE(fp);
 	_SET_ORIENTATION(fp, -1);
@@ -97,11 +96,25 @@
 		 * newline, and stop.  Otherwise, copy entire chunk
 		 * and loop.
 		 */
-		if (len > (size_t)n)
+		if (len > n) {
+			if (n < 0) {
+				/*
+				 * Caller's length <= 0
+				 * We can't write into the buffer, so cannot
+				 * return a string, so must return NULL.
+				 * Set errno and __SERR so it is consistent.
+				 * TOG gives no indication of what to do here!
+				 */
+				errno = EINVAL;
+				fp->_flags |= __SERR;
+				FUNLOCKFILE(fp);
+				return NULL;
+			}
 			len = n;
+		}
 		t = memchr((void *)p, '\n', len);
 		if (t != NULL) {
-			len = ++t - p;
+			len = (int)(++t - p);
 			fp->_r -= len;
 			fp->_p = t;
 			(void)memcpy((void *)s, (void *)p, len);

Reply via email to