fix failure of getdelim to set stream orientation on error
authorRich Felker <dalias@aerifal.cx>
Sun, 16 Sep 2018 12:40:46 +0000 (08:40 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 16 Sep 2018 12:46:26 +0000 (08:46 -0400)
if EINVAL or ENOMEM happened before the first getc_unlocked, it was
possible that the stream orientation had not yet been set.

src/stdio/getdelim.c

index 26a5678..60c6cc1 100644 (file)
@@ -15,6 +15,7 @@ ssize_t getdelim(char **restrict s, size_t *restrict n, int delim, FILE *restric
        FLOCK(f);
 
        if (!n || !s) {
+               f->mode |= f->mode-1;
                f->flags |= F_ERR;
                FUNLOCK(f);
                errno = EINVAL;
@@ -58,6 +59,7 @@ ssize_t getdelim(char **restrict s, size_t *restrict n, int delim, FILE *restric
 
        return i;
 oom:
+       f->mode |= f->mode-1;
        f->flags |= F_ERR;
        FUNLOCK(f);
        errno = ENOMEM;