From 071d7d3e3fe601fec2997bca363faad62414c1c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 29 Oct 2020 12:47:46 +0100 Subject: [PATCH] network/stack: assume zero length ioctl requests are valid MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit posix ioctl calls don't provide a request length. Theorically these length checks could be removed altogether. Change-Id: Ie53f10dc8d050dd3bdf2e5a792ed79f139a24d29 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3364 Reviewed-by: Jérôme Duval --- src/add-ons/kernel/network/stack/datalink.cpp | 17 +++++++++-------- src/add-ons/kernel/network/stack/link.cpp | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/add-ons/kernel/network/stack/datalink.cpp b/src/add-ons/kernel/network/stack/datalink.cpp index 74ed66b354..8fa8c6c620 100644 --- a/src/add-ons/kernel/network/stack/datalink.cpp +++ b/src/add-ons/kernel/network/stack/datalink.cpp @@ -134,7 +134,7 @@ get_interface_name_or_index(net_domain* domain, int32 option, void* value, ASSERT(option == SIOCGIFINDEX || option == SIOCGIFNAME); size_t expected = option == SIOCGIFINDEX ? IF_NAMESIZE : sizeof(ifreq); - if (*_length < expected) + if (*_length > 0 && *_length < expected) return B_BAD_VALUE; ifreq request; @@ -215,7 +215,7 @@ datalink_control(net_domain* _domain, int32 option, void* value, case SIOCAIFADDR: /* same as B_SOCKET_ADD_ALIAS */ { // add new interface address - if (*_length < sizeof(struct ifaliasreq)) + if (*_length > 0 && *_length < sizeof(struct ifaliasreq)) return B_BAD_VALUE; struct ifaliasreq request; @@ -320,10 +320,9 @@ datalink_control(net_domain* _domain, int32 option, void* value, default: { // We also accept partial ifreqs as long as the name is complete. - if (*_length < IF_NAMESIZE) - return B_BAD_VALUE; - - size_t length = min_c(sizeof(struct ifreq), *_length); + size_t length = sizeof(struct ifreq); + if (*_length > 0 && *_length >= IF_NAMESIZE) + length = min_c(length, *_length); // try to pass the request to an existing interface struct ifreq request; @@ -754,7 +753,9 @@ interface_protocol_control(net_datalink_protocol* _protocol, int32 option, case SIOCGIFBRDADDR: case SIOCGIFDSTADDR: { - if (length < sizeof(ifreq)) + if (length == 0) + length = sizeof(ifreq); + else if (length < sizeof(ifreq)) return B_BAD_VALUE; ifreq request; @@ -920,7 +921,7 @@ interface_protocol_control(net_datalink_protocol* _protocol, int32 option, case SIOCGIFMEDIA: { // get media - if (length < sizeof(ifmediareq)) + if (length > 0 && length < sizeof(ifmediareq)) return B_BAD_VALUE; struct ifmediareq request; diff --git a/src/add-ons/kernel/network/stack/link.cpp b/src/add-ons/kernel/network/stack/link.cpp index c88f19b497..12f20ade7e 100644 --- a/src/add-ons/kernel/network/stack/link.cpp +++ b/src/add-ons/kernel/network/stack/link.cpp @@ -455,7 +455,7 @@ link_control(net_protocol* _protocol, int level, int option, void* value, case SIOCGIFMEDIA: { // get media - if (*_length < sizeof(ifmediareq)) + if (*_length > 0 && *_length < sizeof(ifmediareq)) return B_BAD_VALUE; net_device_interface* interface;