This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Hi, Alle venerdì 20 luglio 2012, Roland McGrath ha scritto: > > Ok, I see that its `buf' argument is marked nonnull. I added that > > check because I saw the gnulib test for it explicitly checking > > that ptsname_r(fd, NULL, 0) would be properly failing with EINVAL > > (and the man page even explicitly mention that return value, > > unlike with basically most of the other functions). Should gnulib > > do that check only on Linux, then? > > Well, everybody's wrong. The libc manual never said that you can > pass NULL and expect not to crash, and the man page was IMHO wrong > to document it that way. The other implementations never should > have checked for NULL, but they have done so for a long time. > gnulib never should have passed NULL to this function and IMHO it > should be fixed not to do so. But given the history, the least of > avaialble evils is to make the Hurd implementation consistent with > the others and do the check. (few months later... I forgot I sent this patch, so I'm bring it again.) I updated the patch; is it okay to commit, or should I bring back the buf==NULL check? -- Pino Toscano
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
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.
--- a/sysdeps/mach/hurd/ptsname.c
+++ b/sysdeps/mach/hurd/ptsname.c
@@ -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;
Attachment:
signature.asc
Description: This is a digitally signed message part.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |