mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-23 03:10:05 +00:00
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:
parent
6d33cc9d9b
commit
986cab95e0
@ -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.
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user