commit e22b6bcefd83056bc346d8bb75e98c4699a173cd
parent aa05a2bbe90ece29f332346380f61a96cb286913
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date: Mon, 5 Nov 2018 17:17:01 +0000
Merge "[libc] Fix setvbuf()"
Diffstat:
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/src/libc/stdio/setvbuf.c b/src/libc/stdio/setvbuf.c
@@ -20,13 +20,6 @@ setvbuf(FILE * restrict fp, char * restrict buf, int mode, size_t size)
break;
case _IOLBF:
case _IOFBF:
- if (size == 0) {
- if ((buf = malloc(BUFSIZ)) == NULL) {
- errno = ENOMEM;
- return EOF;
- }
- size = BUFSIZ;
- }
break;
default:
errno = EINVAL;
@@ -34,13 +27,16 @@ setvbuf(FILE * restrict fp, char * restrict buf, int mode, size_t size)
}
flags = fp->flags;
- if (flags & _IOALLOC)
+ if (buf && (flags & _IOALLOC)) {
free(fp->buf);
- flags &= ~(_IONBF | _IOLBF | _IOFBF | _IOALLOC | _IOALLOC);
+ fp->buf = buf;
+ fp->len = size;
+ flags &= ~_IOALLOC;
+ }
+
+ flags &= ~(_IONBF | _IOLBF | _IOFBF);
flags |= mode;
fp->flags = flags;
- fp->buf = buf;
- fp->len = size;
return 0;
}