diff --git a/src/core.c b/src/core.c index bd7691b..27b0437 100644 --- a/src/core.c +++ b/src/core.c @@ -996,7 +996,7 @@ err_nn: goto err_nn; } else if(node) { af = ((struct sockaddr_in *) &space->sockaddr_space)->sin_family; - } else if(!node && !(hints->ai_flags & AI_PASSIVE)) { + } else if(!node && !(hints && (hints->ai_flags & AI_PASSIVE))) { af = ((struct sockaddr_in *) &space->sockaddr_space)->sin_family = AF_INET; memcpy(&((struct sockaddr_in *) &space->sockaddr_space)->sin_addr, "\177\0\0\1", 4); diff --git a/tests/test_getaddrinfo_null_hints.c b/tests/test_getaddrinfo_null_hints.c new file mode 100644 index 000000000..ab3276d --- /dev/null +++ b/tests/test_getaddrinfo_null_hints.c @@ -0,0 +1,25 @@ +/* + * NULL pointer dereference in proxy_getaddrinfo() + * if node == NULL && hints == NULL. + */ +#define _POSIX_C_SOURCE 200112L +#include +#include +#include +#include + +static void on_crash(int sig) { + fprintf(stderr, "POC_HIT: signal %d from getaddrinfo(NULL, \"80\", NULL, &res)\n", sig); + fflush(stderr); + _exit(0); +} + +int main(void) { + struct addrinfo *res = 0; + int rc; + signal(SIGSEGV, on_crash); + signal(SIGBUS, on_crash); + rc = getaddrinfo(NULL, "80", NULL, &res); + fprintf(stderr, "POC_MISS: getaddrinfo returned %d\n", rc); + return 1; +}