From 1bb0124b77a21ab560c1b0d0a67259b6979648d7 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 28 Feb 2009 15:20:35 +0100 Subject: listen: allocate sockaddr_storage struct for accept() The generic sockaddr struct is too small for some addresses. For accept(), we have to allocate a sockaddr_storage struct on the stack, which is large enough for all addresses. --- NEWS | 1 + src/listen.c | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 7bdae31e..5ea4f2d4 100644 --- a/NEWS +++ b/NEWS @@ -41,6 +41,7 @@ ver 0.15 - (200?/??/??) * playlist: recalculate the queued song after random is toggled * playlist: don't unpause on delete * daemon: ignore "user" setting if already running as that user +* listen: fix broken client IP addresses in log ver 0.14.2 (2009/02/13) diff --git a/src/listen.c b/src/listen.c index c7f66e88..ff4d5ccc 100644 --- a/src/listen.c +++ b/src/listen.c @@ -448,14 +448,15 @@ listen_in_event(G_GNUC_UNUSED GIOChannel *source, gpointer data) { int listen_fd = GPOINTER_TO_INT(data), fd; - struct sockaddr sockAddr; - socklen_t socklen = sizeof(sockAddr); + struct sockaddr_storage sa; + socklen_t sa_length = sizeof(sa); - fd = accept(listen_fd, &sockAddr, &socklen); + fd = accept(listen_fd, (struct sockaddr*)&sa, &sa_length); if (fd >= 0) { set_nonblocking(fd); - client_new(fd, &sockAddr, socklen, get_remote_uid(fd)); + client_new(fd, (struct sockaddr*)&sa, sa_length, + get_remote_uid(fd)); } else if (fd < 0 && errno != EINTR) { g_warning("Problems accept()'ing"); } -- cgit v1.2.3