OSDN Git Service

inet/resolv: Fix broken h_aliases list terminator after 2dab3f5
authorWaldemar Brodkorb <wbx@uclibc-ng.org>
Tue, 22 Dec 2015 09:45:51 +0000 (10:45 +0100)
committerWaldemar Brodkorb <wbx@uclibc-ng.org>
Sat, 26 Dec 2015 19:23:40 +0000 (20:23 +0100)
commit5659e2a1c763a51957c3e9bd13737534a1d894c6
tree4001f7ab5724e3dbbc465a3d5d0fbc9c3627486e
parent7807bd3ada8b488167f1e5ab486ef0feb560eab8
inet/resolv: Fix broken h_aliases list terminator after 2dab3f5

Commit 2dab3f5a "resolv: tiny shrinkage in /etc/hosts handling" leads to
that read_etc_hosts_r() provide garbage pointer at the end of h_aliases
list if more than four hostnames follow a dotted quad in /etc/hosts

Test-case:

Add following line to /etc/hosts
63.63.0.2    host1 alias2 alias3 alias4 alias5

#include <stdio.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main (void)
{
int i;
char *a;
struct hostent *he;
struct in_addr ipv4addr;

inet_pton(AF_INET, "63.63.0.2", &ipv4addr);
he = gethostbyaddr(&ipv4addr, sizeof ipv4addr, AF_INET);
if (he == NULL)
exit(1);
printf("Host name: '%s'\n", he->h_name);
i = 0;
while ((a = he->h_aliases[i]) != NULL) {
printf("Host alias: '%s'\n", a);
++i;
}

return 0;
}

 Wrong output:

 Host name: 'host1'
 Host alias: 'alias2'
 Host alias: 'alias3'
 Host alias: 'alias4'
 Host alias: 'alias5'
 Host alias: '??'

Signed-off-by: Leonid Lisovskiy <lly.dev@gmail.com>
Signed-off-by: Waldemar Brodkorb <wbx@uclibc-ng.org>
libc/inet/resolv.c