diff mbox

nl80211: Zero num_modes if nl80211_get_hw_feature_data() fails

Message ID 1482932827-2035-2-git-send-email-andrei.otcheretianski@intel.com
State Accepted
Headers show

Commit Message

Andrei Otcheretianski Dec. 28, 2016, 1:47 p.m. UTC
It was possible that nl80211_get_hw_feature_data() function would return
NULL when num_modes is not set to zero. This might result in a later crash
when accessing hw.modes. This may be reproduced with hwsim oom tests, for
example, dbus_connect_oom.
Fix that by zeroing num_modes if NULL is returned.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
---
 src/drivers/driver_nl80211_capa.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Jouni Malinen Dec. 30, 2016, 9:45 p.m. UTC | #1
On Wed, Dec 28, 2016 at 03:47:07PM +0200, Andrei Otcheretianski wrote:
> It was possible that nl80211_get_hw_feature_data() function would return
> NULL when num_modes is not set to zero. This might result in a later crash
> when accessing hw.modes. This may be reproduced with hwsim oom tests, for
> example, dbus_connect_oom.
> Fix that by zeroing num_modes if NULL is returned.

I haven't been able to reproduce this.. Would you be able to identify
the caller that does not check the returned pointer? There should be no
places where *num_modes is used if NULL is returned..

> diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
> @@ -1771,6 +1771,7 @@ nl80211_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
>  				os_free(result.modes[i].rates);
>  			}
>  			os_free(result.modes);
> +			*num_modes = 0;
>  			return NULL;
>  		}
>  		return wpa_driver_nl80211_postprocess_modes(result.modes,

This does not look like a complete fix since the function can return
NULL also if processing of NL80211_CMD_GET_WIPHY response fails. I'd
assume this could potentially happen after having already incremented
*num_modes. In any case, if this can really be hit with the current
hostap.git snapshot, more appropriate fix would be to modify the caller
that uses *num_modes if NULL is returned from get_hw_feature_data().
Andrei Otcheretianski Jan. 2, 2017, 12:46 p.m. UTC | #2
> -----Original Message-----
> From: Jouni Malinen [mailto:j@w1.fi]
> Sent: Friday, December 30, 2016 23:45
> To: Otcheretianski, Andrei <andrei.otcheretianski@intel.com>
> Cc: hostap@lists.infradead.org
> Subject: Re: [PATCH] nl80211: Zero num_modes if
> nl80211_get_hw_feature_data() fails
> 
> On Wed, Dec 28, 2016 at 03:47:07PM +0200, Andrei Otcheretianski wrote:
> > It was possible that nl80211_get_hw_feature_data() function would
> > return NULL when num_modes is not set to zero. This might result in a
> > later crash when accessing hw.modes. This may be reproduced with hwsim
> > oom tests, for example, dbus_connect_oom.
> > Fix that by zeroing num_modes if NULL is returned.
> 
> I haven't been able to reproduce this.. Would you be able to identify the
> caller that does not check the returned pointer? There should be no places
> where *num_modes is used if NULL is returned..

Here is my log from dbus_connect_oom:

1483359087.370642: WPA_TRACE: eloop SIGSEGV - START
1483359087.375423: [1]: /home/tester/maintain/iwlwifi-hostap/tests/hwsim/../../wpa_supplicant/wpa_supplicant() [0x44c56e]
1483359087.375895:      eloop_sigsegv_handler() ../src/utils/eloop.c:123
1483359087.389225: [2]: /lib/x86_64-linux-gnu/libc.so.6(+0x36d40) [0x7efeb2282d40]
1483359087.389904: [3]: /home/tester/maintain/iwlwifi-hostap/tests/hwsim/../../wpa_supplicant/wpa_supplicant(get_mode+0x5) [0x586925]
1483359087.390466:      get_mode() wpa_supplicant.c:6858
1483359087.391223: [4]: /home/tester/maintain/iwlwifi-hostap/tests/hwsim/../../wpa_supplicant/wpa_supplicant(wpas_supp_op_class_ie+0xe5) [0x448ed5]
1483359087.391750:      wpas_op_class_supported() op_classes.c:203
1483359087.392341:      wpas_supp_op_class_ie() op_classes.c:291
1483359087.393186: [5]: /home/tester/maintain/iwlwifi-hostap/tests/hwsim/../../wpa_supplicant/wpa_supplicant() [0x569ed3]
1483359087.393553:      sme_send_authentication() sme.c:445
1483359087.394147: [6]: /home/tester/maintain/iwlwifi-hostap/tests/hwsim/../../wpa_supplicant/wpa_supplicant() [0x57f9f3]
1483359087.394583:      radio_start_next_work() wpa_supplicant.c:4462
1483359087.395122: [7]: /home/tester/maintain/iwlwifi-hostap/tests/hwsim/../../wpa_supplicant/wpa_supplicant(eloop_run+0x1bb) [0x44d4cb]
1483359087.395470:      eloop_run() ../src/utils/eloop.c:1196
1483359087.396030: [8]: /home/tester/maintain/iwlwifi-hostap/tests/hwsim/../../wpa_supplicant/wpa_supplicant(wpa_supplicant_run+0x77) [0x580ec7]
1483359087.396502:      wpa_supplicant_run() wpa_supplicant.c:5585
1483359087.396891: [9]: /home/tester/maintain/iwlwifi-hostap/tests/hwsim/../../wpa_supplicant/wpa_supplicant(main+0x3a8) [0x43b7b8]
1483359087.397441:      main() main.c:392
1483359087.397824: WPA_TRACE: eloop SIGSEGV - END
> 
> > diff --git a/src/drivers/driver_nl80211_capa.c
> > b/src/drivers/driver_nl80211_capa.c
> > @@ -1771,6 +1771,7 @@ nl80211_get_hw_feature_data(void *priv, u16
> *num_modes, u16 *flags)
> >  				os_free(result.modes[i].rates);
> >  			}
> >  			os_free(result.modes);
> > +			*num_modes = 0;
> >  			return NULL;
> >  		}
> >  		return
> wpa_driver_nl80211_postprocess_modes(result.modes,
> 
> This does not look like a complete fix since the function can return NULL also
> if processing of NL80211_CMD_GET_WIPHY response fails. I'd assume this
> could potentially happen after having already incremented *num_modes.

I don't see how it can happen without having result.failed == 1.

> In any case, if this can really be hit with the current hostap.git snapshot, more
> appropriate fix would be to modify the caller that uses *num_modes if NULL
> is returned from get_hw_feature_data().

IMHO get_hw_feature_data() must be consistent and should set num_modes = 0 when it returns NULL,
at least this is what can be understood from it's documentation "@num_modes: Variable for returning the number of returned modes"

> 
> --
> Jouni Malinen                                            PGP id EFC895FA
Jouni Malinen Jan. 5, 2017, 4:24 p.m. UTC | #3
On Wed, Dec 28, 2016 at 03:47:07PM +0200, Andrei Otcheretianski wrote:
> It was possible that nl80211_get_hw_feature_data() function would return
> NULL when num_modes is not set to zero. This might result in a later crash
> when accessing hw.modes. This may be reproduced with hwsim oom tests, for
> example, dbus_connect_oom.
> Fix that by zeroing num_modes if NULL is returned.

Thanks, applied.
diff mbox

Patch

diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c
index 85706ef..1bea3ba 100644
--- a/src/drivers/driver_nl80211_capa.c
+++ b/src/drivers/driver_nl80211_capa.c
@@ -1771,6 +1771,7 @@  nl80211_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
 				os_free(result.modes[i].rates);
 			}
 			os_free(result.modes);
+			*num_modes = 0;
 			return NULL;
 		}
 		return wpa_driver_nl80211_postprocess_modes(result.modes,