Module Name:    src
Committed By:   joerg
Date:           Mon Jan 11 20:39:29 UTC 2010

Modified Files:
        src/include: stdio.h
        src/lib/libc/stdio: fclose.c fgetstr.c fgetwln.c fileext.h findfp.c
            freopen.c local.h sscanf.c vsscanf.c vswscanf.c

Log Message:
Use a proper char */size_t pair in __sfileext to keep track of the line
buffer for fgetln and fgetwln. Simplifies code by dropping the INT_MAX
related logic. Drop conditionals around FREELB, free(NULL) is valid.


To generate a diff of this commit:
cvs rdiff -u -r1.74 -r1.75 src/include/stdio.h
cvs rdiff -u -r1.16 -r1.17 src/lib/libc/stdio/fclose.c \
    src/lib/libc/stdio/sscanf.c
cvs rdiff -u -r1.10 -r1.11 src/lib/libc/stdio/fgetstr.c
cvs rdiff -u -r1.3 -r1.4 src/lib/libc/stdio/fgetwln.c
cvs rdiff -u -r1.5 -r1.6 src/lib/libc/stdio/fileext.h \
    src/lib/libc/stdio/vswscanf.c
cvs rdiff -u -r1.23 -r1.24 src/lib/libc/stdio/findfp.c \
    src/lib/libc/stdio/local.h
cvs rdiff -u -r1.15 -r1.16 src/lib/libc/stdio/freopen.c
cvs rdiff -u -r1.14 -r1.15 src/lib/libc/stdio/vsscanf.c

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

Modified files:

Index: src/include/stdio.h
diff -u src/include/stdio.h:1.74 src/include/stdio.h:1.75
--- src/include/stdio.h:1.74	Mon Jul 13 22:19:24 2009
+++ src/include/stdio.h	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: stdio.h,v 1.74 2009/07/13 22:19:24 roy Exp $	*/
+/*	$NetBSD: stdio.h,v 1.75 2010/01/11 20:39:29 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -133,8 +133,8 @@
 	unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
 	unsigned char _nbuf[1];	/* guarantee a getc() buffer */
 
-	/* separate buffer for fgetln() when line crosses buffer boundary */
-	struct	__sbuf _lb;	/* buffer for fgetln() */
+	/* Formerly used by fgetln/fgetwln; kept for binary compatibility */
+	struct	__sbuf _lb__unused;
 
 	/* Unix stdio files get aligned to block boundaries on fseek() */
 	int	_blksize;	/* stat.st_blksize (may be != _bf._size) */

Index: src/lib/libc/stdio/fclose.c
diff -u src/lib/libc/stdio/fclose.c:1.16 src/lib/libc/stdio/fclose.c:1.17
--- src/lib/libc/stdio/fclose.c:1.16	Thu Aug  7 16:43:22 2003
+++ src/lib/libc/stdio/fclose.c	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: fclose.c,v 1.16 2003/08/07 16:43:22 agc Exp $	*/
+/*	$NetBSD: fclose.c,v 1.17 2010/01/11 20:39:29 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)fclose.c	8.1 (Berkeley) 6/4/93";
 #endif
-__RCSID("$NetBSD: fclose.c,v 1.16 2003/08/07 16:43:22 agc Exp $");
+__RCSID("$NetBSD: fclose.c,v 1.17 2010/01/11 20:39:29 joerg Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #include <assert.h>
@@ -69,8 +69,7 @@
 		free((char *)fp->_bf._base);
 	if (HASUB(fp))
 		FREEUB(fp);
-	if (HASLB(fp))
-		FREELB(fp);
+	FREELB(fp);
 	FUNLOCKFILE(fp);
 	fp->_file = -1;
 	fp->_flags = 0;		/* Release this FILE for reuse. */
Index: src/lib/libc/stdio/sscanf.c
diff -u src/lib/libc/stdio/sscanf.c:1.16 src/lib/libc/stdio/sscanf.c:1.17
--- src/lib/libc/stdio/sscanf.c:1.16	Tue Nov 29 03:12:00 2005
+++ src/lib/libc/stdio/sscanf.c	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: sscanf.c,v 1.16 2005/11/29 03:12:00 christos Exp $	*/
+/*	$NetBSD: sscanf.c,v 1.17 2010/01/11 20:39:29 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)sscanf.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: sscanf.c,v 1.16 2005/11/29 03:12:00 christos Exp $");
+__RCSID("$NetBSD: sscanf.c,v 1.17 2010/01/11 20:39:29 joerg Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -80,7 +80,6 @@
 	f._bf._size = f._r = strlen(str);
 	f._read = eofread;
 	_UB(&f)._base = NULL;
-	f._lb._base = NULL;
 	va_start(ap, fmt);
 	ret = __svfscanf_unlocked(&f, fmt, ap);
 	va_end(ap);

Index: src/lib/libc/stdio/fgetstr.c
diff -u src/lib/libc/stdio/fgetstr.c:1.10 src/lib/libc/stdio/fgetstr.c:1.11
--- src/lib/libc/stdio/fgetstr.c:1.10	Wed Dec  2 09:03:13 2009
+++ src/lib/libc/stdio/fgetstr.c	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: fgetstr.c,v 1.10 2009/12/02 09:03:13 roy Exp $	*/
+/* $NetBSD: fgetstr.c,v 1.11 2010/01/11 20:39:29 joerg Exp $	*/
 
 /*
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: fgetstr.c,v 1.10 2009/12/02 09:03:13 roy Exp $");
+__RCSID("$NetBSD: fgetstr.c,v 1.11 2010/01/11 20:39:29 joerg Exp $");
 
 #include "namespace.h"
 
@@ -49,24 +49,12 @@
 char *
 __fgetstr(FILE *__restrict fp, size_t *__restrict lenp, int sep)
 {
-	char *p;
-	size_t size;
 	ssize_t n;
 
 	_DIAGASSERT(fp != NULL);
 	_DIAGASSERT(lenp != NULL);
 
-	p = (char *)fp->_lb._base;
-	size = fp->_lb._size;
-	n = __getdelim(&p, &size, sep, fp);
-	fp->_lb._base = (unsigned char *)p;
-	/* The struct size variable is only an int .....
-	 * This still works when exceeded, but the buffer could be
-	 * realloced needlessly. */
-	if (size > INT_MAX)
-		fp->_lb._size = INT_MAX;
-	else
-		fp->_lb._size = (int)size;
+	n = __getdelim(&_EXT(fp)->_fgetstr_buf, &_EXT(fp)->_fgetstr_len, sep, fp);
 	if (n == -1) {
 		*lenp = 0;
 		if (__sferror(fp) && errno == EOVERFLOW) /* fixup errno */
@@ -74,5 +62,5 @@
 		return NULL;
 	}
 	*lenp = n;
-	return p;
+	return _EXT(fp)->_fgetstr_buf;
 }

Index: src/lib/libc/stdio/fgetwln.c
diff -u src/lib/libc/stdio/fgetwln.c:1.3 src/lib/libc/stdio/fgetwln.c:1.4
--- src/lib/libc/stdio/fgetwln.c:1.3	Thu Sep 24 20:38:53 2009
+++ src/lib/libc/stdio/fgetwln.c	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: fgetwln.c,v 1.3 2009/09/24 20:38:53 roy Exp $	*/
+/*	$NetBSD: fgetwln.c,v 1.4 2010/01/11 20:39:29 joerg Exp $	*/
 
 /*-
  * Copyright (c) 2002-2004 Tim J. Robbins.
@@ -31,7 +31,7 @@
 #if 0
 __FBSDID("$FreeBSD: src/lib/libc/stdio/fgetwln.c,v 1.2 2004/08/06 17:00:09 tjr Exp $");
 #else
-__RCSID("$NetBSD: fgetwln.c,v 1.3 2009/09/24 20:38:53 roy Exp $");
+__RCSID("$NetBSD: fgetwln.c,v 1.4 2010/01/11 20:39:29 joerg Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -66,17 +66,12 @@
 #endif
 	_DIAGASSERT(fp != NULL);
 
-	/* fp->_lb._size is an int ..... */
-	if (newsize > INT_MAX) {
-		errno = EOVERFLOW;
-		return (-1);
-	}
-	if ((size_t)fp->_lb._size >= newsize)
+	if (_EXT(fp)->_fgetstr_len >= newsize)
 		return (0);
-	if ((p = realloc(fp->_lb._base, newsize)) == NULL)
+	if ((p = realloc(_EXT(fp)->_fgetstr_buf, newsize)) == NULL)
 		return (-1);
-	fp->_lb._base = p;
-	fp->_lb._size = newsize;
+	_EXT(fp)->_fgetstr_buf = p;
+	_EXT(fp)->_fgetstr_len = newsize;
 	return (0);
 }
 
@@ -92,10 +87,10 @@
 	len = 0;
 	while ((wc = __fgetwc_unlock(fp)) != WEOF) {
 #define	GROW	512
-		if (len * sizeof(wchar_t) >= (size_t)fp->_lb._size &&
+		if (len * sizeof(wchar_t) >= _EXT(fp)->_fgetstr_len &&
 		    __slbexpand(fp, (len + GROW) * sizeof(wchar_t)))
 			goto error;
-		*((wchar_t *)(void *)fp->_lb._base + len++) = wc;
+		*((wchar_t *)(void *)_EXT(fp)->_fgetstr_buf + len++) = wc;
 		if (wc == L'\n')
 			break;
 	}
@@ -104,7 +99,7 @@
 
 	FUNLOCKFILE(fp);
 	*lenp = len;
-	return ((wchar_t *)(void *)fp->_lb._base);
+	return ((wchar_t *)(void *)_EXT(fp)->_fgetstr_buf);
 
 error:
 	FUNLOCKFILE(fp);

Index: src/lib/libc/stdio/fileext.h
diff -u src/lib/libc/stdio/fileext.h:1.5 src/lib/libc/stdio/fileext.h:1.6
--- src/lib/libc/stdio/fileext.h:1.5	Fri Jul 18 21:46:41 2003
+++ src/lib/libc/stdio/fileext.h	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: fileext.h,v 1.5 2003/07/18 21:46:41 nathanw Exp $ */
+/* $NetBSD: fileext.h,v 1.6 2010/01/11 20:39:29 joerg Exp $ */
 
 /*-
  * Copyright (c)2001 Citrus Project,
@@ -34,6 +34,8 @@
 struct __sfileext {
 	struct	__sbuf _ub; /* ungetc buffer */
 	struct wchar_io_data _wcio;	/* wide char i/o status */
+	size_t _fgetstr_len;
+	char *_fgetstr_buf;
 #ifdef _REENTRANT
 	mutex_t	_lock;	/* Lock for FLOCKFILE/FUNLOCKFILE */
 	cond_t _lockcond; /* Condition variable for signalling lock releases */
@@ -55,12 +57,18 @@
 #define _LOCKCANCELSTATE(fp) (_EXT(fp)->_lockcancelstate)
 #define _FILEEXT_SETUP(f, fext) do { \
 	/* LINTED */(f)->_ext._base = (unsigned char *)(fext); \
+	(fext)->_fgetstr_len = 0; \
+	(fext)->_fgetstr_buf = NULL; \
 	mutex_init(&_LOCK(f), NULL); \
 	cond_init(&_LOCKCOND(f), 0, NULL); \
 	_LOCKOWNER(f) = NULL; \
 	_LOCKCOUNT(f) = 0; \
 	_LOCKINTERNAL(f) = 0; \
-	} while (/* LINTED */ 0)
+	} while (/* CONSTCOND */ 0)
 #else
-#define _FILEEXT_SETUP(f, fext) /* LINTED */(f)->_ext._base = (unsigned char *)(fext)
+#define _FILEEXT_SETUP(f, fext) do { \
+	/* LINTED */(f)->_ext._base = (unsigned char *)(fext); \
+	(fext)->_fgetstr_len = 0; \
+	(fext)->_fgetstr_buf = NULL; \
+	} while (/* CONSTCOND */ 0)
 #endif
Index: src/lib/libc/stdio/vswscanf.c
diff -u src/lib/libc/stdio/vswscanf.c:1.5 src/lib/libc/stdio/vswscanf.c:1.6
--- src/lib/libc/stdio/vswscanf.c:1.5	Sun Jan 11 02:46:30 2009
+++ src/lib/libc/stdio/vswscanf.c	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vswscanf.c,v 1.5 2009/01/11 02:46:30 christos Exp $	*/
+/*	$NetBSD: vswscanf.c,v 1.6 2010/01/11 20:39:29 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -42,7 +42,7 @@
 static char sccsid[] = "@(#)vsscanf.c	8.1 (Berkeley) 6/4/93";
 __FBSDID("$FreeBSD: src/lib/libc/stdio/vswscanf.c,v 1.3 2004/04/07 09:55:05 tjr Exp $");
 #else
-__RCSID("$NetBSD: vswscanf.c,v 1.5 2009/01/11 02:46:30 christos Exp $");
+__RCSID("$NetBSD: vswscanf.c,v 1.6 2010/01/11 20:39:29 joerg Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -97,7 +97,6 @@
 	f._bf._size = f._r = mlen;
 	f._read = eofread;
 	_UB(&f)._base = NULL;
-	f._lb._base = NULL;
 	r = __vfwscanf_unlocked(&f, fmt, ap);
 	free(mbstr);
 

Index: src/lib/libc/stdio/findfp.c
diff -u src/lib/libc/stdio/findfp.c:1.23 src/lib/libc/stdio/findfp.c:1.24
--- src/lib/libc/stdio/findfp.c:1.23	Sat Oct  7 21:40:46 2006
+++ src/lib/libc/stdio/findfp.c	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: findfp.c,v 1.23 2006/10/07 21:40:46 thorpej Exp $	*/
+/*	$NetBSD: findfp.c,v 1.24 2010/01/11 20:39:29 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)findfp.c	8.2 (Berkeley) 1/4/94";
 #else
-__RCSID("$NetBSD: findfp.c,v 1.23 2006/10/07 21:40:46 thorpej Exp $");
+__RCSID("$NetBSD: findfp.c,v 1.24 2010/01/11 20:39:29 joerg Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -154,8 +154,6 @@
 /*	fp->_cookie = <any>; */	/* caller sets cookie, _read/_write etc */
 	_UB(fp)._base = NULL;	/* no ungetc buffer */
 	_UB(fp)._size = 0;
-	fp->_lb._base = NULL;	/* no line buffer */
-	fp->_lb._size = 0;
 	memset(WCIO_GET(fp), 0, sizeof(struct wchar_io_data));
 	rwlock_unlock(&__sfp_lock);
 	return (fp);
Index: src/lib/libc/stdio/local.h
diff -u src/lib/libc/stdio/local.h:1.23 src/lib/libc/stdio/local.h:1.24
--- src/lib/libc/stdio/local.h:1.23	Wed Dec  2 09:03:13 2009
+++ src/lib/libc/stdio/local.h	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: local.h,v 1.23 2009/12/02 09:03:13 roy Exp $	*/
+/*	$NetBSD: local.h,v 1.24 2010/01/11 20:39:29 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -104,10 +104,10 @@
 /*
  * test for an fgetln() buffer.
  */
-#define	HASLB(fp) ((fp)->_lb._base != NULL)
 #define	FREELB(fp) { \
-	free((char *)(fp)->_lb._base); \
-	(fp)->_lb._base = NULL; \
+	free(_EXT(fp)->_fgetstr_buf); \
+	_EXT(fp)->_fgetstr_buf = NULL; \
+	_EXT(fp)->_fgetstr_len = 0; \
 }
 
 extern void __flockfile_internal __P((FILE *, int));

Index: src/lib/libc/stdio/freopen.c
diff -u src/lib/libc/stdio/freopen.c:1.15 src/lib/libc/stdio/freopen.c:1.16
--- src/lib/libc/stdio/freopen.c:1.15	Thu Mar 13 15:40:00 2008
+++ src/lib/libc/stdio/freopen.c	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: freopen.c,v 1.15 2008/03/13 15:40:00 christos Exp $	*/
+/*	$NetBSD: freopen.c,v 1.16 2010/01/11 20:39:29 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)freopen.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: freopen.c,v 1.15 2008/03/13 15:40:00 christos Exp $");
+__RCSID("$NetBSD: freopen.c,v 1.16 2010/01/11 20:39:29 joerg Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -135,9 +135,7 @@
 		FREEUB(fp);
 	WCIO_FREE(fp);
 	_UB(fp)._size = 0;
-	if (HASLB(fp))
-		FREELB(fp);
-	fp->_lb._size = 0;
+	FREELB(fp);
 
 	if (f < 0) {			/* did not get it after all */
 		fp->_flags = 0;		/* set it free */

Index: src/lib/libc/stdio/vsscanf.c
diff -u src/lib/libc/stdio/vsscanf.c:1.14 src/lib/libc/stdio/vsscanf.c:1.15
--- src/lib/libc/stdio/vsscanf.c:1.14	Tue Nov 29 03:12:00 2005
+++ src/lib/libc/stdio/vsscanf.c	Mon Jan 11 20:39:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vsscanf.c,v 1.14 2005/11/29 03:12:00 christos Exp $	*/
+/*	$NetBSD: vsscanf.c,v 1.15 2010/01/11 20:39:29 joerg Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)vsscanf.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: vsscanf.c,v 1.14 2005/11/29 03:12:00 christos Exp $");
+__RCSID("$NetBSD: vsscanf.c,v 1.15 2010/01/11 20:39:29 joerg Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -78,6 +78,5 @@
 	f._bf._size = f._r = strlen(str);
 	f._read = eofread;
 	_UB(&f)._base = NULL;
-	f._lb._base = NULL;
 	return (__svfscanf_unlocked(&f, fmt, ap));
 }

Reply via email to