prevent CNAME/PTR parsing from reading data past the response end
[musl] / src / stdio / __fdopen.c
index a2ca62b..116e78e 100644 (file)
@@ -1,15 +1,15 @@
 #include "stdio_impl.h"
 #include <stdlib.h>
-#include <termios.h>
 #include <sys/ioctl.h>
 #include <fcntl.h>
 #include <errno.h>
 #include <string.h>
+#include "libc.h"
 
 FILE *__fdopen(int fd, const char *mode)
 {
        FILE *f;
-       struct termios tio;
+       struct winsize wsz;
 
        /* Check for valid initial mode character */
        if (!strchr("rwa", *mode)) {
@@ -32,7 +32,8 @@ FILE *__fdopen(int fd, const char *mode)
        /* Set append mode on fd if opened for append */
        if (*mode == 'a') {
                int flags = __syscall(SYS_fcntl, fd, F_GETFL);
-               __syscall(SYS_fcntl, fd, F_SETFL, flags | O_APPEND);
+               if (!(flags & O_APPEND))
+                       __syscall(SYS_fcntl, fd, F_SETFL, flags | O_APPEND);
                f->flags |= F_APP;
        }
 
@@ -42,7 +43,7 @@ FILE *__fdopen(int fd, const char *mode)
 
        /* Activate line buffered mode for terminals */
        f->lbf = EOF;
-       if (!(f->flags & F_NOWR) && !__syscall(SYS_ioctl, fd, TCGETS, &tio))
+       if (!(f->flags & F_NOWR) && !__syscall(SYS_ioctl, fd, TIOCGWINSZ, &wsz))
                f->lbf = '\n';
 
        /* Initialize op ptrs. No problem if some are unneeded. */
@@ -54,13 +55,7 @@ FILE *__fdopen(int fd, const char *mode)
        if (!libc.threaded) f->lock = -1;
 
        /* Add new FILE to open file list */
-       OFLLOCK();
-       f->next = libc.ofl_head;
-       if (libc.ofl_head) libc.ofl_head->prev = f;
-       libc.ofl_head = f;
-       OFLUNLOCK();
-
-       return f;
+       return __ofl_add(f);
 }
 
 weak_alias(__fdopen, fdopen);