fix undefined behavior in getdelim via null pointer arithmetic and memcpy
[musl] / src / misc / pty.c
index 6ca33e3..a057714 100644 (file)
@@ -2,11 +2,14 @@
 #include <sys/ioctl.h>
 #include <stdio.h>
 #include <fcntl.h>
-#include "libc.h"
+#include <errno.h>
+#include "syscall.h"
 
 int posix_openpt(int flags)
 {
-       return open("/dev/ptmx", flags);
+       int r = open("/dev/ptmx", flags);
+       if (r < 0 && errno == ENOSPC) errno = EAGAIN;
+       return r;
 }
 
 int grantpt(int fd)
@@ -22,10 +25,11 @@ int unlockpt(int fd)
 
 int __ptsname_r(int fd, char *buf, size_t len)
 {
-       int pty;
+       int pty, err;
        if (!buf) len = 0;
-       return -( ioctl (fd, TIOCGPTN, &pty) < 0
-               || snprintf(buf, len, "/dev/pts/%d", pty) >= len );
+       if ((err = __syscall(SYS_ioctl, fd, TIOCGPTN, &pty))) return -err;
+       if (snprintf(buf, len, "/dev/pts/%d", pty) >= len) return ERANGE;
+       return 0;
 }
 
 weak_alias(__ptsname_r, ptsname_r);