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
This commit is contained in:
Pino Toscano 2012-11-20 00:49:11 +01:00
parent 6d33cc9d9b
commit 986cab95e0
2 changed files with 17 additions and 9 deletions

View File

@ -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> 2012-11-19 David S. Miller <davem@davemloft.net>
With help from Joseph Myers. With help from Joseph Myers.

View File

@ -1,5 +1,5 @@
/* ptsname -- return the name of a pty slave given an FD to the pty master /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -29,12 +29,10 @@
char * char *
ptsname (int fd) ptsname (int fd)
{ {
static char peername[1024]; /* XXX */ static string_t peername;
error_t err; error_t err;
err = __ptsname_r (fd, peername, sizeof (peername)); err = __ptsname_r (fd, peername, sizeof (peername));
if (err)
__set_errno (err);
return err ? NULL : peername; return err ? NULL : peername;
} }
@ -46,17 +44,19 @@ ptsname (int fd)
int int
__ptsname_r (int fd, char *buf, size_t buflen) __ptsname_r (int fd, char *buf, size_t buflen)
{ {
char peername[1024]; /* XXX */ string_t peername;
size_t len; size_t len;
error_t err; error_t err;
peername[0] = '\0';
if (err = HURD_DPORT_USE (fd, __term_get_peername (port, peername))) 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) if (len > buflen)
return ERANGE; {
errno = ERANGE;
return ERANGE;
}
memcpy (buf, peername, len); memcpy (buf, peername, len);
return 0; return 0;