* NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h)
@ 2009-10-07 19:16 Hin-Tak Leung
2009-10-07 19:28 ` Hin-Tak Leung
0 siblings, 1 reply; 14+ messages in thread
From: Hin-Tak Leung @ 2009-10-07 19:16 UTC (permalink / raw)
To: Luis R. Rodriguez, John W. Linville; +Cc: linux-wireless
On Wed, Oct 7, 2009 at 4:22 PM, Luis R. Rodriguez
<lrodriguez@atheros.com> wrote:
> On Wed, Oct 7, 2009 at 10:45 AM, John W. Linville
> <linville@tuxdriver.com> wrote:
>> On Wed, Oct 07, 2009 at 01:40:04AM -0400, Luis R. Rodriguez wrote:
>>> On Tue, Oct 6, 2009 at 11:39 PM, Hin-Tak Leung <hintak.leung@gmail.com> wrote:
>>> > Between 2.6.30 and 2.6.31, linux/netdevice.h started
>>> > to include linux/ethtool.h (commit b1b67dd45a6b629eb41553856805aaa1614fbb83,
>>> > "net: factor out ethtool invocation of vlan/macvlan drivers"),
>>> > and commit 7508e486965b0af13984bc6d9da62a8d8f0dc5f9,
>>> > "cfg80211: add firmware and hardware version to wiphy", introduces
>>> > dependency of ETHTOOL_BUSINFO_LEN from linux/ethtool.h
>>> > to net/cfg80211.h .
>>>
>>> John's patch titled "cfg80211: fix compile error from missing
>>> ethtool.h" seems to address this upstream. I'll wait until he applies
>>> that to the tree.
>>
>> As Hin-Tak points-out, linux/netdevice.h is alreadying "doing the needful". :-)
>>
>> I'll just drop my patch and let this get sorted in compat-wireless.
>
> Heh ok applied, thanks.
>
> Luis
>
It is probably just a transient problem with recent activities - I had
a NULL pointer deref from loading rtl8187 of compat-wireless
v2.6.32-rc3-39563-g98c2609 -
BUG: unable to handle kernel NULL pointer dereference at 000000000000003d
IP: [<ffffffff8147822c>] wext_ioctl_dispatch+0xd9/0x180
PGD 61c2b067 PUD 6246f067 PMD 0
Oops: 0000 [#1] SMP
...
Call Trace:
[<ffffffff814783f5>] wext_handle_ioctl+0x4d/0x98
[<ffffffff813e53a5>] dev_ioctl+0x625/0x662
[<ffffffff813cfa45>] sock_ioctl+0x225/0x248
[<ffffffff811237a3>] vfs_ioctl+0x31/0xaa
[<ffffffff811e1801>] ? security_d_instantiate+0x37/0x4d
[<ffffffff81123c88>] do_vfs_ioctl+0x46c/0x4c3
[<ffffffff81123d44>] sys_ioctl+0x65/0x9c
[<ffffffff81012082>] system_call_fastpath+0x16/0x1b
I'm sure whatever changes made this happen will go away soon, so I'll
just re-try in a few days... but if anybody knows what commit causes
this (and what fixes it!), I'd like to know.
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-07 19:16 NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) Hin-Tak Leung @ 2009-10-07 19:28 ` Hin-Tak Leung 2009-10-07 22:01 ` Johannes Berg 0 siblings, 1 reply; 14+ messages in thread From: Hin-Tak Leung @ 2009-10-07 19:28 UTC (permalink / raw) To: Luis R. Rodriguez, John W. Linville, Johannes Berg; +Cc: linux-wireless On Wed, Oct 7, 2009 at 8:16 PM, Hin-Tak Leung <hintak.leung@gmail.com> wrote: > It is probably just a transient problem with recent activities - I had > a NULL pointer deref from loading rtl8187 of compat-wireless > v2.6.32-rc3-39563-g98c2609 - > > BUG: unable to handle kernel NULL pointer dereference at 000000000000003d > IP: [<ffffffff8147822c>] wext_ioctl_dispatch+0xd9/0x180 > PGD 61c2b067 PUD 6246f067 PMD 0 > Oops: 0000 [#1] SMP > ... > Call Trace: > [<ffffffff814783f5>] wext_handle_ioctl+0x4d/0x98 > [<ffffffff813e53a5>] dev_ioctl+0x625/0x662 > [<ffffffff813cfa45>] sock_ioctl+0x225/0x248 > [<ffffffff811237a3>] vfs_ioctl+0x31/0xaa > [<ffffffff811e1801>] ? security_d_instantiate+0x37/0x4d > [<ffffffff81123c88>] do_vfs_ioctl+0x46c/0x4c3 > [<ffffffff81123d44>] sys_ioctl+0x65/0x9c > [<ffffffff81012082>] system_call_fastpath+0x16/0x1b > > I'm sure whatever changes made this happen will go away soon, so I'll > just re-try in a few days... but if anybody knows what commit causes > this (and what fixes it!), I'd like to know. > Hiya, It looks like I last used compat-wireless successfully was on 25th (I am not saying it breaks after - I just haven't tried until yesterday, possibly), and most of the recent changes are per-driver, but there is a big code drop from Johannes dated 27th on 'wext: refactor' . Changes from that or dependent changes? ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-07 19:28 ` Hin-Tak Leung @ 2009-10-07 22:01 ` Johannes Berg 2009-10-08 6:28 ` Hin-Tak Leung 0 siblings, 1 reply; 14+ messages in thread From: Johannes Berg @ 2009-10-07 22:01 UTC (permalink / raw) To: Hin-Tak Leung; +Cc: Luis R. Rodriguez, John W. Linville, linux-wireless [-- Attachment #1: Type: text/plain, Size: 1777 bytes --] On Wed, 2009-10-07 at 20:28 +0100, Hin-Tak Leung wrote: > On Wed, Oct 7, 2009 at 8:16 PM, Hin-Tak Leung <hintak.leung@gmail.com> wrote: > > > It is probably just a transient problem with recent activities - I had > > a NULL pointer deref from loading rtl8187 of compat-wireless > > v2.6.32-rc3-39563-g98c2609 - > > > > BUG: unable to handle kernel NULL pointer dereference at 000000000000003d > > IP: [<ffffffff8147822c>] wext_ioctl_dispatch+0xd9/0x180 > > PGD 61c2b067 PUD 6246f067 PMD 0 > > Oops: 0000 [#1] SMP > > ... > > Call Trace: > > [<ffffffff814783f5>] wext_handle_ioctl+0x4d/0x98 > > [<ffffffff813e53a5>] dev_ioctl+0x625/0x662 > > [<ffffffff813cfa45>] sock_ioctl+0x225/0x248 > > [<ffffffff811237a3>] vfs_ioctl+0x31/0xaa > > [<ffffffff811e1801>] ? security_d_instantiate+0x37/0x4d > > [<ffffffff81123c88>] do_vfs_ioctl+0x46c/0x4c3 > > [<ffffffff81123d44>] sys_ioctl+0x65/0x9c > > [<ffffffff81012082>] system_call_fastpath+0x16/0x1b > > > > I'm sure whatever changes made this happen will go away soon, so I'll > > just re-try in a few days... but if anybody knows what commit causes > > this (and what fixes it!), I'd like to know. > > > > Hiya, It looks like I last used compat-wireless successfully was on > 25th (I am not saying it breaks after - I just haven't tried until > yesterday, possibly), and most of the recent changes are per-driver, > but there is a big code drop from Johannes dated 27th on 'wext: > refactor' . Changes from that or dependent changes? Probably -- but I don't see this problem on stock kernel and I'm not sure what could be causing it for compat-wireless. This will be the old copy of wext_ioctl_dispatch. It'd certainly help to get disassembly/the source line of the oops. johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 801 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-07 22:01 ` Johannes Berg @ 2009-10-08 6:28 ` Hin-Tak Leung 2009-10-08 9:51 ` Johannes Berg 0 siblings, 1 reply; 14+ messages in thread From: Hin-Tak Leung @ 2009-10-08 6:28 UTC (permalink / raw) To: Johannes Berg; +Cc: Luis R. Rodriguez, John W. Linville, linux-wireless [-- Attachment #1: Type: text/plain, Size: 2916 bytes --] On Wed, Oct 7, 2009 at 11:01 PM, Johannes Berg <johannes@sipsolutions.net> wrote: > On Wed, 2009-10-07 at 20:28 +0100, Hin-Tak Leung wrote: >> On Wed, Oct 7, 2009 at 8:16 PM, Hin-Tak Leung <hintak.leung@gmail.com> wrote: >> >> > It is probably just a transient problem with recent activities - I had >> > a NULL pointer deref from loading rtl8187 of compat-wireless >> > v2.6.32-rc3-39563-g98c2609 - >> > >> > BUG: unable to handle kernel NULL pointer dereference at 000000000000003d >> > IP: [<ffffffff8147822c>] wext_ioctl_dispatch+0xd9/0x180 >> > PGD 61c2b067 PUD 6246f067 PMD 0 >> > Oops: 0000 [#1] SMP >> > ... >> > Call Trace: >> > [<ffffffff814783f5>] wext_handle_ioctl+0x4d/0x98 >> > [<ffffffff813e53a5>] dev_ioctl+0x625/0x662 >> > [<ffffffff813cfa45>] sock_ioctl+0x225/0x248 >> > [<ffffffff811237a3>] vfs_ioctl+0x31/0xaa >> > [<ffffffff811e1801>] ? security_d_instantiate+0x37/0x4d >> > [<ffffffff81123c88>] do_vfs_ioctl+0x46c/0x4c3 >> > [<ffffffff81123d44>] sys_ioctl+0x65/0x9c >> > [<ffffffff81012082>] system_call_fastpath+0x16/0x1b >> > >> > I'm sure whatever changes made this happen will go away soon, so I'll >> > just re-try in a few days... but if anybody knows what commit causes >> > this (and what fixes it!), I'd like to know. >> > >> >> Hiya, It looks like I last used compat-wireless successfully was on >> 25th (I am not saying it breaks after - I just haven't tried until >> yesterday, possibly), and most of the recent changes are per-driver, >> but there is a big code drop from Johannes dated 27th on 'wext: >> refactor' . Changes from that or dependent changes? > > Probably -- but I don't see this problem on stock kernel and I'm not > sure what could be causing it for compat-wireless. > > This will be the old copy of wext_ioctl_dispatch. It'd certainly help to > get disassembly/the source line of the oops. > > johannes > The crash came from the fedora koji kernel 2.6.30.8-67.fc11.x86_64 (+ bleed-edge compat-wireless), so John can probably correct me if I am doing wrong or he can probably provide a better answer based on the info. I installed the debug packages kernel-debuginfo-2.6.30.8-67.fc11 , kernel-debuginfo-common-x86_64-2.6.30.8-67.fc11 , then dump the whole thing to work out the address, before selecting the adress as: objdump -l -d --start-address=0xffffffff81478153 --stop-address=0xffffffff81478440 -S /usr/lib/debug/lib/modules/2.6.30.8-67.fc11.x86_64/vmlinux It looks like it is the 2nd of thes two lines around /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:448 which resulted in the null pointer dereference: if (index < dev->wireless_handlers->num_private) return dev->wireless_handlers->private[index]; Is there a more clever way of working out the addresses? I guess I should have just subtracted and added a few k off the crash message, rather than dumping the whole kernel to work out the addresses... [-- Attachment #2: kernel-objdump-withlines --] [-- Type: application/octet-stream, Size: 27217 bytes --] /usr/lib/debug/lib/modules/2.6.30.8-67.fc11.x86_64/vmlinux: file format elf64-x86-64 Disassembly of section .text: ffffffff81478153 <wext_ioctl_dispatch>: wext_ioctl_dispatch(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1087 /* entry point from dev ioctl */ static int wext_ioctl_dispatch(struct net *net, struct ifreq *ifr, unsigned int cmd, struct iw_request_info *info, wext_ioctl_func standard, wext_ioctl_func private) { ffffffff81478153: 55 push %rbp ffffffff81478154: 48 89 e5 mov %rsp,%rbp ffffffff81478157: 41 56 push %r14 ffffffff81478159: 41 55 push %r13 ffffffff8147815b: 41 54 push %r12 ffffffff8147815d: 53 push %rbx ffffffff8147815e: 48 83 ec 20 sub $0x20,%rsp ffffffff81478162: e8 99 9c b9 ff callq ffffffff81011e00 <mcount> ffffffff81478167: 65 48 8b 04 25 28 00 mov %gs:0x28,%rax ffffffff8147816e: 00 00 ffffffff81478170: 48 89 45 d8 mov %rax,-0x28(%rbp) ffffffff81478174: 31 c0 xor %eax,%eax wext_permission_check(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1075 /* If command is `set a parameter', or `get the encoding parameters', * check if the user has the right to do it. */ static int wext_permission_check(unsigned int cmd) { if ((IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT) ffffffff81478176: f6 c2 01 test $0x1,%dl wext_ioctl_dispatch(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1087 /* entry point from dev ioctl */ static int wext_ioctl_dispatch(struct net *net, struct ifreq *ifr, unsigned int cmd, struct iw_request_info *info, wext_ioctl_func standard, wext_ioctl_func private) { ffffffff81478179: 49 89 fd mov %rdi,%r13 ffffffff8147817c: 48 89 f3 mov %rsi,%rbx ffffffff8147817f: 4d 89 c4 mov %r8,%r12 ffffffff81478182: 4d 89 ce mov %r9,%r14 wext_permission_check(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1075 /* If command is `set a parameter', or `get the encoding parameters', * check if the user has the right to do it. */ static int wext_permission_check(unsigned int cmd) { if ((IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT) ffffffff81478185: 74 14 je ffffffff8147819b <wext_ioctl_dispatch+0x48> ffffffff81478187: 81 fa 2b 8b 00 00 cmp $0x8b2b,%edx ffffffff8147818d: 74 0c je ffffffff8147819b <wext_ioctl_dispatch+0x48> ffffffff8147818f: 81 fa 35 8b 00 00 cmp $0x8b35,%edx ffffffff81478195: 0f 85 ef 00 00 00 jne ffffffff8147828a <wext_ioctl_dispatch+0x137> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1076 && !capable(CAP_NET_ADMIN)) ffffffff8147819b: bf 0c 00 00 00 mov $0xc,%edi ffffffff814781a0: 89 55 c8 mov %edx,-0x38(%rbp) ffffffff814781a3: 48 89 4d c0 mov %rcx,-0x40(%rbp) ffffffff814781a7: e8 78 8c be ff callq ffffffff81060e24 <capable> ffffffff814781ac: 89 c6 mov %eax,%esi /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1075 /* If command is `set a parameter', or `get the encoding parameters', * check if the user has the right to do it. */ static int wext_permission_check(unsigned int cmd) { if ((IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT) ffffffff814781ae: 83 c8 ff or $0xffffffffffffffff,%eax ffffffff814781b1: 8b 55 c8 mov -0x38(%rbp),%edx ffffffff814781b4: 85 f6 test %esi,%esi ffffffff814781b6: 48 8b 4d c0 mov -0x40(%rbp),%rcx ffffffff814781ba: 0f 84 b9 00 00 00 je ffffffff81478279 <wext_ioctl_dispatch+0x126> ffffffff814781c0: e9 c5 00 00 00 jmpq ffffffff8147828a <wext_ioctl_dispatch+0x137> wireless_process_ioctl(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1043 return -ENODEV; /* A bunch of special cases, then the generic case... * Note that 'cmd' is already filtered in dev_ioctl() with * (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) */ if (cmd == SIOCGIWSTATS) ffffffff814781c5: 81 fa 0f 8b 00 00 cmp $0x8b0f,%edx /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1044 return standard(dev, iwr, cmd, info, ffffffff814781cb: 49 c7 c0 06 7c 47 81 mov $0xffffffff81477c06,%r8 /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1043 return -ENODEV; /* A bunch of special cases, then the generic case... * Note that 'cmd' is already filtered in dev_ioctl() with * (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) */ if (cmd == SIOCGIWSTATS) ffffffff814781d2: 74 69 je ffffffff8147823d <wext_ioctl_dispatch+0xea> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1047 return standard(dev, iwr, cmd, info, &iw_handler_get_iwstats); if (cmd == SIOCGIWPRIV && dev->wireless_handlers) ffffffff814781d4: 81 fa 0d 8b 00 00 cmp $0x8b0d,%edx ffffffff814781da: 75 11 jne ffffffff814781ed <wext_ioctl_dispatch+0x9a> ffffffff814781dc: 48 83 bf 38 01 00 00 cmpq $0x0,0x138(%rdi) ffffffff814781e3: 00 /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1048 return standard(dev, iwr, cmd, info, ffffffff814781e4: 49 c7 c0 86 7b 47 81 mov $0xffffffff81477b86,%r8 /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1047 * (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) */ if (cmd == SIOCGIWSTATS) return standard(dev, iwr, cmd, info, &iw_handler_get_iwstats); if (cmd == SIOCGIWPRIV && dev->wireless_handlers) ffffffff814781eb: 75 50 jne ffffffff8147823d <wext_ioctl_dispatch+0xea> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1052 return standard(dev, iwr, cmd, info, &iw_handler_get_private); /* Basic check */ if (!netif_device_present(dev)) ffffffff814781ed: f6 47 48 02 testb $0x2,0x48(%rdi) ffffffff814781f1: 74 76 je ffffffff81478269 <wext_ioctl_dispatch+0x116> get_handler(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:437 { /* Don't "optimise" the following variable, it will crash */ unsigned int index; /* *MUST* be unsigned */ /* Check if we have some wireless handlers defined */ if (dev->wireless_handlers == NULL) ffffffff814781f3: 48 8b 87 38 01 00 00 mov 0x138(%rdi),%rax ffffffff814781fa: 48 85 c0 test %rax,%rax ffffffff814781fd: 74 4e je ffffffff8147824d <wext_ioctl_dispatch+0xfa> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:442 return NULL; /* Try as a standard command */ index = cmd - SIOCIWFIRST; if (index < dev->wireless_handlers->num_standard) ffffffff814781ff: 44 0f b7 00 movzwl (%rax),%r8d /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:441 /* Check if we have some wireless handlers defined */ if (dev->wireless_handlers == NULL) return NULL; /* Try as a standard command */ index = cmd - SIOCIWFIRST; ffffffff81478203: 8d b2 00 75 ff ff lea -0x8b00(%rdx),%esi /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:442 if (index < dev->wireless_handlers->num_standard) ffffffff81478209: 44 39 c6 cmp %r8d,%esi ffffffff8147820c: 73 08 jae ffffffff81478216 <wext_ioctl_dispatch+0xc3> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:443 return dev->wireless_handlers->standard[index]; ffffffff8147820e: 89 f6 mov %esi,%esi ffffffff81478210: 48 8b 40 08 mov 0x8(%rax),%rax ffffffff81478214: eb 16 jmp ffffffff8147822c <wext_ioctl_dispatch+0xd9> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:447 /* Try as a private command */ index = cmd - SIOCIWFIRSTPRIV; if (index < dev->wireless_handlers->num_private) ffffffff81478216: 44 0f b7 40 02 movzwl 0x2(%rax),%r8d /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:446 index = cmd - SIOCIWFIRST; if (index < dev->wireless_handlers->num_standard) return dev->wireless_handlers->standard[index]; /* Try as a private command */ index = cmd - SIOCIWFIRSTPRIV; ffffffff8147821b: 8d b2 20 74 ff ff lea -0x8be0(%rdx),%esi /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:447 if (index < dev->wireless_handlers->num_private) ffffffff81478221: 44 39 c6 cmp %r8d,%esi ffffffff81478224: 73 27 jae ffffffff8147824d <wext_ioctl_dispatch+0xfa> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:448 return dev->wireless_handlers->private[index]; ffffffff81478226: 48 8b 40 10 mov 0x10(%rax),%rax ffffffff8147822a: 89 f6 mov %esi,%esi ffffffff8147822c: 4c 8b 04 f0 mov (%rax,%rsi,8),%r8 wireless_process_ioctl(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1057 if (!netif_device_present(dev)) return -ENODEV; /* New driver API : try to find the handler */ handler = get_handler(dev, cmd); if (handler) { ffffffff81478230: 4d 85 c0 test %r8,%r8 ffffffff81478233: 74 18 je ffffffff8147824d <wext_ioctl_dispatch+0xfa> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1059 /* Standard and private are not the same */ if (cmd < SIOCIWFIRSTPRIV) ffffffff81478235: 81 fa df 8b 00 00 cmp $0x8bdf,%edx ffffffff8147823b: 77 08 ja ffffffff81478245 <wext_ioctl_dispatch+0xf2> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1060 return standard(dev, iwr, cmd, info, handler); ffffffff8147823d: 48 89 de mov %rbx,%rsi ffffffff81478240: 41 ff d4 callq *%r12 ffffffff81478243: eb 29 jmp ffffffff8147826e <wext_ioctl_dispatch+0x11b> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1062 else return private(dev, iwr, cmd, info, handler); ffffffff81478245: 48 89 de mov %rbx,%rsi ffffffff81478248: 41 ff d6 callq *%r14 ffffffff8147824b: eb 21 jmp ffffffff8147826e <wext_ioctl_dispatch+0x11b> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1065 } /* Old driver API : call driver ioctl handler */ if (dev->netdev_ops->ndo_do_ioctl) ffffffff8147824d: 48 8b 87 48 01 00 00 mov 0x148(%rdi),%rax ffffffff81478254: 48 8b 48 58 mov 0x58(%rax),%rcx ffffffff81478258: b8 a1 ff ff ff mov $0xffffffa1,%eax ffffffff8147825d: 48 85 c9 test %rcx,%rcx ffffffff81478260: 74 0c je ffffffff8147826e <wext_ioctl_dispatch+0x11b> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1066 return dev->netdev_ops->ndo_do_ioctl(dev, ifr, cmd); ffffffff81478262: 48 89 de mov %rbx,%rsi ffffffff81478265: ff d1 callq *%rcx ffffffff81478267: eb 05 jmp ffffffff8147826e <wext_ioctl_dispatch+0x11b> ffffffff81478269: b8 ed ff ff ff mov $0xffffffed,%eax wext_ioctl_dispatch(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1096 return ret; dev_load(net, ifr->ifr_name); rtnl_lock(); ret = wireless_process_ioctl(net, ifr, cmd, info, standard, private); rtnl_unlock(); ffffffff8147826e: 89 45 c8 mov %eax,-0x38(%rbp) ffffffff81478271: e8 91 58 f7 ff callq ffffffff813edb07 <rtnl_unlock> ffffffff81478276: 8b 45 c8 mov -0x38(%rbp),%eax /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1099 return ret; } ffffffff81478279: 48 8b 55 d8 mov -0x28(%rbp),%rdx ffffffff8147827d: 65 48 33 14 25 28 00 xor %gs:0x28,%rdx ffffffff81478284: 00 00 ffffffff81478286: 74 3e je ffffffff814782c6 <wext_ioctl_dispatch+0x173> ffffffff81478288: eb 37 jmp ffffffff814782c1 <wext_ioctl_dispatch+0x16e> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1093 int ret = wext_permission_check(cmd); if (ret) return ret; dev_load(net, ifr->ifr_name); ffffffff8147828a: 48 89 de mov %rbx,%rsi ffffffff8147828d: 4c 89 ef mov %r13,%rdi ffffffff81478290: 89 55 c8 mov %edx,-0x38(%rbp) ffffffff81478293: 48 89 4d c0 mov %rcx,-0x40(%rbp) ffffffff81478297: e8 df c0 f6 ff callq ffffffff813e437b <dev_load> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1094 rtnl_lock(); ffffffff8147829c: e8 db 58 f7 ff callq ffffffff813edb7c <rtnl_lock> wireless_process_ioctl(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1037 /* Permissions are already checked in dev_ioctl() before calling us. * The copy_to/from_user() of ifr is also dealt with in there */ /* Make sure the device exist */ if ((dev = __dev_get_by_name(net, ifr->ifr_name)) == NULL) ffffffff814782a1: 4c 89 ef mov %r13,%rdi ffffffff814782a4: 48 89 de mov %rbx,%rsi ffffffff814782a7: e8 44 83 f6 ff callq ffffffff813e05f0 <__dev_get_by_name> ffffffff814782ac: 48 85 c0 test %rax,%rax ffffffff814782af: 48 89 c7 mov %rax,%rdi ffffffff814782b2: 8b 55 c8 mov -0x38(%rbp),%edx ffffffff814782b5: 48 8b 4d c0 mov -0x40(%rbp),%rcx ffffffff814782b9: 0f 85 06 ff ff ff jne ffffffff814781c5 <wext_ioctl_dispatch+0x72> ffffffff814782bf: eb a8 jmp ffffffff81478269 <wext_ioctl_dispatch+0x116> wext_ioctl_dispatch(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1099 rtnl_lock(); ret = wireless_process_ioctl(net, ifr, cmd, info, standard, private); rtnl_unlock(); return ret; } ffffffff814782c1: e8 c3 ef bd ff callq ffffffff81057289 <__stack_chk_fail> ffffffff814782c6: 48 83 c4 20 add $0x20,%rsp ffffffff814782ca: 5b pop %rbx ffffffff814782cb: 41 5c pop %r12 ffffffff814782cd: 41 5d pop %r13 ffffffff814782cf: 41 5e pop %r14 ffffffff814782d1: c9 leaveq ffffffff814782d2: c3 retq ffffffff814782d3 <compat_wext_handle_ioctl>: compat_wext_handle_ioctl(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1188 return ret; } int compat_wext_handle_ioctl(struct net *net, unsigned int cmd, unsigned long arg) { ffffffff814782d3: 55 push %rbp ffffffff814782d4: 48 89 e5 mov %rsp,%rbp ffffffff814782d7: 41 56 push %r14 ffffffff814782d9: 41 55 push %r13 ffffffff814782db: 41 54 push %r12 ffffffff814782dd: 53 push %rbx ffffffff814782de: 48 83 ec 40 sub $0x40,%rsp ffffffff814782e2: e8 19 9b b9 ff callq ffffffff81011e00 <mcount> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1195 struct iw_request_info info; struct iwreq iwr; char *colon; int ret; if (copy_from_user(&iwr, argp, sizeof(struct iwreq))) ffffffff814782e7: 4c 8d 65 b0 lea -0x50(%rbp),%r12 /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1188 return ret; } int compat_wext_handle_ioctl(struct net *net, unsigned int cmd, unsigned long arg) { ffffffff814782eb: 49 89 d5 mov %rdx,%r13 ffffffff814782ee: 49 89 fe mov %rdi,%r14 ffffffff814782f1: 89 f3 mov %esi,%ebx /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1195 struct iw_request_info info; struct iwreq iwr; char *colon; int ret; if (copy_from_user(&iwr, argp, sizeof(struct iwreq))) ffffffff814782f3: ba 20 00 00 00 mov $0x20,%edx ffffffff814782f8: 4c 89 ee mov %r13,%rsi ffffffff814782fb: 4c 89 e7 mov %r12,%rdi /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1188 return ret; } int compat_wext_handle_ioctl(struct net *net, unsigned int cmd, unsigned long arg) { ffffffff814782fe: 65 48 8b 04 25 28 00 mov %gs:0x28,%rax ffffffff81478305: 00 00 ffffffff81478307: 48 89 45 d8 mov %rax,-0x28(%rbp) ffffffff8147830b: 31 c0 xor %eax,%eax /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1195 struct iw_request_info info; struct iwreq iwr; char *colon; int ret; if (copy_from_user(&iwr, argp, sizeof(struct iwreq))) ffffffff8147830d: e8 3e 51 db ff callq ffffffff8122d450 <copy_from_user> ffffffff81478312: 48 85 c0 test %rax,%rax ffffffff81478315: 75 67 jne ffffffff8147837e <compat_wext_handle_ioctl+0xab> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1199 return -EFAULT; iwr.ifr_name[IFNAMSIZ-1] = 0; colon = strchr(iwr.ifr_name, ':'); ffffffff81478317: be 3a 00 00 00 mov $0x3a,%esi ffffffff8147831c: 4c 89 e7 mov %r12,%rdi /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1198 int ret; if (copy_from_user(&iwr, argp, sizeof(struct iwreq))) return -EFAULT; iwr.ifr_name[IFNAMSIZ-1] = 0; ffffffff8147831f: c6 45 bf 00 movb $0x0,-0x41(%rbp) /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1199 colon = strchr(iwr.ifr_name, ':'); ffffffff81478323: e8 d1 25 db ff callq ffffffff8122a8f9 <strchr> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1200 if (colon) ffffffff81478328: 48 85 c0 test %rax,%rax ffffffff8147832b: 74 03 je ffffffff81478330 <compat_wext_handle_ioctl+0x5d> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1201 *colon = 0; ffffffff8147832d: c6 00 00 movb $0x0,(%rax) /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1206 info.cmd = cmd; info.flags = IW_REQUEST_FLAG_COMPAT; ret = wext_ioctl_dispatch(net, (struct ifreq *) &iwr, cmd, &info, ffffffff81478330: 4c 8d 65 b0 lea -0x50(%rbp),%r12 ffffffff81478334: 48 8d 4d a0 lea -0x60(%rbp),%rcx ffffffff81478338: 4c 89 f7 mov %r14,%rdi ffffffff8147833b: 49 c7 c1 dc 7f 47 81 mov $0xffffffff81477fdc,%r9 ffffffff81478342: 49 c7 c0 df 8d 47 81 mov $0xffffffff81478ddf,%r8 ffffffff81478349: 89 da mov %ebx,%edx ffffffff8147834b: 4c 89 e6 mov %r12,%rsi /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1203 iwr.ifr_name[IFNAMSIZ-1] = 0; colon = strchr(iwr.ifr_name, ':'); if (colon) *colon = 0; info.cmd = cmd; ffffffff8147834e: 66 89 5d a0 mov %bx,-0x60(%rbp) /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1204 info.flags = IW_REQUEST_FLAG_COMPAT; ffffffff81478352: 66 c7 45 a2 01 00 movw $0x1,-0x5e(%rbp) /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1206 ret = wext_ioctl_dispatch(net, (struct ifreq *) &iwr, cmd, &info, ffffffff81478358: e8 f6 fd ff ff callq ffffffff81478153 <wext_ioctl_dispatch> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1210 compat_standard_call, compat_private_call); if (ret >= 0 && ffffffff8147835d: 85 c0 test %eax,%eax /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1206 *colon = 0; info.cmd = cmd; info.flags = IW_REQUEST_FLAG_COMPAT; ret = wext_ioctl_dispatch(net, (struct ifreq *) &iwr, cmd, &info, ffffffff8147835f: 41 89 c6 mov %eax,%r14d /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1210 compat_standard_call, compat_private_call); if (ret >= 0 && ffffffff81478362: 78 20 js ffffffff81478384 <compat_wext_handle_ioctl+0xb1> ffffffff81478364: 80 e3 01 and $0x1,%bl ffffffff81478367: 74 1b je ffffffff81478384 <compat_wext_handle_ioctl+0xb1> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1212 IW_IS_GET(cmd) && copy_to_user(argp, &iwr, sizeof(struct iwreq))) ffffffff81478369: ba 20 00 00 00 mov $0x20,%edx ffffffff8147836e: 4c 89 e6 mov %r12,%rsi ffffffff81478371: 4c 89 ef mov %r13,%rdi ffffffff81478374: e8 a7 50 db ff callq ffffffff8122d420 <copy_to_user> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1210 ret = wext_ioctl_dispatch(net, (struct ifreq *) &iwr, cmd, &info, compat_standard_call, compat_private_call); if (ret >= 0 && ffffffff81478379: 48 85 c0 test %rax,%rax ffffffff8147837c: 74 06 je ffffffff81478384 <compat_wext_handle_ioctl+0xb1> ffffffff8147837e: 41 be f2 ff ff ff mov $0xfffffff2,%r14d /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1216 IW_IS_GET(cmd) && copy_to_user(argp, &iwr, sizeof(struct iwreq))) return -EFAULT; return ret; } ffffffff81478384: 48 8b 55 d8 mov -0x28(%rbp),%rdx ffffffff81478388: 65 48 33 14 25 28 00 xor %gs:0x28,%rdx ffffffff8147838f: 00 00 ffffffff81478391: 44 89 f0 mov %r14d,%eax ffffffff81478394: 74 05 je ffffffff8147839b <compat_wext_handle_ioctl+0xc8> ffffffff81478396: e8 ee ee bd ff callq ffffffff81057289 <__stack_chk_fail> ffffffff8147839b: 48 83 c4 40 add $0x40,%rsp ffffffff8147839f: 5b pop %rbx ffffffff814783a0: 41 5c pop %r12 ffffffff814783a2: 41 5d pop %r13 ffffffff814783a4: 41 5e pop %r14 ffffffff814783a6: c9 leaveq ffffffff814783a7: c3 retq ffffffff814783a8 <wext_handle_ioctl>: wext_handle_ioctl(): /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1103 return ret; } int wext_handle_ioctl(struct net *net, struct ifreq *ifr, unsigned int cmd, void __user *arg) { ffffffff814783a8: 55 push %rbp ffffffff814783a9: 48 89 e5 mov %rsp,%rbp ffffffff814783ac: 41 56 push %r14 ffffffff814783ae: 41 55 push %r13 ffffffff814783b0: 41 54 push %r12 ffffffff814783b2: 53 push %rbx ffffffff814783b3: 48 83 ec 10 sub $0x10,%rsp ffffffff814783b7: e8 44 9a b9 ff callq ffffffff81011e00 <mcount> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1107 struct iw_request_info info = { .cmd = cmd, .flags = 0 }; int ret; ret = wext_ioctl_dispatch(net, ifr, cmd, &info, ffffffff814783bc: 49 c7 c1 b4 80 47 81 mov $0xffffffff814780b4,%r9 ffffffff814783c3: 49 c7 c0 10 8d 47 81 mov $0xffffffff81478d10,%r8 /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1103 return ret; } int wext_handle_ioctl(struct net *net, struct ifreq *ifr, unsigned int cmd, void __user *arg) { ffffffff814783ca: 49 89 cd mov %rcx,%r13 /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1107 struct iw_request_info info = { .cmd = cmd, .flags = 0 }; int ret; ret = wext_ioctl_dispatch(net, ifr, cmd, &info, ffffffff814783cd: 48 8d 4d d0 lea -0x30(%rbp),%rcx /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1103 return ret; } int wext_handle_ioctl(struct net *net, struct ifreq *ifr, unsigned int cmd, void __user *arg) { ffffffff814783d1: 48 89 f3 mov %rsi,%rbx ffffffff814783d4: 65 48 8b 04 25 28 00 mov %gs:0x28,%rax ffffffff814783db: 00 00 ffffffff814783dd: 48 89 45 d8 mov %rax,-0x28(%rbp) ffffffff814783e1: 31 c0 xor %eax,%eax ffffffff814783e3: 41 89 d4 mov %edx,%r12d /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1104 struct iw_request_info info = { .cmd = cmd, .flags = 0 }; ffffffff814783e6: 66 89 55 d0 mov %dx,-0x30(%rbp) ffffffff814783ea: 66 c7 45 d2 00 00 movw $0x0,-0x2e(%rbp) /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1107 int ret; ret = wext_ioctl_dispatch(net, ifr, cmd, &info, ffffffff814783f0: e8 5e fd ff ff callq ffffffff81478153 <wext_ioctl_dispatch> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1110 ioctl_standard_call, ioctl_private_call); if (ret >= 0 && ffffffff814783f5: 85 c0 test %eax,%eax /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1107 void __user *arg) { struct iw_request_info info = { .cmd = cmd, .flags = 0 }; int ret; ret = wext_ioctl_dispatch(net, ifr, cmd, &info, ffffffff814783f7: 41 89 c6 mov %eax,%r14d /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1110 ioctl_standard_call, ioctl_private_call); if (ret >= 0 && ffffffff814783fa: 78 22 js ffffffff8147841e <wext_handle_ioctl+0x76> ffffffff814783fc: 41 80 e4 01 and $0x1,%r12b ffffffff81478400: 74 1c je ffffffff8147841e <wext_handle_ioctl+0x76> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1112 IW_IS_GET(cmd) && copy_to_user(arg, ifr, sizeof(struct iwreq))) ffffffff81478402: ba 20 00 00 00 mov $0x20,%edx ffffffff81478407: 48 89 de mov %rbx,%rsi ffffffff8147840a: 4c 89 ef mov %r13,%rdi ffffffff8147840d: e8 0e 50 db ff callq ffffffff8122d420 <copy_to_user> /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1110 int ret; ret = wext_ioctl_dispatch(net, ifr, cmd, &info, ioctl_standard_call, ioctl_private_call); if (ret >= 0 && ffffffff81478412: 48 85 c0 test %rax,%rax ffffffff81478415: b8 f2 ff ff ff mov $0xfffffff2,%eax ffffffff8147841a: 44 0f 45 f0 cmovne %eax,%r14d /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:1116 IW_IS_GET(cmd) && copy_to_user(arg, ifr, sizeof(struct iwreq))) return -EFAULT; return ret; } ffffffff8147841e: 48 8b 55 d8 mov -0x28(%rbp),%rdx ffffffff81478422: 65 48 33 14 25 28 00 xor %gs:0x28,%rdx ffffffff81478429: 00 00 ffffffff8147842b: 44 89 f0 mov %r14d,%eax ffffffff8147842e: 74 05 je ffffffff81478435 <wext_handle_ioctl+0x8d> ffffffff81478430: e8 54 ee bd ff callq ffffffff81057289 <__stack_chk_fail> ffffffff81478435: 5b pop %rbx ffffffff81478436: 5e pop %rsi ffffffff81478437: 5b pop %rbx ffffffff81478438: 41 5c pop %r12 ffffffff8147843a: 41 5d pop %r13 ffffffff8147843c: 41 5e pop %r14 ffffffff8147843e: c9 leaveq ffffffff8147843f: c3 retq ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-08 6:28 ` Hin-Tak Leung @ 2009-10-08 9:51 ` Johannes Berg 2009-10-08 11:50 ` Johannes Berg 0 siblings, 1 reply; 14+ messages in thread From: Johannes Berg @ 2009-10-08 9:51 UTC (permalink / raw) To: Hin-Tak Leung; +Cc: Luis R. Rodriguez, John W. Linville, linux-wireless [-- Attachment #1: Type: text/plain, Size: 1104 bytes --] On Thu, 2009-10-08 at 07:28 +0100, Hin-Tak Leung wrote: > It looks like it is the 2nd of thes two lines around > /usr/src/debug/kernel-2.6.30/linux-2.6.30.x86_64/net/wireless/wext.c:448 > which resulted in the null pointer dereference: > > if (index < dev->wireless_handlers->num_private) > return dev->wireless_handlers->private[index]; Ok, that's odd. Is it possible that somehow cfg80211 is picking up an #ifdef'ed copy of "struct iw_handler_def", and thus the struct it is defining is simply too small? You can figure that out with debug info, presumably, but I'm not entirely sure how. Actually maybe nm would tell you too, if you look for cfg80211_wext_handler. What I mean is this -- cfg80211 defines cfg80211_wext_handler: const struct iw_handler_def cfg80211_wext_handler .num_standard .standard .get_wireless_stats but the core expects .num_standard .standard .num_private .num_private_args .private .private_args .get_wireless_stats as such .num_private ends up non-zero because it's shadowed by .get_wireles_stats. johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 801 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-08 9:51 ` Johannes Berg @ 2009-10-08 11:50 ` Johannes Berg 2009-10-08 13:43 ` Luis R. Rodriguez 0 siblings, 1 reply; 14+ messages in thread From: Johannes Berg @ 2009-10-08 11:50 UTC (permalink / raw) To: Hin-Tak Leung; +Cc: Luis R. Rodriguez, John W. Linville, linux-wireless [-- Attachment #1: Type: text/plain, Size: 447 bytes --] On Thu, 2009-10-08 at 11:51 +0200, Johannes Berg wrote: > Ok, that's odd. Is it possible that somehow cfg80211 is picking up an > #ifdef'ed copy of "struct iw_handler_def", and thus the struct it is > defining is simply too small? That is apparently what is happening since compat-wireless ships iw_handler.h. This is wrong, as wext functionality is built into the kernel image so you can't use a newer header file with it. johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 801 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-08 11:50 ` Johannes Berg @ 2009-10-08 13:43 ` Luis R. Rodriguez 2009-10-08 14:28 ` Luis R. Rodriguez 2009-10-08 23:22 ` Hin-Tak Leung 0 siblings, 2 replies; 14+ messages in thread From: Luis R. Rodriguez @ 2009-10-08 13:43 UTC (permalink / raw) To: Johannes Berg; +Cc: Hin-Tak Leung, John W. Linville, linux-wireless On Thu, Oct 8, 2009 at 7:50 AM, Johannes Berg <johannes@sipsolutions.net> wrote: > On Thu, 2009-10-08 at 11:51 +0200, Johannes Berg wrote: > >> Ok, that's odd. Is it possible that somehow cfg80211 is picking up an >> #ifdef'ed copy of "struct iw_handler_def", and thus the struct it is >> defining is simply too small? > > That is apparently what is happening since compat-wireless ships > iw_handler.h. This is wrong, as wext functionality is built into the > kernel image so you can't use a newer header file with it. Dah, thanks for looking into this! This must've been there this way for ages and we hadn't noticed until now. This is now fixed, and a new tarball pushed out. I'll fix on the stable stuff as well, although I doubt the header has changed much except now. Luis ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-08 13:43 ` Luis R. Rodriguez @ 2009-10-08 14:28 ` Luis R. Rodriguez 2009-10-08 14:43 ` John W. Linville 2009-10-08 23:22 ` Hin-Tak Leung 1 sibling, 1 reply; 14+ messages in thread From: Luis R. Rodriguez @ 2009-10-08 14:28 UTC (permalink / raw) To: Johannes Berg, reinette chatre Cc: Hin-Tak Leung, John W. Linville, linux-wireless On Thu, Oct 8, 2009 at 9:43 AM, Luis R. Rodriguez <lrodriguez@atheros.com> wrote: > On Thu, Oct 8, 2009 at 7:50 AM, Johannes Berg <johannes@sipsolutions.net> wrote: >> On Thu, 2009-10-08 at 11:51 +0200, Johannes Berg wrote: >> >>> Ok, that's odd. Is it possible that somehow cfg80211 is picking up an >>> #ifdef'ed copy of "struct iw_handler_def", and thus the struct it is >>> defining is simply too small? >> >> That is apparently what is happening since compat-wireless ships >> iw_handler.h. This is wrong, as wext functionality is built into the >> kernel image so you can't use a newer header file with it. > > Dah, thanks for looking into this! This must've been there this way > for ages and we hadn't noticed until now. This is now fixed, and a new > tarball pushed out. I'll fix on the stable stuff as well, although I > doubt the header has changed much except now. OK so iw_handler added the libipw pointer, so libipw and friends are now messed up on compat-wireless. Do we care? I'll disable them for now. Can't think of a way to backport this easily. CC [M] /home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.o /home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.c: In function ‘ipw2100_alloc_device’: /home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.c:6060: error: ‘struct iw_public_data’ has no member named ‘libipw’ make[4]: *** [/home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.o] Error 1 Luis ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-08 14:28 ` Luis R. Rodriguez @ 2009-10-08 14:43 ` John W. Linville 2009-10-08 14:59 ` Luis R. Rodriguez 0 siblings, 1 reply; 14+ messages in thread From: John W. Linville @ 2009-10-08 14:43 UTC (permalink / raw) To: Luis R. Rodriguez Cc: Johannes Berg, reinette chatre, Hin-Tak Leung, linux-wireless On Thu, Oct 08, 2009 at 10:28:33AM -0400, Luis R. Rodriguez wrote: > On Thu, Oct 8, 2009 at 9:43 AM, Luis R. Rodriguez > <lrodriguez@atheros.com> wrote: > > On Thu, Oct 8, 2009 at 7:50 AM, Johannes Berg <johannes@sipsolutions.net> wrote: > >> On Thu, 2009-10-08 at 11:51 +0200, Johannes Berg wrote: > >> > >>> Ok, that's odd. Is it possible that somehow cfg80211 is picking up an > >>> #ifdef'ed copy of "struct iw_handler_def", and thus the struct it is > >>> defining is simply too small? > >> > >> That is apparently what is happening since compat-wireless ships > >> iw_handler.h. This is wrong, as wext functionality is built into the > >> kernel image so you can't use a newer header file with it. > > > > Dah, thanks for looking into this! This must've been there this way > > for ages and we hadn't noticed until now. This is now fixed, and a new > > tarball pushed out. I'll fix on the stable stuff as well, although I > > doubt the header has changed much except now. > > OK so iw_handler added the libipw pointer, so libipw and friends are > now messed up on compat-wireless. Do we care? I'll disable them for > now. Can't think of a way to backport this easily. > > CC [M] /home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.o > /home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.c: > In function ‘ipw2100_alloc_device’: > /home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.c:6060: > error: ‘struct iw_public_data’ has no member named ‘libipw’ > make[4]: *** [/home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.o] > Error 1 - /* Structure managed by the in-kernel IEEE 802.11 layer */ - struct ieee80211_device * ieee80211; + /* Legacy structure managed by the ipw2x00-specific IEEE 802.11 layer */ + struct libipw_device * libipw; Really just a name change, FWIW... John -- John W. Linville Someday the world will need a hero, and you linville@tuxdriver.com might be all we have. Be ready. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-08 14:43 ` John W. Linville @ 2009-10-08 14:59 ` Luis R. Rodriguez 0 siblings, 0 replies; 14+ messages in thread From: Luis R. Rodriguez @ 2009-10-08 14:59 UTC (permalink / raw) To: John W. Linville Cc: Johannes Berg, reinette chatre, Hin-Tak Leung, linux-wireless On Thu, Oct 8, 2009 at 10:43 AM, John W. Linville <linville@tuxdriver.com> wrote: > On Thu, Oct 08, 2009 at 10:28:33AM -0400, Luis R. Rodriguez wrote: >> On Thu, Oct 8, 2009 at 9:43 AM, Luis R. Rodriguez >> <lrodriguez@atheros.com> wrote: >> > On Thu, Oct 8, 2009 at 7:50 AM, Johannes Berg <johannes@sipsolutions.net> wrote: >> >> On Thu, 2009-10-08 at 11:51 +0200, Johannes Berg wrote: >> >> >> >>> Ok, that's odd. Is it possible that somehow cfg80211 is picking up an >> >>> #ifdef'ed copy of "struct iw_handler_def", and thus the struct it is >> >>> defining is simply too small? >> >> >> >> That is apparently what is happening since compat-wireless ships >> >> iw_handler.h. This is wrong, as wext functionality is built into the >> >> kernel image so you can't use a newer header file with it. >> > >> > Dah, thanks for looking into this! This must've been there this way >> > for ages and we hadn't noticed until now. This is now fixed, and a new >> > tarball pushed out. I'll fix on the stable stuff as well, although I >> > doubt the header has changed much except now. >> >> OK so iw_handler added the libipw pointer, so libipw and friends are >> now messed up on compat-wireless. Do we care? I'll disable them for >> now. Can't think of a way to backport this easily. >> >> CC [M] /home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.o >> /home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.c: >> In function ‘ipw2100_alloc_device’: >> /home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.c:6060: >> error: ‘struct iw_public_data’ has no member named ‘libipw’ >> make[4]: *** [/home/mcgrof/devel/compat-wireless-2.6/drivers/net/wireless/ipw2x00/ipw2100.o] >> Error 1 > > - /* Structure managed by the in-kernel IEEE 802.11 layer */ > - struct ieee80211_device * ieee80211; > + /* Legacy structure managed by the ipw2x00-specific IEEE 802.11 layer */ > + struct libipw_device * libipw; > > Really just a name change, FWIW... oh ok thanks, thought the struct changed too -- then is be easy to backport Luis ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-08 13:43 ` Luis R. Rodriguez 2009-10-08 14:28 ` Luis R. Rodriguez @ 2009-10-08 23:22 ` Hin-Tak Leung 2009-10-09 0:14 ` Luis R. Rodriguez 1 sibling, 1 reply; 14+ messages in thread From: Hin-Tak Leung @ 2009-10-08 23:22 UTC (permalink / raw) To: Luis R. Rodriguez; +Cc: Johannes Berg, John W. Linville, linux-wireless On Thu, Oct 8, 2009 at 2:43 PM, Luis R. Rodriguez <lrodriguez@atheros.com> wrote: > On Thu, Oct 8, 2009 at 7:50 AM, Johannes Berg <johannes@sipsolutions.net> wrote: >> On Thu, 2009-10-08 at 11:51 +0200, Johannes Berg wrote: >> >>> Ok, that's odd. Is it possible that somehow cfg80211 is picking up an >>> #ifdef'ed copy of "struct iw_handler_def", and thus the struct it is >>> defining is simply too small? >> >> That is apparently what is happening since compat-wireless ships >> iw_handler.h. This is wrong, as wext functionality is built into the >> kernel image so you can't use a newer header file with it. > > Dah, thanks for looking into this! This must've been there this way > for ages and we hadn't noticed until now. This is now fixed, and a new > tarball pushed out. I'll fix on the stable stuff as well, although I > doubt the header has changed much except now. > > Luis > Thanks everybody! Works alright now, after 'compat-2.6: stop shipping bleeding edge iw_handler.h' . There are some harmless warnings from using the old header, but otherwise it is working as it should: CC [M] /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.o /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c: In function ‘__cfg80211_connect_result’: /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c:370: warning: passing argument 4 of ‘wireless_send_event’ discards qualifiers from pointer target type include/net/iw_handler.h:443: note: expected ‘char *’ but argument is of type ‘const u8 *’ /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c:376: warning: passing argument 4 of ‘wireless_send_event’ discards qualifiers from pointer target type include/net/iw_handler.h:443: note: expected ‘char *’ but argument is of type ‘const u8 *’ /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c: In function ‘__cfg80211_roamed’: /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c:520: warning: passing argument 4 of ‘wireless_send_event’ discards qualifiers from pointer target type include/net/iw_handler.h:443: note: expected ‘char *’ but argument is of type ‘const u8 *’ /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c:527: warning: passing argument 4 of ‘wireless_send_event’ discards qualifiers from pointer target type include/net/iw_handler.h:443: note: expected ‘char *’ but argument is of type ‘const u8 *’ Hin-Tak ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-08 23:22 ` Hin-Tak Leung @ 2009-10-09 0:14 ` Luis R. Rodriguez 2009-10-09 8:05 ` Johannes Berg 0 siblings, 1 reply; 14+ messages in thread From: Luis R. Rodriguez @ 2009-10-09 0:14 UTC (permalink / raw) To: Hin-Tak Leung; +Cc: Johannes Berg, John W. Linville, linux-wireless On Thu, Oct 8, 2009 at 7:22 PM, Hin-Tak Leung <hintak.leung@gmail.com> wrote: > On Thu, Oct 8, 2009 at 2:43 PM, Luis R. Rodriguez > <lrodriguez@atheros.com> wrote: >> On Thu, Oct 8, 2009 at 7:50 AM, Johannes Berg <johannes@sipsolutions.net> wrote: >>> On Thu, 2009-10-08 at 11:51 +0200, Johannes Berg wrote: >>> >>>> Ok, that's odd. Is it possible that somehow cfg80211 is picking up an >>>> #ifdef'ed copy of "struct iw_handler_def", and thus the struct it is >>>> defining is simply too small? >>> >>> That is apparently what is happening since compat-wireless ships >>> iw_handler.h. This is wrong, as wext functionality is built into the >>> kernel image so you can't use a newer header file with it. >> >> Dah, thanks for looking into this! This must've been there this way >> for ages and we hadn't noticed until now. This is now fixed, and a new >> tarball pushed out. I'll fix on the stable stuff as well, although I >> doubt the header has changed much except now. >> >> Luis >> > > Thanks everybody! Works alright now, after 'compat-2.6: stop shipping > bleeding edge iw_handler.h' . > > There are some harmless warnings from using the old header, but > otherwise it is working as it should: > CC [M] /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.o > /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c: In > function ‘__cfg80211_connect_result’: > /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c:370: > warning: passing argument 4 of ‘wireless_send_event’ discards > qualifiers from pointer target type > include/net/iw_handler.h:443: note: expected ‘char *’ but argument is > of type ‘const u8 *’ > /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c:376: > warning: passing argument 4 of ‘wireless_send_event’ discards > qualifiers from pointer target type > include/net/iw_handler.h:443: note: expected ‘char *’ but argument is > of type ‘const u8 *’ > /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c: In > function ‘__cfg80211_roamed’: > /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c:520: > warning: passing argument 4 of ‘wireless_send_event’ discards > qualifiers from pointer target type > include/net/iw_handler.h:443: note: expected ‘char *’ but argument is > of type ‘const u8 *’ > /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c:527: > warning: passing argument 4 of ‘wireless_send_event’ discards > qualifiers from pointer target type > include/net/iw_handler.h:443: note: expected ‘char *’ but argument is > of type ‘const u8 *’ The last argument to wireless_send_event() was changed to be const on 2.6.32, cant think of a way to avoid this warning. Luis ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-09 0:14 ` Luis R. Rodriguez @ 2009-10-09 8:05 ` Johannes Berg 2009-10-13 21:04 ` Luis R. Rodriguez 0 siblings, 1 reply; 14+ messages in thread From: Johannes Berg @ 2009-10-09 8:05 UTC (permalink / raw) To: Luis R. Rodriguez; +Cc: Hin-Tak Leung, John W. Linville, linux-wireless [-- Attachment #1: Type: text/plain, Size: 866 bytes --] On Thu, 2009-10-08 at 20:14 -0400, Luis R. Rodriguez wrote: > > There are some harmless warnings from using the old header, but > > otherwise it is working as it should: > > CC [M] /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.o > > /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c: In > > function ‘__cfg80211_connect_result’: > > /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c:370: > > warning: passing argument 4 of ‘wireless_send_event’ discards > > qualifiers from pointer target type > > include/net/iw_handler.h:443: note: expected ‘char *’ but argument is > > of type ‘const u8 *’ > The last argument to wireless_send_event() was changed to be const on > 2.6.32, cant think of a way to avoid this warning. Yeah, it was never modified though so the warning is harmless. johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 801 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) 2009-10-09 8:05 ` Johannes Berg @ 2009-10-13 21:04 ` Luis R. Rodriguez 0 siblings, 0 replies; 14+ messages in thread From: Luis R. Rodriguez @ 2009-10-13 21:04 UTC (permalink / raw) To: Johannes Berg; +Cc: Hin-Tak Leung, John W. Linville, linux-wireless On Fri, Oct 9, 2009 at 1:05 AM, Johannes Berg <johannes@sipsolutions.net> wrote: > On Thu, 2009-10-08 at 20:14 -0400, Luis R. Rodriguez wrote: > >> > There are some harmless warnings from using the old header, but >> > otherwise it is working as it should: >> > CC [M] /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.o >> > /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c: In >> > function ‘__cfg80211_connect_result’: >> > /home/Hin-Tak/tmp-git/compat-wireless-2.6/net/wireless/sme.c:370: >> > warning: passing argument 4 of ‘wireless_send_event’ discards >> > qualifiers from pointer target type >> > include/net/iw_handler.h:443: note: expected ‘char *’ but argument is >> > of type ‘const u8 *’ > >> The last argument to wireless_send_event() was changed to be const on >> 2.6.32, cant think of a way to avoid this warning. > > Yeah, it was never modified though so the warning is harmless. OK so casting was enough to avoid these warnings, will use that for older kernels. #define wireless_send_event(a, b, c, d) wireless_send_event(a, b, c, (char * ) d) Luis ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2009-10-13 21:05 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-10-07 19:16 NULL pointer deref at wext ioctl (Re: [PATCH] compat-2.6: adding ethtool.h to compat-2.6.31.h) Hin-Tak Leung 2009-10-07 19:28 ` Hin-Tak Leung 2009-10-07 22:01 ` Johannes Berg 2009-10-08 6:28 ` Hin-Tak Leung 2009-10-08 9:51 ` Johannes Berg 2009-10-08 11:50 ` Johannes Berg 2009-10-08 13:43 ` Luis R. Rodriguez 2009-10-08 14:28 ` Luis R. Rodriguez 2009-10-08 14:43 ` John W. Linville 2009-10-08 14:59 ` Luis R. Rodriguez 2009-10-08 23:22 ` Hin-Tak Leung 2009-10-09 0:14 ` Luis R. Rodriguez 2009-10-09 8:05 ` Johannes Berg 2009-10-13 21:04 ` Luis R. Rodriguez
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox