From 15eda672141cff32e8c2a0a438bb66c5d5bff035 Mon Sep 17 00:00:00 2001 From: Emil Mikulic Date: Thu, 28 Jan 2016 01:03:38 +1100 Subject: [PATCH] Fix IPv6 memory corruption crash on FreeBSD. getsockname() into addrin6 instead of addrin when ipv6 is requested. --- darkhttpd.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/darkhttpd.c b/darkhttpd.c index 41dfa69..bfcaccf 100644 --- a/darkhttpd.c +++ b/darkhttpd.c @@ -889,6 +889,10 @@ static void init_sockin(void) { err(1, "bind(port %u)", bindport); addrin_len = sizeof(addrin6); + if (getsockname(sockin, (struct sockaddr *)&addrin6, &addrin_len) == -1) + err(1, "getsockname()"); + printf("listening on: http://[%s]:%u/\n", + get_address_text(&addrin6.sin6_addr), bindport); } else #endif { @@ -897,20 +901,9 @@ static void init_sockin(void) { if (bind(sockin, (struct sockaddr *)&addrin, sizeof(struct sockaddr_in)) == -1) err(1, "bind(port %u)", bindport); - addrin_len = sizeof(addrin); - } - - if (getsockname(sockin, (struct sockaddr *)&addrin, &addrin_len) == -1) - err(1, "getsockname()"); - -#ifdef HAVE_INET6 - if (inet6) { - printf("listening on: http://[%s]:%u/\n", - get_address_text(&addrin6.sin6_addr), bindport); - } else -#endif - { + if (getsockname(sockin, (struct sockaddr *)&addrin, &addrin_len) == -1) + err(1, "getsockname()"); printf("listening on: http://%s:%u/\n", get_address_text(&addrin.sin_addr), bindport); }