Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Throw SocketAddressError (cf. fatalError) in SocketAddress.convert for unknown address family #2477

Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Sources/NIOPosix/BaseSocket.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ extension sockaddr_storage {
}

/// Converts the `socketaddr_storage` to a `SocketAddress`.
func convert() -> SocketAddress {
func convert() throws -> SocketAddress {
switch NIOBSDSocket.AddressFamily(rawValue: CInt(self.ss_family)) {
case .inet:
let sockAddr: sockaddr_in = self.convert()
Expand All @@ -85,7 +85,7 @@ extension sockaddr_storage {
case .unix:
return SocketAddress(self.convert() as sockaddr_un)
default:
fatalError("unknown sockaddr family \(self.ss_family)")
throw SocketAddressError.unsupported
}
}
}
Expand Down Expand Up @@ -154,7 +154,7 @@ class BaseSocket: BaseSocketProtocol {
try body($0, addressPtr, &size)
}
}
return addr.convert()
return try addr.convert()
}

/// Create a new socket and return the file descriptor of it.
Expand Down
12 changes: 6 additions & 6 deletions Sources/NIOPosix/DatagramVectorReadManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,10 @@ struct DatagramVectorReadManager {
return .none
case .processed(let messagesProcessed):
buffer.moveWriterIndex(to: messageSize * messagesProcessed)
return self.buildMessages(messageCount: messagesProcessed,
sliceSize: messageSize,
buffer: &buffer,
parseControlMessages: parseControlMessages)
return try self.buildMessages(messageCount: messagesProcessed,
sliceSize: messageSize,
buffer: &buffer,
parseControlMessages: parseControlMessages)
}
}

Expand All @@ -154,7 +154,7 @@ struct DatagramVectorReadManager {
private func buildMessages(messageCount: Int,
sliceSize: Int,
buffer: inout ByteBuffer,
parseControlMessages: Bool) -> ReadResult {
parseControlMessages: Bool) throws -> ReadResult {
var sliceOffset = buffer.readerIndex
var totalReadSize = 0

Expand All @@ -178,7 +178,7 @@ struct DatagramVectorReadManager {
#else
precondition(self.messageVector[i].msg_hdr.msg_namelen != 0, "Unexpected zero length peer name")
#endif
let address: SocketAddress = self.sockaddrVector[i].convert()
let address: SocketAddress = try self.sockaddrVector[i].convert()

// Extract congestion information if requested.
let metadata: AddressedEnvelope<ByteBuffer>.Metadata?
Expand Down
4 changes: 3 additions & 1 deletion Sources/NIOPosix/SocketChannel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,8 @@ final class DatagramChannel: BaseSocketChannel<Socket> {
switch result {
case .processed(let bytesRead):
assert(self.isOpen)
let remoteAddress: SocketAddress = try rawAddress.convert()

self.recvBufferPool.record(actualReadBytes: bytesRead)
readPending = false

Expand All @@ -651,7 +653,7 @@ final class DatagramChannel: BaseSocketChannel<Socket> {
metadata = nil
}

let msg = AddressedEnvelope(remoteAddress: rawAddress.convert(),
let msg = AddressedEnvelope(remoteAddress: remoteAddress,
data: buffer,
metadata: metadata)
assert(self.isActive)
Expand Down
10 changes: 10 additions & 0 deletions Tests/NIOPosixTests/SocketAddressTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,16 @@ class SocketAddressTest: XCTestCase {
XCTAssertEqual(memcmp(&firstIPAddress, &firstCopy, MemoryLayout<sockaddr_in>.size), 0)
XCTAssertEqual(memcmp(&secondIPAddress, &secondCopy, MemoryLayout<sockaddr_in6>.size), 0)
XCTAssertEqual(memcmp(&thirdIPAddress, &thirdCopy, MemoryLayout<sockaddr_un>.size), 0)

// Test unsupported socket address family.
var unspecAddr = sockaddr_storage()
unspecAddr.ss_family = sa_family_t(AF_UNSPEC)
XCTAssertThrowsError(try unspecAddr.convert() as SocketAddress) { error in
guard case .unsupported = error as? SocketAddressError else {
XCTFail("Expected error \(SocketAddressError.unsupported), got error \(error).")
return
}
}
}

func testComparingSockaddrs() throws {
Expand Down