diff options
Diffstat (limited to 'sysdeps/unix')
-rw-r--r-- | sysdeps/unix/grantpt.c | 8 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/grantpt.c | 29 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/clone.S | 2 |
3 files changed, 28 insertions, 11 deletions
diff --git a/sysdeps/unix/grantpt.c b/sysdeps/unix/grantpt.c index f86e07c242..dad7d16b43 100644 --- a/sysdeps/unix/grantpt.c +++ b/sysdeps/unix/grantpt.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1998. @@ -64,9 +64,9 @@ pts_name (int fd, char **pts, size_t buf_len) if (buf != *pts) /* We've already malloced another buffer at least once. */ - new_buf = realloc (buf, buf_len); + new_buf = (char *) realloc (buf, buf_len); else - new_buf = malloc (buf_len); + new_buf = (char *) malloc (buf_len); if (! new_buf) { rv = -1; @@ -159,7 +159,7 @@ grantpt (int fd) struct rlimit rl = { 0, 0 }; __setrlimit (RLIMIT_CORE, &rl); - /* We pase the master pseudo terminal as file descriptor PTY_FILENO. */ + /* We pass the master pseudo terminal as file descriptor PTY_FILENO. */ if (fd != PTY_FILENO) if (__dup2 (fd, PTY_FILENO) < 0) _exit (FAIL_EBADF); diff --git a/sysdeps/unix/sysv/linux/grantpt.c b/sysdeps/unix/sysv/linux/grantpt.c index 55e4f36c32..168081758f 100644 --- a/sysdeps/unix/sysv/linux/grantpt.c +++ b/sysdeps/unix/sysv/linux/grantpt.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,6 +16,8 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include <errno.h> +#include <fcntl.h> #include <limits.h> #include <stdlib.h> #include <sys/statfs.h> @@ -25,7 +27,7 @@ /* Prototype for function that changes ownership and access permission for slave pseudo terminals that do not live on a `devpts' filesystem. */ -int __unix_grantpt (int fd); +static int __unix_grantpt (int fd); /* Prototype for private function that gets the name of the slave pseudo terminal in a safe way. */ @@ -45,9 +47,24 @@ grantpt (int fd) #endif char *buf = _buf; - if (pts_name (fd, &buf, sizeof (_buf))) - return -1; - + if (__builtin_expect (pts_name (fd, &buf, sizeof (_buf)), 0)) + { + int save_errno = errno; + + /* Check, if the file descriptor is valid. pts_name returns the + wrong errno number, so we cannot use that. */ + if (__libc_fcntl (fd, F_GETFD) == -1 && errno == EBADF) + return -1; + + __set_errno (save_errno); + + /* If the filedescriptor is no TTY, grantpt has to set errno + to EINVAL. */ + if (errno == ENOTTY) + __set_errno (EINVAL); + return -1; + } + if (__statfs (buf, &fsbuf) < 0) return -1; @@ -59,5 +76,5 @@ grantpt (int fd) return __unix_grantpt (fd); } -#define grantpt __unix_grantpt +#define grantpt static __unix_grantpt #include <sysdeps/unix/grantpt.c> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S index 957a928f36..a7c248b2e8 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S @@ -40,7 +40,7 @@ __clone: mov %i3, %l3 /* save arg */ /* Do the system call */ - mov %i1, %o1 + sub %i1, 0x7ff, %o1 mov %i2, %o0 set __NR_clone, %g1 ta 0x6d |