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)); }