From f7115c837c3fe3b26dc65715bfdee5e93aab4013 Mon Sep 17 00:00:00 2001 From: Apple Date: Fri, 30 Mar 2007 18:15:01 +0000 Subject: [PATCH] Libinfo-222.3.6.tar.gz --- lookup.subproj/getaddrinfo.c | 137 ++++++++++++++++++++++++++++------- rpc.subproj/getrpcent.c | 2 +- rpc.subproj/svc_auth_unix.c | 10 +-- 3 files changed, 115 insertions(+), 34 deletions(-) diff --git a/lookup.subproj/getaddrinfo.c b/lookup.subproj/getaddrinfo.c index ce51a5e..ae67e31 100644 --- a/lookup.subproj/getaddrinfo.c +++ b/lookup.subproj/getaddrinfo.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -106,7 +107,7 @@ static int gai_family_type_check(int32_t f) { int32_t i; - + for (i = 0; i < supported_family_count; i++) { if (f == supported_family[i]) return 0; @@ -119,7 +120,7 @@ static int gai_socket_type_check(int32_t s) { int32_t i; - + for (i = 0; i < supported_socket_count; i++) { if (s == supported_socket[i]) return 0; @@ -132,7 +133,7 @@ static int gai_protocol_type_check(int32_t p) { int32_t i; - + for (i = 0; i < supported_protocol_count; i++) { if (p == supported_protocol[i]) return 0; @@ -145,7 +146,7 @@ static int gai_socket_protocol_type_check(int32_t s, int32_t p) { int32_t i, j, ss, sp; - + for (i = 0, j = 0; i < supported_socket_protocol_pair_count; i++, j+=2) { ss = supported_socket_protocol_pair[j]; @@ -517,6 +518,7 @@ gai_make_query(const char *nodename, const char *servname, const struct addrinfo if (!xdr_int(&outxdr, (int32_t *)&na)) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } @@ -525,6 +527,7 @@ gai_make_query(const char *nodename, const char *servname, const struct addrinfo if (encode_kv(&outxdr, "name", nodename) != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } @@ -534,6 +537,7 @@ gai_make_query(const char *nodename, const char *servname, const struct addrinfo if (encode_kv(&outxdr, "service", servname) != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } @@ -544,62 +548,69 @@ gai_make_query(const char *nodename, const char *servname, const struct addrinfo if (encode_kv(&outxdr, "protocol", str) != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } - + if (socktype != SOCK_UNSPEC) { snprintf(str, 64, "%u", socktype); if (encode_kv(&outxdr, "socktype", str) != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } - + if (family != PF_UNSPEC) { snprintf(str, 64, "%u", family); if (encode_kv(&outxdr, "family", str) != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } - + if (canonname != 0) { if (encode_kv(&outxdr, "canonname", "1") != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } - + if (passive != 0) { if (encode_kv(&outxdr, "passive", "1") != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } - + if (parallel != 0) { if (encode_kv(&outxdr, "parallel", "1") != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } - + if (numerichost != 0) { if (encode_kv(&outxdr, "numerichost", "1") != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } @@ -607,7 +618,7 @@ gai_make_query(const char *nodename, const char *servname, const struct addrinfo *len = xdr_getpos(&outxdr); xdr_destroy(&outxdr); - + return 0; } @@ -806,10 +817,16 @@ gai_lookupd(const char *nodename, const char *servname, const struct addrinfo *h if (gai_proc < 0) { status = _lookup_link(server_port, "getaddrinfo", &gai_proc); - if (status != KERN_SUCCESS) return EAI_SYSTEM; + if (status != KERN_SUCCESS) + { + errno = ECONNREFUSED; + return EAI_SYSTEM; + } } qlen = LU_QBUF_SIZE; + + /* gai_make_query sets errno if it fails */ i = gai_make_query(nodename, servname, hints, qbuf, &qlen); if (i != 0) return EAI_SYSTEM; @@ -827,6 +844,7 @@ gai_lookupd(const char *nodename, const char *servname, const struct addrinfo *h if (!xdr_int(&inxdr, (int32_t *)&n)) { xdr_destroy(&inxdr); + errno = EIO; return EAI_SYSTEM; } @@ -887,7 +905,7 @@ getaddrinfo(const char * __restrict nodename, const char * __restrict servname, servnull = 0; if ((servname == NULL) || (servname[0] == '\0')) servnull = 1; - + if ((nodenull == 1) && (servnull == 1)) return EAI_NONAME; status = gai_checkhints(hints); if (status != 0) return status; @@ -918,21 +936,38 @@ getaddrinfo_async_start(mach_port_t *p, const char *nodename, const char *servna server_port = MACH_PORT_NULL; if (_lu_running()) server_port = _lookupd_port(0); - if (server_port == MACH_PORT_NULL) return EAI_SYSTEM; + if (server_port == MACH_PORT_NULL) + { + errno = ECONNREFUSED; + return EAI_SYSTEM; + } if (gai_proc < 0) { status = _lookup_link(server_port, "getaddrinfo", &gai_proc); - if (status != KERN_SUCCESS) return EAI_SYSTEM; + if (status != KERN_SUCCESS) + { + errno = ECONNREFUSED; + return EAI_SYSTEM; + } } qlen = LU_QBUF_SIZE; + + /* gai_make_query sets errno if it fails */ i = gai_make_query(nodename, servname, hints, qbuf, &qlen); if (i != 0) return EAI_SYSTEM; qlen /= BYTES_PER_XDR_UNIT; - return lu_async_start(p, gai_proc, qbuf, qlen, (void *)callback, context); + status = lu_async_start(p, gai_proc, qbuf, qlen, (void *)callback, context); + if (status != 0) + { + errno = ECONNREFUSED; + return EAI_SYSTEM; + } + + return 0; } int32_t @@ -959,6 +994,7 @@ gai_extract_data(char *buf, uint32_t len, struct addrinfo **res) if (!xdr_int(&xdr, (int32_t *)&n)) { xdr_destroy(&xdr); + errno = EIO; return EAI_SYSTEM; } @@ -1080,9 +1116,17 @@ gni_lookupd_process_dictionary(XDR *inxdr, char **host, char **serv) int32_t i, j, nkeys, nvals, status; char *key, **vals; - if ((host == NULL) || (serv == NULL)) return EAI_SYSTEM; + if ((host == NULL) || (serv == NULL)) + { + errno = EINVAL; + return EAI_SYSTEM; + } - if (!xdr_int(inxdr, &nkeys)) return EAI_SYSTEM; + if (!xdr_int(inxdr, &nkeys)) + { + errno = EIO; + return EAI_SYSTEM; + } *host = NULL; *serv = NULL; @@ -1092,9 +1136,13 @@ gni_lookupd_process_dictionary(XDR *inxdr, char **host, char **serv) key = NULL; vals = NULL; nvals = 0; - + status = _lu_xdr_attribute(inxdr, &key, &vals, (uint32_t *)&nvals); - if (status < 0) return EAI_SYSTEM; + if (status < 0) + { + errno = EIO; + return EAI_SYSTEM; + } if (nvals == 0) { @@ -1192,7 +1240,7 @@ gni_make_query(const struct sockaddr *sa, size_t salen, int wanthost, int wantse ifnum = s6->sin6_addr.__u6_addr.__u6_addr16[1]; if (ifnum == 0) ifnum = s6->sin6_scope_id; else if ((s6->sin6_scope_id != 0) && (ifnum != s6->sin6_scope_id)) return EAI_FAIL; - + s6->sin6_addr.__u6_addr.__u6_addr16[1] = 0; s6->sin6_scope_id = ifnum; if ((ifnum != 0) && (flags & NI_NUMERICHOST)) flags |= NI_WITHSCOPEID; @@ -1247,6 +1295,7 @@ gni_make_query(const struct sockaddr *sa, size_t salen, int wanthost, int wantse if (!xdr_int(&outxdr, (int32_t *)&na)) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } @@ -1267,6 +1316,7 @@ gni_make_query(const struct sockaddr *sa, size_t salen, int wanthost, int wantse if (encode_kv(&outxdr, key, str) != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } @@ -1277,6 +1327,7 @@ gni_make_query(const struct sockaddr *sa, size_t salen, int wanthost, int wantse if (encode_kv(&outxdr, "port", str) != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } @@ -1286,6 +1337,7 @@ gni_make_query(const struct sockaddr *sa, size_t salen, int wanthost, int wantse if (encode_kv(&outxdr, "protocol", "udp") != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } @@ -1295,6 +1347,7 @@ gni_make_query(const struct sockaddr *sa, size_t salen, int wanthost, int wantse if (encode_kv(&outxdr, "fqdn", "0") != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } @@ -1304,6 +1357,7 @@ gni_make_query(const struct sockaddr *sa, size_t salen, int wanthost, int wantse if (encode_kv(&outxdr, "numerichost", "1") != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } @@ -1313,6 +1367,7 @@ gni_make_query(const struct sockaddr *sa, size_t salen, int wanthost, int wantse if (encode_kv(&outxdr, "numericserv", "1") != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } @@ -1322,6 +1377,7 @@ gni_make_query(const struct sockaddr *sa, size_t salen, int wanthost, int wantse if (encode_kv(&outxdr, "name_required", "1") != 0) { xdr_destroy(&outxdr); + errno = EIO; return EAI_SYSTEM; } } @@ -1329,7 +1385,7 @@ gni_make_query(const struct sockaddr *sa, size_t salen, int wanthost, int wantse *len = xdr_getpos(&outxdr); xdr_destroy(&outxdr); - + return 0; } @@ -1391,7 +1447,7 @@ getnameinfo(const struct sockaddr * __restrict sa, socklen_t salen, char * __res return i; } } - + wanth = 0; if ((host != NULL) && (hostlen != 0)) wanth = 1; @@ -1448,12 +1504,20 @@ getnameinfo(const struct sockaddr * __restrict sa, socklen_t salen, char * __res */ server_port = MACH_PORT_NULL; if (_lu_running()) server_port = _lookupd_port(0); - if (server_port == MACH_PORT_NULL) return EAI_SYSTEM; + if (server_port == MACH_PORT_NULL) + { + errno = ECONNREFUSED; + return EAI_SYSTEM; + } if (gni_proc < 0) { status = _lookup_link(server_port, "getnameinfo", &gni_proc); - if (status != KERN_SUCCESS) return EAI_SYSTEM; + if (status != KERN_SUCCESS) + { + errno = ECONNREFUSED; + return EAI_SYSTEM; + } } qlen = LU_QBUF_SIZE; @@ -1474,6 +1538,7 @@ getnameinfo(const struct sockaddr * __restrict sa, socklen_t salen, char * __res if (!xdr_int(&inxdr, (int32_t *)&n)) { xdr_destroy(&inxdr); + errno = EIO; return EAI_SYSTEM; } @@ -1527,12 +1592,20 @@ getnameinfo_async_start(mach_port_t *p, const struct sockaddr *sa, size_t salen, server_port = MACH_PORT_NULL; if (_lu_running()) server_port = _lookupd_port(0); - if (server_port == MACH_PORT_NULL) return EAI_SYSTEM; + if (server_port == MACH_PORT_NULL) + { + errno = ECONNREFUSED; + return EAI_SYSTEM; + } if (gni_proc < 0) { status = _lookup_link(server_port, "getnameinfo", &gni_proc); - if (status != KERN_SUCCESS) return EAI_SYSTEM; + if (status != KERN_SUCCESS) + { + errno = ECONNREFUSED; + return EAI_SYSTEM; + } } qlen = LU_QBUF_SIZE; @@ -1541,7 +1614,14 @@ getnameinfo_async_start(mach_port_t *p, const struct sockaddr *sa, size_t salen, qlen /= BYTES_PER_XDR_UNIT; - return lu_async_start(p, gni_proc, qbuf, qlen, (void *)callback, context); + status = lu_async_start(p, gni_proc, qbuf, qlen, (void *)callback, context); + if (status != 0) + { + errno = ECONNREFUSED; + return EAI_SYSTEM; + } + + return 0; } int32_t @@ -1568,6 +1648,7 @@ gni_extract_data(char *buf, uint32_t len, char **host, char **serv) if (!xdr_int(&xdr, (int32_t *)&n)) { xdr_destroy(&xdr); + errno = EIO; return EAI_SYSTEM; } diff --git a/rpc.subproj/getrpcent.c b/rpc.subproj/getrpcent.c index 1a8fe44..74fc043 100644 --- a/rpc.subproj/getrpcent.c +++ b/rpc.subproj/getrpcent.c @@ -183,7 +183,7 @@ getrpcent() static struct rpcent * interpret(val, len) char *val; - int len; + u_int len; { register struct rpcdata *d = _rpcdata(); char *p; diff --git a/rpc.subproj/svc_auth_unix.c b/rpc.subproj/svc_auth_unix.c index cd19041..e96e505 100644 --- a/rpc.subproj/svc_auth_unix.c +++ b/rpc.subproj/svc_auth_unix.c @@ -89,8 +89,7 @@ _svcauth_unix(rqst, msg) char area_machname[MAX_MACHINE_NAME+1]; int area_gids[NGROUPS]; } *area; - u_int auth_len; - int str_len, gid_len; + u_int auth_len, str_len, gid_len; register int i; area = (struct area *) rqst->rq_clntcred; @@ -107,7 +106,7 @@ _svcauth_unix(rqst, msg) stat = AUTH_BADCRED; goto done; } - bcopy((caddr_t)buf, aup->aup_machname, (u_int)str_len); + bcopy((caddr_t)buf, aup->aup_machname, str_len); aup->aup_machname[str_len] = 0; str_len = RNDUP(str_len); buf += str_len / sizeof (long); @@ -127,8 +126,9 @@ _svcauth_unix(rqst, msg) * timestamp, hostname len (0), uid, gid, and gids len (0). */ if ((5 + gid_len) * BYTES_PER_XDR_UNIT + str_len > auth_len) { - (void) printf("bad auth_len gid %d str %d auth %d\n", - gid_len, str_len, auth_len); + /* LIBRARY CODE SHOULD NOT PRINT + (void) printf("bad auth_len gid %d str %d auth %d\n", gid_len, str_len, auth_len); + */ stat = AUTH_BADCRED; goto done; } -- 2.47.2