diff options
author | Andreas Schwab <schwab@suse.de> | 2022-12-19 12:40:45 +0100 |
---|---|---|
committer | Andreas Schwab <schwab@suse.de> | 2023-01-02 10:58:49 +0100 |
commit | a09183aed7bb8ace211e042b2e6e982bcc004957 (patch) | |
tree | 7b82a3d4952b5623087f7368fddeea81570f4f23 /libio/iogetdelim.c | |
parent | 289b098c9e21e2805e3835f9b5780235ab14a290 (diff) | |
download | glibc-a09183aed7bb8ace211e042b2e6e982bcc004957.zip glibc-a09183aed7bb8ace211e042b2e6e982bcc004957.tar.gz glibc-a09183aed7bb8ace211e042b2e6e982bcc004957.tar.bz2 |
getdelim: ensure error indicator is set on error (bug 29917)
POSIX requires that getdelim and getline set the error indicator on the
stream when an error occured, in addition to setting errno.
Diffstat (limited to 'libio/iogetdelim.c')
-rw-r--r-- | libio/iogetdelim.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/libio/iogetdelim.c b/libio/iogetdelim.c index b6c4c07..591526e 100644 --- a/libio/iogetdelim.c +++ b/libio/iogetdelim.c @@ -43,11 +43,6 @@ __getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) ssize_t cur_len = 0; ssize_t len; - if (lineptr == NULL || n == NULL) - { - __set_errno (EINVAL); - return -1; - } CHECK_FILE (fp, -1); _IO_acquire_lock (fp); if (_IO_ferror_unlocked (fp)) @@ -56,12 +51,21 @@ __getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) goto unlock_return; } + if (lineptr == NULL || n == NULL) + { + __set_errno (EINVAL); + fseterr_unlocked (fp); + result = -1; + goto unlock_return; + } + if (*lineptr == NULL || *n == 0) { *n = 120; *lineptr = (char *) malloc (*n); if (*lineptr == NULL) { + fseterr_unlocked (fp); result = -1; goto unlock_return; } @@ -88,6 +92,7 @@ __getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) if (__glibc_unlikely (len >= SSIZE_MAX - cur_len)) { __set_errno (EOVERFLOW); + fseterr_unlocked (fp); result = -1; goto unlock_return; } @@ -102,6 +107,7 @@ __getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) new_lineptr = (char *) realloc (*lineptr, needed); if (new_lineptr == NULL) { + fseterr_unlocked (fp); result = -1; goto unlock_return; } |