]> git.baikalelectronics.ru Git - kernel.git/commit
wext: fix get_wireless_stats locking
authorJohannes Berg <johannes@sipsolutions.net>
Mon, 11 May 2009 14:06:36 +0000 (16:06 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 11 May 2009 19:24:07 +0000 (15:24 -0400)
commitcfd5c8d04f3f928bf7725791df2f82a96eeabfe9
treeae00a8c366c7cb3d8aad35acc9b16f8e2d355b02
parente5ebf3ff02ce519571a14e530d403c5c598afbce
wext: fix get_wireless_stats locking

Currently, get_wireless_stats is racy by _design_. This is
because it returns a buffer, which needs to be statically
allocated since it cannot be freed if it was allocated
dynamically. Also, SIOCGIWSTATS and /proc/net/wireless use
no common lock, and /proc/net/wireless accesses are not
synchronised against each other. This is a design flaw in
get_wireless_stats since the beginning.

This patch fixes it by wrapping /proc/net/wireless accesses
with the RTNL so they are protected against each other and
SIOCGIWSTATS. The more correct method of fixing this would
be to pass in the buffer instead of returning it and have
the caller take care of synchronisation of the buffer, but
even then most drivers probably assume that their callback
is protected by the RTNL like all other wext callbacks.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/wireless/wext.c