Files
kernel-tenderloin-3.0/include/linux
Gerrit Renker 10d8dad845 wext: fix alignment problem in serializing 'struct iw_point'
wext: fix alignment problem in serializing 'struct iw_point'

This fixes a typo in the definition of the serialized length of struct iw_point:
 a) wireless.h is exported to userspace, the typo causes IW_EV_POINT_PK_LEN
    to be 12 on 64-bit, and 8 on 32-bit systems (causing misalignment);
 b) in compat-64 mode iwe_stream_add_point() memcpys overlap (see below).

The second case in  in compat-64 mode looks like (variable names are as in
include/net/iw_handler.h:iwe_stream_add_point()):

 point_len = IW_EV_COMPAT_POINT_LEN = 8
 lcp_len   = IW_EV_COMPAT_LCP_LEN   = 4
 2nd memcpy: IW_EV_POINT_PK_LEN - IW_EV_LCP_PK_LEN = 12 - 4 = 8

 IW_EV_LCP_PK_LEN
 <-------------->                *---> 'extra' data area
 +-------+-------+-------+-------+---------------+------- ...-+
 | len   | cmd   |length | flags |  (empty) -> extra      ... |
 +-------+-------+-------+-------+---------------+------- ...-+
    2       2       2       2          4

     lcp_len
 <-------------->                <-!! OVERLAP !!>
 <--1st memcpy--><------- 2nd memcpy ----------->
                                 <---- 3rd memcpy ------- ... >
 <--------- point_len ---------->

This case could cause overrun whenever iw_point.length < 4.
The other two cases are -
 * 32-bit systems: IW_EV_POINT_PK_LEN - IW_EV_LCP_PK_LEN =  8 - 4 = 4,
   the second memcpy copies exactly the 4 required bytes;
 * 64-bit systems: IW_EV_POINT_PK_LEN - IW_EV_LCP_PK_LEN = 12 - 4 = 8,
   the second memcpy copies a superfluous (but non overlapping) 4 bytes.

The patch changes IW_EV_POINT_PK_LEN to be 8, so that in all 3 cases always only
the requested iw_point.{length,flags} (both __u16) are copied, avoiding overrrun
(compat-64) and superfluous copy (64-bit). In addition, the userspace header is
sanitized (in agreement with version 30 of the wireless tools).

Many thanks to Johannes Berg for help and review with this patch.

Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2010-10-13 15:45:21 -04:00
..
2010-07-31 14:20:02 +01:00
2010-08-02 15:03:21 -03:00
2010-05-28 01:38:00 +02:00
2010-06-15 09:56:01 +10:00
2010-05-14 17:08:01 -04:00
2010-05-27 09:12:53 -07:00
2010-05-19 13:38:54 -04:00
2010-06-24 21:30:09 -07:00
2010-05-19 22:41:57 -04:00
2010-05-17 16:30:58 -07:00
2010-05-21 19:30:44 +02:00
2010-05-25 08:07:01 -07:00
2010-05-27 09:12:42 -07:00
2010-05-21 09:34:29 -07:00
2010-07-19 11:54:16 +02:00
2010-06-16 18:08:13 +02:00
2010-06-03 03:21:52 -07:00
2010-06-03 03:21:52 -07:00
2010-06-03 03:21:52 -07:00
2010-06-03 03:21:52 -07:00
2010-06-03 03:21:52 -07:00
2010-06-23 13:16:38 -07:00
2010-05-11 12:01:10 -07:00
2010-06-22 08:07:01 +02:00
2010-07-19 22:01:26 -07:00
2010-06-03 03:21:52 -07:00
2010-05-21 09:37:29 -07:00
2010-05-14 15:09:32 -04:00
2010-08-02 06:39:44 +03:00
2010-08-01 10:47:00 +03:00
2010-06-29 10:38:22 -07:00
2010-06-16 18:03:15 +02:00
2010-07-14 17:14:00 +10:00
2010-06-03 03:21:52 -07:00
2010-06-03 03:21:52 -07:00
2010-06-03 03:21:52 -07:00
2010-05-17 05:27:42 +02:00
2010-06-03 03:21:52 -07:00
2010-07-02 21:59:08 -07:00
2010-08-16 15:26:40 -04:00
2010-07-31 19:53:06 +08:00
2010-06-03 03:21:52 -07:00
2010-07-19 01:58:48 +02:00
2010-07-19 01:58:48 +02:00
2010-08-04 21:53:17 -07:00
2010-06-03 03:21:52 -07:00
2010-07-19 11:02:51 +02:00
2010-05-27 09:12:50 -07:00
2010-05-30 09:02:47 -07:00
2010-07-22 13:46:21 -07:00
2010-06-03 03:21:52 -07:00
2010-05-25 11:41:43 -04:00
2010-06-16 14:55:35 -07:00
2010-05-27 09:12:43 -07:00
2010-05-15 23:28:39 -07:00
2010-05-12 23:02:23 -07:00
2010-05-21 09:34:29 -07:00
2010-05-19 22:40:47 -04:00
2010-08-02 10:37:17 -05:00
2010-05-19 22:15:46 +09:30
2010-06-03 03:21:52 -07:00