Andrew Geissler | 82c905d | 2020-04-13 13:39:40 -0500 | [diff] [blame] | 1 | From 382b3b924e43abd1bdc5792918161d0922666691 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nate Karstens <nate.karstens@garmin.com> |
| 3 | Date: Thu, 10 Aug 2017 08:27:32 -0500 |
| 4 | Subject: [PATCH 10/11] Handle errors from socket calls |
| 5 | |
| 6 | Adds handling for socket() or read() returning a |
| 7 | negative value (indicating an error has occurred). |
| 8 | |
| 9 | Upstream-Status: Submitted [dts@apple.com] |
| 10 | |
| 11 | Signed-off-by: Nate Karstens <nate.karstens@garmin.com> |
| 12 | --- |
| 13 | mDNSPosix/mDNSPosix.c | 12 +++++++++--- |
| 14 | 1 file changed, 9 insertions(+), 3 deletions(-) |
| 15 | |
| 16 | diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c |
| 17 | index 3243ed4..84af26b 100644 |
| 18 | --- a/mDNSPosix/mDNSPosix.c |
| 19 | +++ b/mDNSPosix/mDNSPosix.c |
| 20 | @@ -1129,7 +1129,7 @@ mDNSlocal void ProcessRoutingNotification(int sd, GenLinkedList *change |
| 21 | // Read through the messages on sd and if any indicate that any interface records should |
| 22 | // be torn down and rebuilt, return affected indices as a bitmask. Otherwise return 0. |
| 23 | { |
| 24 | - ssize_t readCount; |
| 25 | + ssize_t readVal, readCount; |
| 26 | char buff[4096]; |
| 27 | struct nlmsghdr *pNLMsg = (struct nlmsghdr*) buff; |
| 28 | |
| 29 | @@ -1138,7 +1138,10 @@ mDNSlocal void ProcessRoutingNotification(int sd, GenLinkedList *change |
| 30 | // enough to hold all pending data and so avoid message fragmentation. |
| 31 | // (Note that FIONREAD is not supported on AF_NETLINK.) |
| 32 | |
| 33 | - readCount = read(sd, buff, sizeof buff); |
| 34 | + readVal = read(sd, buff, sizeof buff); |
| 35 | + if (readVal < 0) return; |
| 36 | + readCount = readVal; |
| 37 | + |
| 38 | while (1) |
| 39 | { |
| 40 | // Make sure we've got an entire nlmsghdr in the buffer, and payload, too. |
| 41 | @@ -1154,7 +1157,9 @@ mDNSlocal void ProcessRoutingNotification(int sd, GenLinkedList *change |
| 42 | pNLMsg = (struct nlmsghdr*) buff; |
| 43 | |
| 44 | // read more data |
| 45 | - readCount += read(sd, buff + readCount, sizeof buff - readCount); |
| 46 | + readVal = read(sd, buff + readCount, sizeof buff - readCount); |
| 47 | + if (readVal < 0) return; |
| 48 | + readCount += readVal; |
| 49 | continue; // spin around and revalidate with new readCount |
| 50 | } |
| 51 | else |
| 52 | @@ -1429,6 +1434,7 @@ mDNSlocal mDNSBool mDNSPlatformInit_CanReceiveUnicast(void) |
| 53 | int err; |
| 54 | int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); |
| 55 | struct sockaddr_in s5353; |
| 56 | + if (s < 0) return mDNSfalse; |
| 57 | s5353.sin_family = AF_INET; |
| 58 | s5353.sin_port = MulticastDNSPort.NotAnInteger; |
| 59 | s5353.sin_addr.s_addr = 0; |
| 60 | -- |
| 61 | 2.17.1 |
| 62 | |