linux/include
Rusty Russell 6fb5717048 UPSTREAM: modules: fix longstanding /proc/kallsyms vs module insertion race.
commit 8244062ef1 upstream.

For CONFIG_KALLSYMS, we keep two symbol tables and two string tables.
There's one full copy, marked SHF_ALLOC and laid out at the end of the
module's init section.  There's also a cut-down version that only
contains core symbols and strings, and lives in the module's core
section.

After module init (and before we free the module memory), we switch
the mod->symtab, mod->num_symtab and mod->strtab to point to the core
versions.  We do this under the module_mutex.

However, kallsyms doesn't take the module_mutex: it uses
preempt_disable() and rcu tricks to walk through the modules, because
it's used in the oops path.  It's also used in /proc/kallsyms.
There's nothing atomic about the change of these variables, so we can
get the old (larger!) num_symtab and the new symtab pointer; in fact
this is what I saw when trying to reproduce.

By grouping these variables together, we can use a
carefully-dereferenced pointer to ensure we always get one or the
other (the free of the module init section is already done in an RCU
callback, so that's safe).  We allocate the init one at the end of the
module init section, and keep the core one inside the struct module
itself (it could also have been allocated at the end of the module
core, but that's probably overkill).

Reported-by: Weilong Chen <chenweilong@huawei.com>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=111541
Cc: stable@kernel.org
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
[AmitP: LTS backport is reverted earlier in lsk-android commit
        3f237b5bfda5 ("Revert "modules: fix longstanding /proc/kallsyms vs module insertion race."),
        Re-apply the upstream version instead along with related
        set of dependent patches.]
Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
2017-08-11 19:31:04 +05:30
..
acpi
asm-generic UPSTREAM: mm: add PHYS_PFN, use it in __phys_to_pfn() 2017-04-10 13:23:34 +05:30
clocksource arm64: KVM: Implement timer save/restore 2016-11-09 22:15:41 +08:00
crypto Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android 2017-04-23 12:02:14 +08:00
drm drm/ttm, drm/vmwgfx: Relax permission checking when opening surfaces 2017-04-12 12:38:33 +02:00
dt-bindings
keys
kvm KVM: arm/arm64: vgic-v3: Make the LR indexing macro public 2016-11-09 22:15:40 +08:00
linux UPSTREAM: modules: fix longstanding /proc/kallsyms vs module insertion race. 2017-08-11 19:31:04 +05:30
math-emu
media videobuf2-core: Check user space planes array in dqbuf 2016-05-04 14:48:50 -07:00
memory
misc
net Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android 2017-07-22 12:02:06 +08:00
pcmcia
ras
rdma RDMA/core: Fix incorrect structure packing for booleans 2017-03-12 06:37:29 +01:00
rxrpc
scsi scsi: libiscsi: add lock around task lists to fix list corruption regression 2017-03-26 12:13:19 +02:00
soc ARM: at91: define LPDDR types 2017-03-12 06:37:24 +01:00
sound ALSA: rawmidi: Make snd_rawmidi_transmit() race-free 2016-02-17 12:30:58 -08:00
target iscsi-target: Add login_keys_workaround attribute for non RFC initiators 2017-07-27 15:06:04 -07:00
trace events: add tracepoint for find_best_target 2017-08-11 19:31:04 +05:30
uapi Add BINDER_GET_NODE_DEBUG_INFO ioctl 2017-08-11 19:31:04 +05:30
video Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android 2016-06-14 17:08:03 +08:00
xen xen: Fix page <-> pfn conversion on 32 bit systems 2016-05-11 11:21:14 +02:00
Kbuild