rndis_host: fix oops when query for OID_GEN_PHYSICAL_MEDIUM fails
Subsystems (3)
PATCH RESEND 1/1 rndis_host: fix oops when query for OID_GEN_PHYSICAL_MEDIUM fails
From: Jussi Kivilinna <[email protected]>
When query for OID_GEN_PHYSICAL_MEDIUM fails, uninitialized pointer 'phym' is being accessed in generic_rndis_bind(), resulting OOPS. Patch fixes phym to be initialized and setup correctly when rndis_query() for physical medium fails.
Bug was introduced by following commit:
commit 039ee17d1baabaa21783a0d5ab3e8c6d8c794bdf
Author: Jussi Kivilinna <[email protected]> Date: Sun Jan 27 23:34:33 2008 +0200
---
drivers/net/usb/rndis_host.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)
drivers/net/usb/rndis_host.c +6 -3
@@ -287,7 +287,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)struct rndis_set_c *set_c;struct rndis_halt *halt; } u; -u32 tmp, *phym; +u32 tmp, phym_unspec, *phym;int reply_len;unsigned char *bp;
@@ -359,12 +359,15 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) goto halt_fail_and_release;/* Check physical medium */ + phym =NULL ; reply_len =sizeof *phym; retval =rndis_query (dev, intf, u.buf,OID_GEN_PHYSICAL_MEDIUM ,0 , (void **) &phym, &reply_len); -if (retval !=0 ) +if (retval !=0 || !phym) {/* OID is optional so don't fail here. */ - *phym =RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED ; + phym_unspec =RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED ; + phym = &phym_unspec; + }if ((flags &FLAG_RNDIS_PHYM_WIRELESS ) && *phym !=RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN ) {if (netif_msg_probe (dev))
Jeff Garzik
AppliedQuoted 38 lines · Jussi Kivilinna
From: Jussi Kivilinna <[email protected]>
When query for
OID_GEN_PHYSICAL_MEDIUMfails, uninitialized pointer 'phym' is being accessed ingeneric_rndis_bind(), resulting OOPS. Patch fixes phym to be initialized and setup correctly whenrndis_query()for physical medium fails.Bug was introduced by following commit:
commit039ee17d1baabaa21783a0d5ab3e8c6d8c794bdfAuthor: Jussi Kivilinna <[email protected]> Date: Sun Jan 27 23:34:33 2008 +0200Reported-by Dmitri Monakhov <[email protected]>Signed-off-by Jussi Kivilinna <[email protected]>Acked-by David Brownell <[email protected]>---
drivers/net/usb/rndis_host.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)drivers/net/usb/rndis_host.c +2
-1@@ -287,7 +287,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)struct rndis_set_c *set_c;struct rndis_halt *halt; } u; -u32 tmp, *phym; +u32 tmp, phym_unspec, *phym;int reply_len;unsigned char *bp;@@ -359,12 +359,15 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) goto halt_fail_and_release;/* Check physical medium */ + phym =NULL ;
drivers/net/usb/rndis_host.c generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) · line 370
Quoted 10 lines
drivers/net/usb/rndis_host.c +4
-2reply_len =sizeof *phym; retval =rndis_query (dev, intf, u.buf,OID_GEN_PHYSICAL_MEDIUM ,0 , (void **) &phym, &reply_len); -if (retval !=0 ) +if (retval !=0 || !phym) {/* OID is optional so don't fail here. */ - *phym =RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED ; + phym_unspec =RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED ; + phym = &phym_unspec; + }
applied