1 - attempted fix of uninitialized variable

2 - indented and edited to fit better within 80 columns
3 - fixed possible buffer overflow in the service name lookup function
pull/1/head
Daniel Stenberg 19 years ago
parent af27d8743d
commit 209e8147a1
  1. 32
      ares_getnameinfo.c

@ -194,9 +194,11 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
if (niquery->flags & ARES_NI_LOOKUPSERVICE) if (niquery->flags & ARES_NI_LOOKUPSERVICE)
{ {
if (niquery->family == AF_INET) if (niquery->family == AF_INET)
service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags, srvbuf); service = lookup_service(niquery->addr.addr4.sin_port,
niquery->flags, srvbuf);
else else
service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags, srvbuf); service = lookup_service(niquery->addr.addr6.sin6_port,
niquery->flags, srvbuf);
} }
/* NOFQDN means we have to strip off the domain name portion. /* NOFQDN means we have to strip off the domain name portion.
We do this by determining our own domain name, then searching the string We do this by determining our own domain name, then searching the string
@ -234,9 +236,11 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
if (niquery->flags & ARES_NI_LOOKUPSERVICE) if (niquery->flags & ARES_NI_LOOKUPSERVICE)
{ {
if (niquery->family == AF_INET) if (niquery->family == AF_INET)
service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags, srvbuf); service = lookup_service(niquery->addr.addr4.sin_port,
niquery->flags, srvbuf);
else else
service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags, srvbuf); service = lookup_service(niquery->addr.addr6.sin6_port,
niquery->flags, srvbuf);
} }
niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service); niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service);
return; return;
@ -245,7 +249,8 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
free(niquery); free(niquery);
} }
static char *lookup_service(unsigned short port, int flags, char *buf) static char *lookup_service(unsigned short port, int flags,
char *buf) /* 33 bytes buffer */
{ {
if (port) if (port)
{ {
@ -276,11 +281,13 @@ static char *lookup_service(unsigned short port, int flags, char *buf)
proto = "tcp"; proto = "tcp";
#ifdef HAVE_GETSERVBYPORT_R #ifdef HAVE_GETSERVBYPORT_R
#if GETSERVBYPORT_R_ARGS == 6 #if GETSERVBYPORT_R_ARGS == 6
se = &ret;
if (getservbyport_r(port, proto, se, buf, len, &ret)) if (getservbyport_r(port, proto, se, buf, len, &ret))
se = NULL; se = NULL;
#elif GETSERVBYPORT_R_ARGS == 5 #elif GETSERVBYPORT_R_ARGS == 5
se = getservbyport_r(port, proto, se, buf, len); se = getservbyport_r(port, proto, se, buf, len);
#elif GETSERVBYPORT_R_ARGS == 4 #elif GETSERVBYPORT_R_ARGS == 4
se = &sed;
if (getservbyport_r(port, proto, se, &sed) == -1) if (getservbyport_r(port, proto, se, &sed) == -1)
se = NULL; se = NULL;
#else #else
@ -291,8 +298,15 @@ static char *lookup_service(unsigned short port, int flags, char *buf)
/* Lets just hope the OS uses TLS! */ /* Lets just hope the OS uses TLS! */
se = getservbyport(port, proto); se = getservbyport(port, proto);
#endif #endif
if (se && se->s_name) if (se && se->s_name) {
size_t len = strlen(se->s_name);
if(len < 33) {
strcpy(buf, se->s_name); strcpy(buf, se->s_name);
}
else
/* too big name to fit the buffer */
buf[0]=0;
}
else else
sprintf(buf, "%u", ntohs(port)); sprintf(buf, "%u", ntohs(port));
} }
@ -302,13 +316,15 @@ static char *lookup_service(unsigned short port, int flags, char *buf)
} }
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, char *buf) static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
char *buf)
{ {
char tmpbuf[IF_NAMESIZE + 1]; char tmpbuf[IF_NAMESIZE + 1];
tmpbuf[0] = '%'; tmpbuf[0] = '%';
#ifdef HAVE_IF_INDEXTONAME #ifdef HAVE_IF_INDEXTONAME
if ((flags & ARES_NI_NUMERICSCOPE) || (!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr) if ((flags & ARES_NI_NUMERICSCOPE) ||
(!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)
&& !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr))) && !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr)))
{ {
sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id); sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id);

Loading…
Cancel
Save