summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPino Toscano <toscano.pino@tiscali.it>2012-11-20 00:49:11 +0100
committerPino Toscano <toscano.pino@tiscali.it>2012-11-20 00:49:11 +0100
commit986cab95e068f79e752fc11e981de8e472c23961 (patch)
tree5985d6c8709a42aa6fb246a19fd9650ccd627a9f
parent6d33cc9d9bde501e0906c42ee396d42cb4ca603c (diff)
downloadglibc-986cab95e068f79e752fc11e981de8e472c23961.tar.gz
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--ChangeLog8
-rw-r--r--sysdeps/mach/hurd/ptsname.c18
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;