]> git.ipfire.org Git - thirdparty/glibc.git/blame - libio/iogets.c
malloc: set NON_MAIN_ARENA flag for reclaimed memalign chunk (BZ #30101)
[thirdparty/glibc.git] / libio / iogets.c
CommitLineData
6d7e8eda 1/* Copyright (C) 1993-2023 Free Software Foundation, Inc.
41bdb6e2 2 This file is part of the GNU C Library.
96aa2d94 3
41bdb6e2
AJ
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
96aa2d94 8
41bdb6e2
AJ
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
40a55d20 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 12 Lesser General Public License for more details.
96aa2d94 13
41bdb6e2 14 You should have received a copy of the GNU Lesser General Public
59ba27a6 15 License along with the GNU C Library; if not, see
5a82c748 16 <https://www.gnu.org/licenses/>.
96aa2d94 17
41bdb6e2
AJ
18 As a special exception, if you link the code in this file with
19 files compiled with a GNU compiler to produce an executable,
20 that does not cause the resulting executable to be covered by
21 the GNU Lesser General Public License. This exception does not
22 however invalidate any other reasons why the executable file
23 might be covered by the GNU Lesser General Public License.
24 This exception applies to code released by its copyright holders
25 in files containing the exception. */
96aa2d94
RM
26
27#include "libioP.h"
28#include <limits.h>
29
9d46370c
JM
30char *
31_IO_gets (char *buf)
96aa2d94 32{
9964a145 33 size_t count;
7c713e28 34 int ch;
8a4b65b4 35 char *retval;
7c713e28 36
ee9941f9
FW
37 _IO_acquire_lock (stdin);
38 ch = _IO_getc_unlocked (stdin);
96aa2d94 39 if (ch == EOF)
8a4b65b4
UD
40 {
41 retval = NULL;
42 goto unlock_return;
43 }
96aa2d94
RM
44 if (ch == '\n')
45 count = 0;
46 else
47 {
bd355af0
UD
48 /* This is very tricky since a file descriptor may be in the
49 non-blocking mode. The error flag doesn't mean much in this
50 case. We return an error only when there is a new error. */
ee9941f9
FW
51 int old_error = stdin->_flags & _IO_ERR_SEEN;
52 stdin->_flags &= ~_IO_ERR_SEEN;
40a55d20 53 buf[0] = (char) ch;
ee9941f9
FW
54 count = _IO_getline (stdin, buf + 1, INT_MAX, '\n', 0) + 1;
55 if (stdin->_flags & _IO_ERR_SEEN)
8a4b65b4
UD
56 {
57 retval = NULL;
58 goto unlock_return;
59 }
bd355af0 60 else
ee9941f9 61 stdin->_flags |= old_error;
96aa2d94
RM
62 }
63 buf[count] = 0;
8a4b65b4
UD
64 retval = buf;
65unlock_return:
ee9941f9 66 _IO_release_lock (stdin);
8a4b65b4 67 return retval;
96aa2d94
RM
68}
69
70weak_alias (_IO_gets, gets)
d41c6f61
UD
71
72link_warning (gets, "the `gets' function is dangerous and should not be used.")