Browse Source

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>
Waldemar Brodkorb 8 years ago
parent
commit
6994bbf289
1 changed files with 1 additions and 1 deletions
  1. 1 1
      libc/inet/resolv.c

+ 1 - 1
libc/inet/resolv.c

@@ -1596,7 +1596,7 @@ parser_t * __open_etc_hosts(void)
 
 #define MINTOKENS 2 /* ip address + canonical name */
 #define MAXTOKENS (MINTOKENS + MAXALIASES)
-#define HALISTOFF (sizeof(char*) * MAXTOKENS)
+#define HALISTOFF (sizeof(char*) * (MAXTOKENS + 1))	/* reserve space for list terminator */
 #define INADDROFF (HALISTOFF + 2 * sizeof(char*))
 
 int __read_etc_hosts_r(