Skip to content

Commit aa8fc97

Browse files
committed
Fixed buffer overflow when retrieving socket addresses
1 parent 863febe commit aa8fc97

1 file changed

Lines changed: 8 additions & 9 deletions

File tree

GCDWebServer/Core/GCDWebServer.m

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -463,18 +463,18 @@ - (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSock
463463
dispatch_source_set_event_handler(source, ^{
464464

465465
@autoreleasepool {
466-
struct sockaddr remoteSockAddr;
466+
struct sockaddr_storage remoteSockAddr;
467467
socklen_t remoteAddrLen = sizeof(remoteSockAddr);
468-
int socket = accept(listeningSocket, &remoteSockAddr, &remoteAddrLen);
468+
int socket = accept(listeningSocket, (struct sockaddr*)&remoteSockAddr, &remoteAddrLen);
469469
if (socket > 0) {
470470
NSData* remoteAddress = [NSData dataWithBytes:&remoteSockAddr length:remoteAddrLen];
471471

472-
struct sockaddr localSockAddr;
472+
struct sockaddr_storage localSockAddr;
473473
socklen_t localAddrLen = sizeof(localSockAddr);
474474
NSData* localAddress = nil;
475-
if (getsockname(socket, &localSockAddr, &localAddrLen) == 0) {
475+
if (getsockname(socket, (struct sockaddr*)&localSockAddr, &localAddrLen) == 0) {
476476
localAddress = [NSData dataWithBytes:&localSockAddr length:localAddrLen];
477-
GWS_DCHECK((!isIPv6 && localSockAddr.sa_family == AF_INET) || (isIPv6 && localSockAddr.sa_family == AF_INET6));
477+
GWS_DCHECK((!isIPv6 && localSockAddr.ss_family == AF_INET) || (isIPv6 && localSockAddr.ss_family == AF_INET6));
478478
} else {
479479
GWS_DNOT_REACHED();
480480
}
@@ -511,11 +511,10 @@ - (BOOL)_start:(NSError**)error {
511511
return NO;
512512
}
513513
if (port == 0) {
514-
struct sockaddr addr;
514+
struct sockaddr_in addr;
515515
socklen_t addrlen = sizeof(addr);
516-
if (getsockname(listeningSocket4, &addr, &addrlen) == 0) {
517-
struct sockaddr_in* sockaddr = (struct sockaddr_in*)&addr;
518-
port = ntohs(sockaddr->sin_port);
516+
if (getsockname(listeningSocket4, (struct sockaddr*)&addr, &addrlen) == 0) {
517+
port = ntohs(addr.sin_port);
519518
} else {
520519
GWS_LOG_ERROR(@"Failed retrieving socket address: %s (%i)", strerror(errno), errno);
521520
}

0 commit comments

Comments
 (0)