+* [Bug 1208] decodenetnum() buffer overrun on [ with no ]
(4.2.5p180) 2009/05/29 Released by Harlan Stenn <stenn@ntp.org>
* [Bug 1200] Enable IPv6 in Windows port
* Lose FLAG_FIXPOLL, from Dave Mills.
#include <netinet/in.h>
#include "ntp_stdlib.h"
+#include "ntp_assert.h"
int
decodenetnum(
)
{
struct addrinfo hints, *ai = NULL;
- register int err, i;
+ register int err;
register const char *cp;
char name[80];
+ char *np;
- cp = num;
+ NTP_REQUIRE(num != NULL);
+ NTP_REQUIRE(strlen(num) < sizeof(name));
- if (*cp == '[') {
- cp++;
- for (i = 0; *cp != ']'; cp++, i++)
- name[i] = *cp;
- name[i] = '\0';
- num = name;
+ if ('[' != num[0])
+ np = name;
+ else {
+ cp = num + 1;
+ np = name;
+ while (*cp && ']' != *cp)
+ *np++ = *cp++;
+ *np = 0;
+ np = name;
}
- memset(&hints, 0, sizeof(struct addrinfo));
+ memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_NUMERICHOST;
- err = getaddrinfo(num, NULL, &hints, &ai);
+ err = getaddrinfo(np, NULL, &hints, &ai);
if (err != 0)
return 0;
- memcpy(netnum, (struct sockaddr_storage *)ai->ai_addr, ai->ai_addrlen);
+ memcpy(netnum, ai->ai_addr, ai->ai_addrlen);
freeaddrinfo(ai);
return 1;
}