linux/include
Nicholas Bellinger bdabf097f0 iscsi-target: Fix initial login PDU asynchronous socket close OOPs
commit 25cdda95fd upstream.

This patch fixes a OOPs originally introduced by:

   commit bb048357da
   Author: Nicholas Bellinger <nab@linux-iscsi.org>
   Date:   Thu Sep 5 14:54:04 2013 -0700

   iscsi-target: Add sk->sk_state_change to cleanup after TCP failure

which would trigger a NULL pointer dereference when a TCP connection
was closed asynchronously via iscsi_target_sk_state_change(), but only
when the initial PDU processing in iscsi_target_do_login() from iscsi_np
process context was blocked waiting for backend I/O to complete.

To address this issue, this patch makes the following changes.

First, it introduces some common helper functions used for checking
socket closing state, checking login_flags, and atomically checking
socket closing state + setting login_flags.

Second, it introduces a LOGIN_FLAGS_INITIAL_PDU bit to know when a TCP
connection has dropped via iscsi_target_sk_state_change(), but the
initial PDU processing within iscsi_target_do_login() in iscsi_np
context is still running.  For this case, it sets LOGIN_FLAGS_CLOSED,
but doesn't invoke schedule_delayed_work().

The original NULL pointer dereference case reported by MNC is now handled
by iscsi_target_do_login() doing a iscsi_target_sk_check_close() before
transitioning to FFP to determine when the socket has already closed,
or iscsi_target_start_negotiation() if the login needs to exchange
more PDUs (eg: iscsi_target_do_login returned 0) but the socket has
closed.  For both of these cases, the cleanup up of remaining connection
resources will occur in iscsi_target_start_negotiation() from iscsi_np
process context once the failure is detected.

Finally, to handle to case where iscsi_target_sk_state_change() is
called after the initial PDU procesing is complete, it now invokes
conn->login_work -> iscsi_target_do_login_rx() to perform cleanup once
existing iscsi_target_sk_check_close() checks detect connection failure.
For this case, the cleanup of remaining connection resources will occur
in iscsi_target_do_login_rx() from delayed workqueue process context
once the failure is detected.

Reported-by: Mike Christie <mchristi@redhat.com>
Reviewed-by: Mike Christie <mchristi@redhat.com>
Tested-by: Mike Christie <mchristi@redhat.com>
Cc: Mike Christie <mchristi@redhat.com>
Reported-by: Hannes Reinecke <hare@suse.com>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Sagi Grimberg <sagi@grimberg.me>
Cc: Varun Prakash <varun@chelsio.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2017-08-11 08:49:31 -07:00
..
acpi ACPICA: Linuxize: Restore and fix Intel compiler build 2017-02-26 11:10:52 +01:00
asm-generic asm-prototypes: Clear any CPP defines before declaring the functions 2017-01-12 11:39:07 +01:00
clocksource clocksource/drivers/sp804: Convert init function to return error 2016-06-28 10:19:30 +02:00
crypto crypto: ahash - Fix EINPROGRESS notification callback 2017-04-21 09:31:23 +02:00
drm drm: Don't race connector registration 2017-06-17 06:41:53 +02:00
dt-bindings dt: bindings: net: use boolean dt properties for eee broken modes 2017-07-05 14:40:20 +02:00
keys KEYS: Strip trailing spaces 2016-06-14 10:29:44 +01:00
kvm ARM: KVM: Support vgic-v3 2016-09-22 13:22:21 +02:00
linux cpuset: fix a deadlock due to incomplete patching of cpusets_enabled() 2017-08-11 08:49:29 -07:00
math-emu math-emu: fix floating-point to integer overflow detection 2014-01-07 18:36:24 -06:00
media Linux 4.8 2016-10-05 16:43:53 -03:00
memory ddr: add LPDDR2 data from JESD209-2 2012-05-02 00:04:06 -07:00
misc cxl: Add cxl_check_and_switch_mode() API to switch bi-modal cards 2016-07-14 20:28:11 +10:00
net net: ipv6: Compare lwstate in detecting duplicate nexthops 2017-07-21 07:42:19 +02:00
pcmcia pcmcia/ds.h: introduce helper for pcmcia_driver module boilerplate 2013-03-15 12:26:03 -07:00
ras tracing, RAS: Cleanup on __get_str() usage 2016-07-15 15:51:16 -04:00
rdma RDMA/core: Fix incorrect structure packing for booleans 2017-03-12 06:41:50 +01:00
rxrpc rxrpc: Add tracepoint for ACK proposal 2016-09-23 15:49:19 +01:00
scsi scsi: Add STARGET_CREATED_REMOVE state to scsi_target_state 2017-07-27 15:07:59 -07:00
soc ARM: at91: define LPDDR types 2017-03-12 06:41:41 +01:00
sound ASoC: hdmi-codec: use unsigned type to structure members with bit-field 2017-01-19 20:18:02 +01:00
target iscsi-target: Fix initial login PDU asynchronous socket close OOPs 2017-08-11 08:49:31 -07:00
trace tracing: Add #undef to fix compile error 2017-03-18 19:14:29 +08:00
uapi net: ethtool: add support for 2500BaseT and 5000BaseT link modes 2017-07-05 14:40:19 +02:00
video fbdev changes for 4.9 2016-10-12 11:01:37 -07:00
xen xen: Revert commits da72ff5bfc and 72a9b18629 2017-05-14 14:00:22 +02:00
Kbuild UAPI: remove empty Kbuild files 2013-04-30 17:04:09 -07:00