* [PATCH] Fix ether_line
@ 2002-05-23 10:00 Jakub Jelinek
2002-05-24 1:28 ` Ulrich Drepper
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2002-05-23 10:00 UTC (permalink / raw)
To: Ulrich Drepper; +Cc: Glibc hackers
Hi!
ether_line ("0:c0:f0:46:5f:97 host.ether.com \t# comment", ...)
would return 0:0:0:6:f:7 with -fwriteable-strings or segfault
otherwise. The following patch fixes both bugs.
2002-05-23 Jakub Jelinek <jakub@redhat.com>
* inet/ether_line.c (ether_line): Fix a typo causing only
lower 4 bits of each ethernet address byte being assigned.
Don't modify what line points to.
* inet/tst-ether_aton.c (main): Add ether_line tests.
--- libc/inet/ether_line.c.jj Thu Aug 23 18:47:43 2001
+++ libc/inet/ether_line.c Thu May 23 18:38:03 2002
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1999, 2002 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
@@ -46,7 +46,7 @@ ether_line (const char *line, struct eth
if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
return -1;
number <<= 4;
- number = isdigit (ch) ? (ch - '0') : (ch - 'a' + 10);
+ number += isdigit (ch) ? (ch - '0') : (ch - 'a' + 10);
ch = *line;
if (cnt < 5 && ch != ':')
@@ -65,15 +65,15 @@ ether_line (const char *line, struct eth
cp = __strchrnul (line, '#');
while (cp > line && isspace (cp[-1]))
--cp;
- *cp = '\0';
- if (*line == '\0')
+ if (cp == line)
/* No hostname. */
return -1;
/* XXX This can cause trouble because the hostname might be too long
but we have no possibility to check it here. */
- strcpy (hostname, line);
+ memcpy (hostname, line, cp - line);
+ hostname [cp - line] = '\0';
return 0;
}
--- libc/inet/tst-ether_aton.c.jj Fri May 1 12:39:33 1998
+++ libc/inet/tst-ether_aton.c Thu May 23 18:44:14 2002
@@ -1,29 +1,57 @@
#include <stdio.h>
+#include <string.h>
#include <netinet/ether.h>
int
main (int argc, char *argv[])
{
- struct ether_addr *val;
- int result;
+ struct ether_addr *valp, val;
+ int result, r;
+ char hostname[32], buf[64], *p;
- val = ether_aton ("12:34:56:78:9a:bc");
+ valp = ether_aton ("12:34:56:78:9a:bc");
printf ("ether_aton (\"12:34:56:78:9a:bc\") = %hhx:%hhx:%hhx:%hhx:%hhx:%hhx\n",
- val->ether_addr_octet[0],
- val->ether_addr_octet[1],
- val->ether_addr_octet[2],
- val->ether_addr_octet[3],
- val->ether_addr_octet[4],
- val->ether_addr_octet[5]);
-
-
- result = (val->ether_addr_octet[0] != 0x12
- || val->ether_addr_octet[1] != 0x34
- || val->ether_addr_octet[2] != 0x56
- || val->ether_addr_octet[3] != 0x78
- || val->ether_addr_octet[4] != 0x9a
- || val->ether_addr_octet[5] != 0xbc);
+ valp->ether_addr_octet[0],
+ valp->ether_addr_octet[1],
+ valp->ether_addr_octet[2],
+ valp->ether_addr_octet[3],
+ valp->ether_addr_octet[4],
+ valp->ether_addr_octet[5]);
+
+ result = (valp->ether_addr_octet[0] != 0x12
+ || valp->ether_addr_octet[1] != 0x34
+ || valp->ether_addr_octet[2] != 0x56
+ || valp->ether_addr_octet[3] != 0x78
+ || valp->ether_addr_octet[4] != 0x9a
+ || valp->ether_addr_octet[5] != 0xbc);
+
+ if ((r = ether_line ("0:c0:f0:46:5f:97 host.ether.com \t# comment",
+ &val, hostname)) == 0)
+ {
+ ether_ntoa_r (&val, buf);
+ p = strchr (buf, '\0');
+ *p++ = ' ';
+ strcpy (p, hostname);
+
+ printf ("ether_line (\"0:c0:f0:46:5f:97 host.ether.com\") = \"%s\"\n",
+ buf);
+
+ result |= strcmp ("0:c0:f0:46:5f:97 host.ether.com", buf) != 0;
+ }
+ else
+ {
+ printf ("ether_line (\"0:c0:f0:46:5f:97 host.ether.com\") = %d\n", r);
+ result |= 1;
+ }
+
+ r = ether_line ("0:c0:2:d0 foo.bar ", &val, hostname);
+ printf ("ether_line (\"0:c0:2:d0 foo.bar \") = %d\n", r);
+ result |= r != -1;
+
+ r = ether_line ("0:c0:2:d0:1a:2a ", &val, hostname);
+ printf ("ether_line (\"0:c0:2:d0:1a:2a \") = %d\n", r);
+ result |= r != -1;
return result;
}
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Fix ether_line
2002-05-23 10:00 [PATCH] Fix ether_line Jakub Jelinek
@ 2002-05-24 1:28 ` Ulrich Drepper
0 siblings, 0 replies; 2+ messages in thread
From: Ulrich Drepper @ 2002-05-24 1:28 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Glibc hackers
[-- Attachment #1: Type: text/plain, Size: 572 bytes --]
On Thu, 2002-05-23 at 09:59, Jakub Jelinek wrote:
> ether_line ("0:c0:f0:46:5f:97 host.ether.com \t# comment", ...)
> would return 0:0:0:6:f:7 with -fwriteable-strings or segfault
> otherwise. The following patch fixes both bugs.
Right. Seems to be a very popular function. It's been around forever.
I've applied the patch. Thanks,
--
---------------. ,-. 1325 Chesapeake Terrace
Ulrich Drepper \ ,-------------------' \ Sunnyvale, CA 94089 USA
Red Hat `--' drepper at redhat.com `------------------------
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 232 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2002-05-24 8:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-05-23 10:00 [PATCH] Fix ether_line Jakub Jelinek
2002-05-24 1:28 ` Ulrich Drepper
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).