Mon Aug 22 06:11:39 2016 UTC ()
From OpenBSD:
bugfix: when fgetwc(3) fails, fgetwln(3) must fail as well;


(christos)
diff -r1.5 -r1.6 src/lib/libc/stdio/fgetwln.c

cvs diff -r1.5 -r1.6 src/lib/libc/stdio/fgetwln.c (expand / switch to unified diff)

--- src/lib/libc/stdio/fgetwln.c 2012/03/15 18:22:30 1.5
+++ src/lib/libc/stdio/fgetwln.c 2016/08/22 06:11:39 1.6
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: fgetwln.c,v 1.5 2012/03/15 18:22:30 christos Exp $ */ 1/* $NetBSD: fgetwln.c,v 1.6 2016/08/22 06:11:39 christos Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2002-2004 Tim J. Robbins. 4 * Copyright (c) 2002-2004 Tim J. Robbins.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
@@ -21,27 +21,27 @@ @@ -21,27 +21,27 @@
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE. 26 * SUCH DAMAGE.
27 */ 27 */
28 28
29#include <sys/cdefs.h> 29#include <sys/cdefs.h>
30#if defined(LIBC_SCCS) && !defined(lint) 30#if defined(LIBC_SCCS) && !defined(lint)
31#if 0 31#if 0
32__FBSDID("$FreeBSD: src/lib/libc/stdio/fgetwln.c,v 1.2 2004/08/06 17:00:09 tjr Exp $"); 32__FBSDID("$FreeBSD: src/lib/libc/stdio/fgetwln.c,v 1.2 2004/08/06 17:00:09 tjr Exp $");
33#else 33#else
34__RCSID("$NetBSD: fgetwln.c,v 1.5 2012/03/15 18:22:30 christos Exp $"); 34__RCSID("$NetBSD: fgetwln.c,v 1.6 2016/08/22 06:11:39 christos Exp $");
35#endif 35#endif
36#endif /* LIBC_SCCS and not lint */ 36#endif /* LIBC_SCCS and not lint */
37 37
38#include "namespace.h" 38#include "namespace.h"
39#include <assert.h> 39#include <assert.h>
40#include <errno.h> 40#include <errno.h>
41#include <limits.h> 41#include <limits.h>
42#include <stdio.h> 42#include <stdio.h>
43#include <stdlib.h> 43#include <stdlib.h>
44#include <wchar.h> 44#include <wchar.h>
45#include "reentrant.h" 45#include "reentrant.h"
46#include "local.h" 46#include "local.h"
47 47
@@ -84,25 +84,25 @@ fgetwln(FILE * __restrict fp, size_t *le @@ -84,25 +84,25 @@ fgetwln(FILE * __restrict fp, size_t *le
84 FLOCKFILE(fp); 84 FLOCKFILE(fp);
85 _SET_ORIENTATION(fp, 1); 85 _SET_ORIENTATION(fp, 1);
86 86
87 len = 0; 87 len = 0;
88 while ((wc = __fgetwc_unlock(fp)) != WEOF) { 88 while ((wc = __fgetwc_unlock(fp)) != WEOF) {
89#define GROW 512 89#define GROW 512
90 if (len * sizeof(wchar_t) >= _EXT(fp)->_fgetstr_len && 90 if (len * sizeof(wchar_t) >= _EXT(fp)->_fgetstr_len &&
91 __slbexpand(fp, (len + GROW) * sizeof(wchar_t))) 91 __slbexpand(fp, (len + GROW) * sizeof(wchar_t)))
92 goto error; 92 goto error;
93 *((wchar_t *)(void *)_EXT(fp)->_fgetstr_buf + len++) = wc; 93 *((wchar_t *)(void *)_EXT(fp)->_fgetstr_buf + len++) = wc;
94 if (wc == L'\n') 94 if (wc == L'\n')
95 break; 95 break;
96 } 96 }
97 if (len == 0) 97 if (len == 0 || fp->flags & __SERR)
98 goto error; 98 goto error;
99 99
100 FUNLOCKFILE(fp); 100 FUNLOCKFILE(fp);
101 *lenp = len; 101 *lenp = len;
102 return (wchar_t *)(void *)_EXT(fp)->_fgetstr_buf; 102 return (wchar_t *)(void *)_EXT(fp)->_fgetstr_buf;
103 103
104error: 104error:
105 FUNLOCKFILE(fp); 105 FUNLOCKFILE(fp);
106 *lenp = 0; 106 *lenp = 0;
107 return NULL; 107 return NULL;
108} 108}