[haiku-commits] haiku: hrev54690 - src/add-ons/kernel/network/stack

  • From: Jérôme Duval <jerome.duval@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 31 Oct 2020 04:15:15 -0400 (EDT)

hrev54690 adds 1 changeset to branch 'master'
old head: 072d3935c2497638e9c2502f574c133caeba9d3d
new head: 071d7d3e3fe601fec2997bca363faad62414c1c7
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=071d7d3e3fe6+%5E072d3935c249

----------------------------------------------------------------------------

071d7d3e3fe6: network/stack: assume zero length ioctl requests are valid
  
  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 <jerome.duval@xxxxxxxxx>

                                   [ Jérôme Duval <jerome.duval@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev54690
Commit:      071d7d3e3fe601fec2997bca363faad62414c1c7
URL:         https://git.haiku-os.org/haiku/commit/?id=071d7d3e3fe6
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Thu Oct 29 11:47:46 2020 UTC

----------------------------------------------------------------------------

2 files changed, 10 insertions(+), 9 deletions(-)
src/add-ons/kernel/network/stack/datalink.cpp | 17 +++++++++--------
src/add-ons/kernel/network/stack/link.cpp     |  2 +-

----------------------------------------------------------------------------

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;


Other related posts:

  • » [haiku-commits] haiku: hrev54690 - src/add-ons/kernel/network/stack - Jérôme Duval