diff options
author | Pino Toscano <toscano.pino@tiscali.it> | 2012-11-20 00:49:11 +0100 |
---|---|---|
committer | Pino Toscano <toscano.pino@tiscali.it> | 2012-11-20 00:49:11 +0100 |
commit | 986cab95e068f79e752fc11e981de8e472c23961 (patch) | |
tree | 5985d6c8709a42aa6fb246a19fd9650ccd627a9f | |
parent | 6d33cc9d9bde501e0906c42ee396d42cb4ca603c (diff) | |
download | glibc-986cab95e068f79e752fc11e981de8e472c23961.tar.gz glibc-986cab95e068f79e752fc11e981de8e472c23961.tar.xz glibc-986cab95e068f79e752fc11e981de8e472c23961.zip |
Hurd: fixes for ptsname and ptsname_r
ptsname_r on failure returns the value that is also set as errno; furthermore, add more checks to it: - set errno and return it on __term_get_peername failure - set errno to ERANGE other than returning it - change the type of PEERNAME to string_t, and check its length with __strnlen In ptsname: - change the type of PEERNAME to string_t - do not set errno manually, since ptsname_r has set it already
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | sysdeps/mach/hurd/ptsname.c | 18 |
2 files changed, 17 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog index 7e85f77016..55f5dde525 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2012-11-19 Pino Toscano <toscano.pino@tiscali.it> + + * sysdeps/mach/hurd/ptsname.c (ptsname): Change the type of PEERNAME to + string_t. Do not manually set errno. + (__ptsname_r): Change the type of PEERNAME to string_t, and check its + length with __strnlen. Make sure to both set errno and return it on + failure. + 2012-11-19 David S. Miller <davem@davemloft.net> With help from Joseph Myers. diff --git a/sysdeps/mach/hurd/ptsname.c b/sysdeps/mach/hurd/ptsname.c index 1a32311fd4..c7b52ff7af 100644 --- a/sysdeps/mach/hurd/ptsname.c +++ b/sysdeps/mach/hurd/ptsname.c @@ -1,5 +1,5 @@ /* ptsname -- return the name of a pty slave given an FD to the pty master - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999-2012 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 @@ -29,12 +29,10 @@ char * ptsname (int fd) { - static char peername[1024]; /* XXX */ + static string_t peername; error_t err; err = __ptsname_r (fd, peername, sizeof (peername)); - if (err) - __set_errno (err); return err ? NULL : peername; } @@ -46,17 +44,19 @@ ptsname (int fd) int __ptsname_r (int fd, char *buf, size_t buflen) { - char peername[1024]; /* XXX */ + string_t peername; size_t len; error_t err; - peername[0] = '\0'; if (err = HURD_DPORT_USE (fd, __term_get_peername (port, peername))) - return _hurd_fd_error (fd, err); + return __hurd_dfail (fd, err), errno; - len = strlen (peername) + 1; + len = __strnlen (peername, sizeof peername - 1) + 1; if (len > buflen) - return ERANGE; + { + errno = ERANGE; + return ERANGE; + } memcpy (buf, peername, len); return 0; |