Date: Tue, 6 May 2003 15:26:52 +1000 (EST) From: Mark Andrews <marka@isc.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: bin/51827: getaddrinfo() is broken with numeric service Message-ID: <200305060526.h465QqT3037637@drugs.dv.isc.org> Resent-Message-ID: <200305060530.h465U9GQ070568@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 51827
>Category: bin
>Synopsis: getaddrinfo() is broken with numeric service
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Mon May 05 22:30:09 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator: Mark Andrews
>Release: FreeBSD 4.8-RC i386
>Organization:
ISC
>Environment:
System: FreeBSD drugs.dv.isc.org 4.8-RC FreeBSD 4.8-RC #6: Sun Mar 30 11:45:29 EST 2003 marka@drugs.dv.isc.org:/usr/obj/usr/src/sys/DRUGS i386
>Description:
getaddrinfo() should accept numeric when ai_socktype is not
specified in hint or hints is NULL.
RFC 3493:
If servname is null, the call shall return network-level addresses
for the specified nodename. If servname is not null, it is a null-
terminated character string identifying the requested service. This
can be either a descriptive name or a numeric representation suitable
for use with the address family or families. If the specified
address family is AF_INET, AF_INET6 or AF_UNSPEC, the service can be
specified as a string specifying a decimal port number.
While I havn't checked the posix spec nothing in RFC 3493
indicates that numeric values are only to be accepted when
ai_socktype is specified.
>How-To-Repeat:
% ./a.out
53/NULL
servname not supported for ai_socktype
53/hint
servname not supported for ai_socktype
domain/hint
28 2 17
2 2 17
28 1 6
2 1 6
domain/hint
28 2 17
2 2 17
28 1 6
2 1 6
%
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
main() {
int error;
struct addrinfo *res, *res0;
struct addrinfo hint;
memset(&hint, 0, sizeof(hint));
hint.ai_family = AF_UNSPEC;
printf("53/NULL\n");
error = getaddrinfo("rc.isc.org", "53", NULL, &res0);
if (error) {
printf("%s\n", gai_strerror(error));
} else {
for (res = res0; res; res = res->ai_next) {
printf("%d %u %u\n", res->ai_family, res->ai_socktype,
res->ai_protocol);
}
freeaddrinfo(res0);
}
printf("53/hint\n");
error = getaddrinfo("rc.isc.org", "53", &hint, &res0);
if (error) {
printf("%s\n", gai_strerror(error));
} else {
for (res = res0; res; res = res->ai_next) {
printf("%d %u %u\n", res->ai_family, res->ai_socktype,
res->ai_protocol);
}
freeaddrinfo(res0);
}
printf("domain/hint\n");
error = getaddrinfo("rc.isc.org", "domain", NULL, &res0);
if (error) {
printf("%s\n", gai_strerror(error));
} else {
for (res = res0; res; res = res->ai_next) {
printf("%d %u %u\n", res->ai_family, res->ai_socktype,
res->ai_protocol);
}
freeaddrinfo(res0);
}
printf("domain/hint\n");
error = getaddrinfo("rc.isc.org", "domain", &hint, &res0);
if (error) {
printf("%s\n", gai_strerror(error));
} else {
for (res = res0; res; res = res->ai_next) {
printf("%d %u %u\n", res->ai_family, res->ai_socktype,
res->ai_protocol);
}
freeaddrinfo(res0);
}
exit(0);
}
>Fix:
The following if from the BIND 8 source but should apply.
Index: lib/irs/getaddrinfo.c
===================================================================
RCS file: /proj/cvs/isc/bind8/src/lib/irs/getaddrinfo.c,v
retrieving revision 8.12
diff -u -r8.12 getaddrinfo.c
--- lib/irs/getaddrinfo.c 3 Dec 2002 05:26:49 -0000 8.12
+++ lib/irs/getaddrinfo.c 6 May 2003 05:10:26 -0000
@@ -987,7 +987,17 @@
allownumeric = 1;
break;
case ANY:
- allownumeric = 0;
+ switch (ai->ai_family) {
+ case AF_INET:
+#ifdef AF_INET6
+ case AF_INET6:
+#endif
+ allownumeric = 1;
+ break;
+ default:
+ allownumeric = 0;
+ break;
+ }
break;
default:
return EAI_SOCKTYPE;
>Release-Note:
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305060526.h465QqT3037637>
