23 Jan, 2019

2 commits


13 Jan, 2019

2 commits


18 Oct, 2018

1 commit

  • [ Upstream commit 679fcae46c8b2352bba3485d521da070cfbe68e6 ]

    Fedora got a bug report of a crash with iSCSI:

    kernel BUG at include/linux/scatterlist.h:143!
    ...
    RIP: 0010:iscsit_do_crypto_hash_buf+0x154/0x180 [iscsi_target_mod]
    ...
    Call Trace:
    ? iscsi_target_tx_thread+0x200/0x200 [iscsi_target_mod]
    iscsit_get_rx_pdu+0x4cd/0xa90 [iscsi_target_mod]
    ? native_sched_clock+0x3e/0xa0
    ? iscsi_target_tx_thread+0x200/0x200 [iscsi_target_mod]
    iscsi_target_rx_thread+0x81/0xf0 [iscsi_target_mod]
    kthread+0x120/0x140
    ? kthread_create_worker_on_cpu+0x70/0x70
    ret_from_fork+0x3a/0x50

    This is a BUG_ON for using a stack buffer with a scatterlist. There
    are two cases that trigger this bug. Switch to using a dynamically
    allocated buffer for one case and do not assign a NULL buffer in
    another case.

    Signed-off-by: Laura Abbott
    Reviewed-by: Mike Christie
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Laura Abbott
     

10 Oct, 2018

1 commit

  • [ Upstream commit 7915919bb94e12460c58e27c708472e6f85f6699 ]

    Fixes a use-after-free reported by KASAN when later
    iscsi_target_login_sess_out gets called and it tries to access
    conn->sess->se_sess:

    Disabling lock debugging due to kernel taint
    iSCSI Login timeout on Network Portal [::]:3260
    iSCSI Login negotiation failed.
    ==================================================================
    BUG: KASAN: use-after-free in
    iscsi_target_login_sess_out.cold.12+0x58/0xff [iscsi_target_mod]
    Read of size 8 at addr ffff880109d070c8 by task iscsi_np/980

    CPU: 1 PID: 980 Comm: iscsi_np Tainted: G O
    4.17.8kasan.sess.connops+ #4
    Hardware name: To be filled by O.E.M. To be filled by O.E.M./Aptio CRB,
    BIOS 5.6.5 05/19/2014
    Call Trace:
    dump_stack+0x71/0xac
    print_address_description+0x65/0x22e
    ? iscsi_target_login_sess_out.cold.12+0x58/0xff [iscsi_target_mod]
    kasan_report.cold.6+0x241/0x2fd
    iscsi_target_login_sess_out.cold.12+0x58/0xff [iscsi_target_mod]
    iscsi_target_login_thread+0x1086/0x1710 [iscsi_target_mod]
    ? __sched_text_start+0x8/0x8
    ? iscsi_target_login_sess_out+0x250/0x250 [iscsi_target_mod]
    ? __kthread_parkme+0xcc/0x100
    ? parse_args.cold.14+0xd3/0xd3
    ? iscsi_target_login_sess_out+0x250/0x250 [iscsi_target_mod]
    kthread+0x1a0/0x1c0
    ? kthread_bind+0x30/0x30
    ret_from_fork+0x35/0x40

    Allocated by task 980:
    kasan_kmalloc+0xbf/0xe0
    kmem_cache_alloc_trace+0x112/0x210
    iscsi_target_login_thread+0x816/0x1710 [iscsi_target_mod]
    kthread+0x1a0/0x1c0
    ret_from_fork+0x35/0x40

    Freed by task 980:
    __kasan_slab_free+0x125/0x170
    kfree+0x90/0x1d0
    iscsi_target_login_thread+0x1577/0x1710 [iscsi_target_mod]
    kthread+0x1a0/0x1c0
    ret_from_fork+0x35/0x40

    The buggy address belongs to the object at ffff880109d06f00
    which belongs to the cache kmalloc-512 of size 512
    The buggy address is located 456 bytes inside of
    512-byte region [ffff880109d06f00, ffff880109d07100)
    The buggy address belongs to the page:
    page:ffffea0004274180 count:1 mapcount:0 mapping:0000000000000000
    index:0x0 compound_mapcount: 0
    flags: 0x17fffc000008100(slab|head)
    raw: 017fffc000008100 0000000000000000 0000000000000000 00000001000c000c
    raw: dead000000000100 dead000000000200 ffff88011b002e00 0000000000000000
    page dumped because: kasan: bad access detected

    Memory state around the buggy address:
    ffff880109d06f80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    ffff880109d07000: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    >ffff880109d07080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    ^
    ffff880109d07100: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    ffff880109d07180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    ==================================================================

    Signed-off-by: Vincent Pelletier
    [rebased against idr/ida changes and to handle ret review comments from Matthew]
    Signed-off-by: Mike Christie
    Cc: Matthew Wilcox
    Reviewed-by: Matthew Wilcox
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Vincent Pelletier
     

04 Oct, 2018

1 commit


29 Sep, 2018

2 commits

  • commit 8c39e2699f8acb2e29782a834e56306da24937fe upstream.

    Signed-off-by: Vincent Pelletier
    Reviewed-by: Mike Christie
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Vincent Pelletier
     
  • commit 1816494330a83f2a064499d8ed2797045641f92c upstream.

    This change has the following effects, in order of descreasing importance:

    1) Prevent a stack buffer overflow

    2) Do not append an unnecessary NULL to an anyway binary buffer, which
    is writing one byte past client_digest when caller is:
    chap_string_to_hex(client_digest, chap_r, strlen(chap_r));

    The latter was found by KASAN (see below) when input value hes expected size
    (32 hex chars), and further analysis revealed a stack buffer overflow can
    happen when network-received value is longer, allowing an unauthenticated
    remote attacker to smash up to 17 bytes after destination buffer (16 bytes
    attacker-controlled and one null). As switching to hex2bin requires
    specifying destination buffer length, and does not internally append any null,
    it solves both issues.

    This addresses CVE-2018-14633.

    Beyond this:

    - Validate received value length and check hex2bin accepted the input, to log
    this rejection reason instead of just failing authentication.

    - Only log received CHAP_R and CHAP_C values once they passed sanity checks.

    ==================================================================
    BUG: KASAN: stack-out-of-bounds in chap_string_to_hex+0x32/0x60 [iscsi_target_mod]
    Write of size 1 at addr ffff8801090ef7c8 by task kworker/0:0/1021

    CPU: 0 PID: 1021 Comm: kworker/0:0 Tainted: G O 4.17.8kasan.sess.connops+ #2
    Hardware name: To be filled by O.E.M. To be filled by O.E.M./Aptio CRB, BIOS 5.6.5 05/19/2014
    Workqueue: events iscsi_target_do_login_rx [iscsi_target_mod]
    Call Trace:
    dump_stack+0x71/0xac
    print_address_description+0x65/0x22e
    ? chap_string_to_hex+0x32/0x60 [iscsi_target_mod]
    kasan_report.cold.6+0x241/0x2fd
    chap_string_to_hex+0x32/0x60 [iscsi_target_mod]
    chap_server_compute_md5.isra.2+0x2cb/0x860 [iscsi_target_mod]
    ? chap_binaryhex_to_asciihex.constprop.5+0x50/0x50 [iscsi_target_mod]
    ? ftrace_caller_op_ptr+0xe/0xe
    ? __orc_find+0x6f/0xc0
    ? unwind_next_frame+0x231/0x850
    ? kthread+0x1a0/0x1c0
    ? ret_from_fork+0x35/0x40
    ? ret_from_fork+0x35/0x40
    ? iscsi_target_do_login_rx+0x3bc/0x4c0 [iscsi_target_mod]
    ? deref_stack_reg+0xd0/0xd0
    ? iscsi_target_do_login_rx+0x3bc/0x4c0 [iscsi_target_mod]
    ? is_module_text_address+0xa/0x11
    ? kernel_text_address+0x4c/0x110
    ? __save_stack_trace+0x82/0x100
    ? ret_from_fork+0x35/0x40
    ? save_stack+0x8c/0xb0
    ? 0xffffffffc1660000
    ? iscsi_target_do_login+0x155/0x8d0 [iscsi_target_mod]
    ? iscsi_target_do_login_rx+0x3bc/0x4c0 [iscsi_target_mod]
    ? process_one_work+0x35c/0x640
    ? worker_thread+0x66/0x5d0
    ? kthread+0x1a0/0x1c0
    ? ret_from_fork+0x35/0x40
    ? iscsi_update_param_value+0x80/0x80 [iscsi_target_mod]
    ? iscsit_release_cmd+0x170/0x170 [iscsi_target_mod]
    chap_main_loop+0x172/0x570 [iscsi_target_mod]
    ? chap_server_compute_md5.isra.2+0x860/0x860 [iscsi_target_mod]
    ? rx_data+0xd6/0x120 [iscsi_target_mod]
    ? iscsit_print_session_params+0xd0/0xd0 [iscsi_target_mod]
    ? cyc2ns_read_begin.part.2+0x90/0x90
    ? _raw_spin_lock_irqsave+0x25/0x50
    ? memcmp+0x45/0x70
    iscsi_target_do_login+0x875/0x8d0 [iscsi_target_mod]
    ? iscsi_target_check_first_request.isra.5+0x1a0/0x1a0 [iscsi_target_mod]
    ? del_timer+0xe0/0xe0
    ? memset+0x1f/0x40
    ? flush_sigqueue+0x29/0xd0
    iscsi_target_do_login_rx+0x3bc/0x4c0 [iscsi_target_mod]
    ? iscsi_target_nego_release+0x80/0x80 [iscsi_target_mod]
    ? iscsi_target_restore_sock_callbacks+0x130/0x130 [iscsi_target_mod]
    process_one_work+0x35c/0x640
    worker_thread+0x66/0x5d0
    ? flush_rcu_work+0x40/0x40
    kthread+0x1a0/0x1c0
    ? kthread_bind+0x30/0x30
    ret_from_fork+0x35/0x40

    The buggy address belongs to the page:
    page:ffffea0004243bc0 count:0 mapcount:0 mapping:0000000000000000 index:0x0
    flags: 0x17fffc000000000()
    raw: 017fffc000000000 0000000000000000 0000000000000000 00000000ffffffff
    raw: ffffea0004243c20 ffffea0004243ba0 0000000000000000 0000000000000000
    page dumped because: kasan: bad access detected

    Memory state around the buggy address:
    ffff8801090ef680: f2 f2 f2 f2 f2 f2 f2 01 f2 f2 f2 f2 f2 f2 f2 00
    ffff8801090ef700: f2 f2 f2 f2 f2 f2 f2 00 02 f2 f2 f2 f2 f2 f2 00
    >ffff8801090ef780: 00 f2 f2 f2 f2 f2 f2 00 00 f2 f2 f2 f2 f2 f2 00
    ^
    ffff8801090ef800: 00 f2 f2 f2 f2 f2 f2 00 00 00 00 02 f2 f2 f2 f2
    ffff8801090ef880: f2 f2 f2 00 00 00 00 00 00 00 00 f2 f2 f2 f2 00
    ==================================================================

    Signed-off-by: Vincent Pelletier
    Reviewed-by: Mike Christie
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Greg Kroah-Hartman

    Vincent Pelletier
     

05 Sep, 2018

2 commits

  • commit 26abc916a898d34c5ad159315a2f683def3c5555 upstream.

    The problem is that iscsi_login_zero_tsih_s1 sets conn->sess early in
    iscsi_login_set_conn_values. If the function fails later like when we
    alloc the idr it does kfree(sess) and leaves the conn->sess pointer set.
    iscsi_login_zero_tsih_s1 then returns -Exyz and we then call
    iscsi_target_login_sess_out and access the freed memory.

    This patch has iscsi_login_zero_tsih_s1 either completely setup the
    session or completely tear it down, so later in
    iscsi_target_login_sess_out we can just check for it being set to the
    connection.

    Cc: stable@vger.kernel.org
    Fixes: 0957627a9960 ("iscsi-target: Fix sess allocation leak in...")
    Signed-off-by: Mike Christie
    Acked-by: Martin K. Petersen
    Signed-off-by: Matthew Wilcox
    Signed-off-by: Greg Kroah-Hartman

    Mike Christie
     
  • [ Upstream commit 1b350ea0c2f4df9aa30426614c8eb755a8c32814 ]

    - rounddown CXGBIT_MAX_ISO_PAYLOAD by csk->emss before calculating
    max_iso_npdu to get max TCP payload in multiple of mss.

    - call cxgbit_set_digest() before cxgbit_set_iso_npdu() to set
    csk->submode, it is used in calculating number of iso pdus.

    Signed-off-by: Varun Prakash
    Reviewed-by: Mike Christie
    Signed-off-by: Martin K. Petersen
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Varun Prakash
     

22 Feb, 2018

2 commits

  • commit 1c130ae00b769a2e2df41bad3d6051ee8234b636 upstream.

    Mike Christie reports:
    Starting in 4.14 iscsi logins will fail around 50% of the time.

    Problem appears to be that iscsi_target_sk_data_ready() callback may
    return without doing anything in case it finds the login work queue
    is still blocked in sock_recvmsg().

    Nicholas Bellinger says:
    It would indicate users providing their own ->sk_data_ready() callback
    must be responsible for waking up a kthread context blocked on
    sock_recvmsg(..., MSG_WAITALL), when a second ->sk_data_ready() is
    received before the first sock_recvmsg(..., MSG_WAITALL) completes.

    So, do this and invoke the original data_ready() callback -- in
    case of tcp sockets this takes care of waking the thread.

    Disclaimer: I do not understand why this problem did not show up before
    tcp prequeue removal.

    (Drop WARN_ON usage - nab)

    Reported-by: Mike Christie
    Bisected-by: Mike Christie
    Tested-by: Mike Christie
    Diagnosed-by: Nicholas Bellinger
    Fixes: e7942d0633c4 ("tcp: remove prequeue support")
    Signed-off-by: Florian Westphal
    Cc: stable@vger.kernel.org # 4.14+
    Signed-off-by: Nicholas Bellinger
    Signed-off-by: Greg Kroah-Hartman

    Florian Westphal
     
  • commit ce512d79d0466a604793addb6b769d12ee326822 upstream.

    If chap_server_compute_md5() fails early, e.g. via CHAP_N mismatch, then
    crypto_free_shash() is called with a NULL pointer which gets
    dereferenced in crypto_shash_tfm().

    Fixes: 69110e3cedbb ("iscsi-target: Use shash and ahash")
    Suggested-by: Markus Elfring
    Signed-off-by: David Disseldorp
    Cc: stable@vger.kernel.org # 4.6+
    Signed-off-by: Nicholas Bellinger
    Signed-off-by: Greg Kroah-Hartman

    David Disseldorp
     

20 Dec, 2017

3 commits

  • [ Upstream commit 12d5a43b2dffb6cd28062b4e19024f7982393288 ]

    tpg must free when call core_tpg_register() return fail

    Signed-off-by: tangwenji
    Signed-off-by: Nicholas Bellinger
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    tangwenji
     
  • [ Upstream commit cfe2b621bb18d86e93271febf8c6e37622da2d14 ]

    Avoid that cmd->se_cmd.se_tfo is read after a command has already been
    freed.

    Signed-off-by: Bart Van Assche
    Cc: Christoph Hellwig
    Cc: Mike Christie
    Reviewed-by: Hannes Reinecke
    Signed-off-by: Nicholas Bellinger
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Bart Van Assche
     
  • [ Upstream commit 6eaf69e4ec075f5af236c0c89f75639a195db904 ]

    Certain behavior of the initiator can cause the target driver to
    send both a reject and a SCSI response. If that happens two
    target_put_sess_cmd() calls will occur without the command having
    been removed from conn_cmd_list. In other words, conn_cmd_list
    will get corrupted once the freed memory is reused. Although the
    Linux kernel can detect list corruption if list debugging is
    enabled, in this case the context in which list corruption is
    detected is not related to the context that caused list corruption.
    Hence add WARN_ON() statements that report the context that is
    causing list corruption.

    Signed-off-by: Bart Van Assche
    Cc: Christoph Hellwig
    Cc: Mike Christie
    Reviewed-by: Hannes Reinecke
    Signed-off-by: Nicholas Bellinger
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Bart Van Assche
     

30 Nov, 2017

2 commits

  • commit 3fc9fb13a4b2576aeab86c62fd64eb29ab68659c upstream.

    This patch fixes a se_cmd->cmd_kref reference leak that can
    occur when a non immediate TMR is proceeded our of command
    sequence number order, and CMDSN_LOWER_THAN_EXP is returned
    by iscsit_sequence_cmd().

    To address this bug, call target_put_sess_cmd() during this
    special case following what iscsit_process_scsi_cmd() does
    upon CMDSN_LOWER_THAN_EXP.

    Cc: Mike Christie
    Cc: Hannes Reinecke
    Signed-off-by: Nicholas Bellinger
    Signed-off-by: Greg Kroah-Hartman

    Nicholas Bellinger
     
  • commit ae072726f6109bb1c94841d6fb3a82dde298ea85 upstream.

    Since commit 59b6986dbf fixed a potential NULL pointer dereference
    by allocating a se_tmr_req for ISCSI_TM_FUNC_TASK_REASSIGN, the
    se_tmr_req is currently leaked by iscsit_free_cmd() because no
    iscsi_cmd->se_cmd.se_tfo was associated.

    To address this, treat ISCSI_TM_FUNC_TASK_REASSIGN like any other
    TMR and call transport_init_se_cmd() + target_get_sess_cmd() to
    setup iscsi_cmd->se_cmd.se_tfo with se_cmd->cmd_kref of 2.

    This will ensure normal release operation once se_cmd->cmd_kref
    reaches zero and target_release_cmd_kref() is invoked, se_tmr_req
    will be released via existing target_free_cmd_mem() and
    core_tmr_release_req() code.

    Reported-by: Donald White
    Cc: Donald White
    Cc: Mike Christie
    Cc: Hannes Reinecke
    Signed-off-by: Nicholas Bellinger
    Signed-off-by: Greg Kroah-Hartman

    Nicholas Bellinger
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

07 Aug, 2017

1 commit

  • This patch fixes a bug associated with iscsit_reset_np_thread()
    that can occur during parallel configfs rmdir of a single iscsi_np
    used across multiple iscsi-target instances, that would result in
    hung task(s) similar to below where configfs rmdir process context
    was blocked indefinately waiting for iscsi_np->np_restart_comp
    to finish:

    [ 6726.112076] INFO: task dcp_proxy_node_:15550 blocked for more than 120 seconds.
    [ 6726.119440] Tainted: G W O 4.1.26-3321 #2
    [ 6726.125045] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
    [ 6726.132927] dcp_proxy_node_ D ffff8803f202bc88 0 15550 1 0x00000000
    [ 6726.140058] ffff8803f202bc88 ffff88085c64d960 ffff88083b3b1ad0 ffff88087fffeb08
    [ 6726.147593] ffff8803f202c000 7fffffffffffffff ffff88083f459c28 ffff88083b3b1ad0
    [ 6726.155132] ffff88035373c100 ffff8803f202bca8 ffffffff8168ced2 ffff8803f202bcb8
    [ 6726.162667] Call Trace:
    [ 6726.165150] [] schedule+0x32/0x80
    [ 6726.170156] [] schedule_timeout+0x214/0x290
    [ 6726.176030] [] ? __send_signal+0x52/0x4a0
    [ 6726.181728] [] wait_for_completion+0x96/0x100
    [ 6726.187774] [] ? wake_up_state+0x10/0x10
    [ 6726.193395] [] iscsit_reset_np_thread+0x62/0xe0 [iscsi_target_mod]
    [ 6726.201278] [] iscsit_tpg_disable_portal_group+0x96/0x190 [iscsi_target_mod]
    [ 6726.210033] [] lio_target_tpg_store_enable+0x4f/0xc0 [iscsi_target_mod]
    [ 6726.218351] [] configfs_write_file+0xaa/0x110
    [ 6726.224392] [] vfs_write+0xa4/0x1b0
    [ 6726.229576] [] SyS_write+0x41/0xb0
    [ 6726.234659] [] system_call_fastpath+0x12/0x71

    It would happen because each iscsit_reset_np_thread() sets state
    to ISCSI_NP_THREAD_RESET, sends SIGINT, and then blocks waiting
    for completion on iscsi_np->np_restart_comp.

    However, if iscsi_np was active processing a login request and
    more than a single iscsit_reset_np_thread() caller to the same
    iscsi_np was blocked on iscsi_np->np_restart_comp, iscsi_np
    kthread process context in __iscsi_target_login_thread() would
    flush pending signals and only perform a single completion of
    np->np_restart_comp before going back to sleep within transport
    specific iscsit_transport->iscsi_accept_np code.

    To address this bug, add a iscsi_np->np_reset_count and update
    __iscsi_target_login_thread() to keep completing np->np_restart_comp
    until ->np_reset_count has reached zero.

    Reported-by: Gary Guo
    Tested-by: Gary Guo
    Cc: Mike Christie
    Cc: Hannes Reinecke
    Cc: stable@vger.kernel.org # 3.10+
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     

31 Jul, 2017

4 commits

  • The current logic of calculating sg_nents can fail
    if data_offset % PAGE_SIZE is not zero.

    For example -
    PAGE_SIZE = 4096
    data_len = 3072
    data_offset = 3072

    As per current logic
    sg_nents = max(1UL, DIV_ROUND_UP(data_len, PAGE_SIZE));
    sg_nents = max(1UL, DIV_ROUND_UP(3072, 4096));
    sg_nents = 1

    But as data_offset % PAGE_SIZE = 3072 we should skip 3072 bytes
    skip = 3K
    sg_nents = max(1UL, DIV_ROUND_UP(3K(skip) + 3K(data_len), 4K(PAGE_SIZE));
    sg_nents = 2;

    This patch fixes this issue by adding skip to data_len.

    Signed-off-by: Varun Prakash
    Signed-off-by: Nicholas Bellinger

    Varun Prakash
     
  • In case of multiple text responses iscsi-target
    sets both 'F' and 'C' bit for the final text response
    pdu, this issue happens because hdr->flags is not
    zeroed out before ORing with 'F' bit.

    This patch removes the | operator to fix this issue.

    Signed-off-by: Varun Prakash
    Signed-off-by: Nicholas Bellinger

    Varun Prakash
     
  • On receiving text request iscsi-target allocates buffer for
    payload in iscsit_handle_text_cmd() and assigns buffer pointer
    to cmd->text_in_ptr, this buffer is currently freed in
    iscsit_release_cmd(), if iscsi-target sets 'C' bit in text
    response then it will receive another text request from the
    initiator with ttt != 0xffffffff in this case iscsi-target
    will find cmd using itt and call iscsit_setup_text_cmd()
    which will set cmd->text_in_ptr to NULL without freeing
    previously allocated buffer.

    This patch fixes this issue by calling kfree(cmd->text_in_ptr)
    in iscsit_setup_text_cmd() before assigning NULL to it.

    For the first text request cmd->text_in_ptr is NULL as
    cmd is memset to 0 in iscsit_allocate_cmd().

    Signed-off-by: Varun Prakash
    Cc: # 4.0+
    Signed-off-by: Nicholas Bellinger

    Varun Prakash
     
  • Call __kfree_skb() after processing skb to avoid
    memory leak.

    Signed-off-by: Varun Prakash
    Signed-off-by: Nicholas Bellinger

    Varun Prakash
     

16 Jul, 2017

1 commit

  • Pull random updates from Ted Ts'o:
    "Add wait_for_random_bytes() and get_random_*_wait() functions so that
    callers can more safely get random bytes if they can block until the
    CRNG is initialized.

    Also print a warning if get_random_*() is called before the CRNG is
    initialized. By default, only one single-line warning will be printed
    per boot. If CONFIG_WARN_ALL_UNSEEDED_RANDOM is defined, then a
    warning will be printed for each function which tries to get random
    bytes before the CRNG is initialized. This can get spammy for certain
    architecture types, so it is not enabled by default"

    * tag 'random_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/random:
    random: reorder READ_ONCE() in get_random_uXX
    random: suppress spammy warnings about unseeded randomness
    random: warn when kernel uses unseeded randomness
    net/route: use get_random_int for random counter
    net/neighbor: use get_random_u32 for 32-bit hash random
    rhashtable: use get_random_u32 for hash_rnd
    ceph: ensure RNG is seeded before using
    iscsi: ensure RNG is seeded before use
    cifs: use get_random_u32 for 32-bit lock random
    random: add get_random_{bytes,u32,u64,int,long,once}_wait family
    random: add wait_for_random_bytes() API

    Linus Torvalds
     

14 Jul, 2017

1 commit

  • Pull SCSI target updates from Nicholas Bellinger:
    "It's been usually busy for summer, with most of the efforts centered
    around TCMU developments and various target-core + fabric driver bug
    fixing activities. Not particularly large in terms of LoC, but lots of
    smaller patches from many different folks.

    The highlights include:

    - ibmvscsis logical partition manager support (Michael Cyr + Bryant
    Ly)

    - Convert target/iblock WRITE_SAME to blkdev_issue_zeroout (hch +
    nab)

    - Add support for TMR percpu LUN reference counting (nab)

    - Fix a potential deadlock between EXTENDED_COPY and iscsi shutdown
    (Bart)

    - Fix COMPARE_AND_WRITE caw_sem leak during se_cmd quiesce (Jiang Yi)

    - Fix TMCU module removal (Xiubo Li)

    - Fix iser-target OOPs during login failure (Andrea Righi + Sagi)

    - Breakup target-core free_device backend driver callback (mnc)

    - Perform TCMU add/delete/reconfig synchronously (mnc)

    - Fix TCMU multiple UIO open/close sequences (mnc)

    - Fix TCMU CHECK_CONDITION sense handling (mnc)

    - Fix target-core SAM_STAT_BUSY + TASK_SET_FULL handling (mnc + nab)

    - Introduce TYPE_ZBC support in PSCSI (Damien Le Moal)

    - Fix possible TCMU memory leak + OOPs when recalculating cmd base
    size (Xiubo Li + Bryant Ly + Damien Le Moal + mnc)

    - Add login_keys_workaround attribute for non RFC initiators (Robert
    LeBlanc + Arun Easi + nab)"

    * 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (68 commits)
    iscsi-target: Add login_keys_workaround attribute for non RFC initiators
    Revert "qla2xxx: Fix incorrect tcm_qla2xxx_free_cmd use during TMR ABORT"
    tcmu: clean up the code and with one small fix
    tcmu: Fix possbile memory leak / OOPs when recalculating cmd base size
    target: export lio pgr/alua support as device attr
    target: Fix return sense reason in target_scsi3_emulate_pr_out
    target: Fix cmd size for PR-OUT in passthrough_parse_cdb
    tcmu: Fix dev_config_store
    target: pscsi: Introduce TYPE_ZBC support
    target: Use macro for WRITE_VERIFY_32 operation codes
    target: fix SAM_STAT_BUSY/TASK_SET_FULL handling
    target: remove transport_complete
    pscsi: finish cmd processing from pscsi_req_done
    tcmu: fix sense handling during completion
    target: add helper to copy sense to se_cmd buffer
    target: do not require a transport_complete for SCF_TRANSPORT_TASK_SENSE
    target: make device_mutex and device_list static
    tcmu: Fix flushing cmd entry dcache page
    tcmu: fix multiple uio open/close sequences
    tcmu: drop configured check in destroy
    ...

    Linus Torvalds
     

12 Jul, 2017

1 commit

  • This patch re-introduces part of a long standing login workaround that
    was recently dropped by:

    commit 1c99de981f30b3e7868b8d20ce5479fa1c0fea46
    Author: Nicholas Bellinger
    Date: Sun Apr 2 13:36:44 2017 -0700

    iscsi-target: Drop work-around for legacy GlobalSAN initiator

    Namely, the workaround for FirstBurstLength ended up being required by
    Mellanox Flexboot PXE boot ROMs as reported by Robert.

    So this patch re-adds the work-around for FirstBurstLength within
    iscsi_check_proposer_for_optional_reply(), and makes the key optional
    to respond when the initiator does not propose, nor respond to it.

    Also as requested by Arun, this patch introduces a new TPG attribute
    named 'login_keys_workaround' that controls the use of both the
    FirstBurstLength workaround, as well as the two other existing
    workarounds for gPXE iSCSI boot client.

    By default, the workaround is enabled with login_keys_workaround=1,
    since Mellanox FlexBoot requires it, and Arun has verified the Qlogic
    MSFT initiator already proposes FirstBurstLength, so it's uneffected
    by this re-adding this part of the original work-around.

    Reported-by: Robert LeBlanc
    Cc: Robert LeBlanc
    Reviewed-by: Arun Easi
    Cc: # 3.1+
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     

07 Jul, 2017

4 commits

  • If an iSCSI command is rejected before iscsit_process_scsi_cmd()
    is called, .reject_reason is set but iscsit_process_scsi_cmd() is
    not called. This means that the "if (cmd->reject_reason) ..." code
    in this function can be removed without changing the behavior of
    this function.

    Signed-off-by: Bart Van Assche
    Cc: Hannes Reinecke
    Cc: Christoph Hellwig
    Cc: Andy Grover
    Cc: David Disseldorp
    Signed-off-by: Nicholas Bellinger

    Bart Van Assche
     
  • Since .se_tfo is only set if a command has been submitted to
    the LIO core, check .se_tfo instead of .iscsi_opcode. Since
    __iscsit_free_cmd() only affects SCSI commands but not TMFs,
    calling that function for TMFs does not change behavior. This
    patch does not change the behavior of iscsit_free_cmd().

    Signed-off-by: Bart Van Assche
    Cc: Hannes Reinecke
    Cc: Christoph Hellwig
    Cc: Andy Grover
    Cc: David Disseldorp
    Signed-off-by: Nicholas Bellinger

    Bart Van Assche
     
  • Initialize .data_direction to DMA_NONE in iscsit_allocate_cmd()
    such that the second argument of __iscsit_free_cmd() can be left
    out. Note: this patch causes the first part of __iscsit_free_cmd()
    no longer to be skipped for TMFs. That's fine since no data
    segments are associated with TMFs.

    Signed-off-by: Bart Van Assche
    Reviewed-by: Hannes Reinecke
    Cc: Christoph Hellwig
    Cc: Andy Grover
    Cc: David Disseldorp
    Signed-off-by: Nicholas Bellinger

    Bart Van Assche
     
  • With commit 25cdda95fda7 in place to address the initial login
    PDU asynchronous socket close OOPs, go ahead and kill off the
    left-over iscsi_target_do_cleanup() and ->login_cleanup_work.

    Reported-by: Mike Christie
    Cc: Mike Christie
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     

01 Jul, 2017

1 commit


21 Jun, 2017

1 commit

  • follow Johannes Berg, semantic patch file as below,
    @@
    identifier p, p2;
    expression len;
    expression skb;
    type t, t2;
    @@
    (
    -p = __skb_put(skb, len);
    +p = __skb_put_zero(skb, len);
    |
    -p = (t)__skb_put(skb, len);
    +p = __skb_put_zero(skb, len);
    )
    ... when != p
    (
    p2 = (t2)p;
    -memset(p2, 0, len);
    |
    -memset(p, 0, len);
    )

    @@
    identifier p;
    expression len;
    expression skb;
    type t;
    @@
    (
    -t p = __skb_put(skb, len);
    +t p = __skb_put_zero(skb, len);
    )
    ... when != p
    (
    -memset(p, 0, len);
    )

    @@
    type t, t2;
    identifier p, p2;
    expression skb;
    @@
    t *p;
    ...
    (
    -p = __skb_put(skb, sizeof(t));
    +p = __skb_put_zero(skb, sizeof(t));
    |
    -p = (t *)__skb_put(skb, sizeof(t));
    +p = __skb_put_zero(skb, sizeof(t));
    )
    ... when != p
    (
    p2 = (t2)p;
    -memset(p2, 0, sizeof(*p));
    |
    -memset(p, 0, sizeof(*p));
    )

    @@
    expression skb, len;
    @@
    -memset(__skb_put(skb, len), 0, len);
    +__skb_put_zero(skb, len);

    @@
    expression skb, len, data;
    @@
    -memcpy(__skb_put(skb, len), data, len);
    +__skb_put_data(skb, data, len);

    @@
    expression SKB, C, S;
    typedef u8;
    identifier fn = {__skb_put};
    fresh identifier fn2 = fn ## "_u8";
    @@
    - *(u8 *)fn(SKB, S) = C;
    + fn2(SKB, C);

    Signed-off-by: yuan linyu
    Signed-off-by: David S. Miller

    yuan linyu
     

20 Jun, 2017

1 commit

  • It's not safe to use weak random data here, especially for the challenge
    response randomness. Since we're always in process context, it's safe to
    simply wait until we have enough randomness to carry out the
    authentication correctly.

    While we're at it, we clean up a small memleak during an error
    condition.

    Signed-off-by: Jason A. Donenfeld
    Cc: "Nicholas A. Bellinger"
    Cc: Lee Duncan
    Cc: Chris Leech
    Signed-off-by: Theodore Ts'o

    Jason A. Donenfeld
     

16 Jun, 2017

2 commits

  • It seems like a historic accident that these return unsigned char *,
    and in many places that means casts are required, more often than not.

    Make these functions return void * and remove all the casts across
    the tree, adding a (u8 *) cast only where the unsigned char pointer
    was used directly, all done with the following spatch:

    @@
    expression SKB, LEN;
    typedef u8;
    identifier fn = { skb_push, __skb_push, skb_push_rcsum };
    @@
    - *(fn(SKB, LEN))
    + *(u8 *)fn(SKB, LEN)

    @@
    expression E, SKB, LEN;
    identifier fn = { skb_push, __skb_push, skb_push_rcsum };
    type T;
    @@
    - E = ((T *)(fn(SKB, LEN)))
    + E = fn(SKB, LEN)

    @@
    expression SKB, LEN;
    identifier fn = { skb_push, __skb_push, skb_push_rcsum };
    @@
    - fn(SKB, LEN)[0]
    + *(u8 *)fn(SKB, LEN)

    Note that the last part there converts from push(...)[0] to the
    more idiomatic *(u8 *)push(...).

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • It seems like a historic accident that these return unsigned char *,
    and in many places that means casts are required, more often than not.

    Make these functions (skb_put, __skb_put and pskb_put) return void *
    and remove all the casts across the tree, adding a (u8 *) cast only
    where the unsigned char pointer was used directly, all done with the
    following spatch:

    @@
    expression SKB, LEN;
    typedef u8;
    identifier fn = { skb_put, __skb_put };
    @@
    - *(fn(SKB, LEN))
    + *(u8 *)fn(SKB, LEN)

    @@
    expression E, SKB, LEN;
    identifier fn = { skb_put, __skb_put };
    type T;
    @@
    - E = ((T *)(fn(SKB, LEN)))
    + E = fn(SKB, LEN)

    which actually doesn't cover pskb_put since there are only three
    users overall.

    A handful of stragglers were converted manually, notably a macro in
    drivers/isdn/i4l/isdn_bsdcomp.c and, oddly enough, one of the many
    instances in net/bluetooth/hci_sock.c. In the former file, I also
    had to fix one whitespace problem spatch introduced.

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     

09 Jun, 2017

3 commits

  • As originally reported by Jia-Ju, iscsit_tpg_enable_portal_group()
    holds iscsi_portal_group->tpg_state_lock while updating AUTHMETHOD
    via iscsi_update_param_value(), which performs a GFP_KERNEL
    allocation.

    However, since iscsit_tpg_enable_portal_group() is already protected
    by iscsit_get_tpg() -> iscsi_portal_group->tpg_access_lock in it's
    parent caller, ->tpg_state_lock only needs to be held when setting
    TPG_STATE_ACTIVE.

    Reported-by: Jia-Ju Bai
    Reviewed-by: Jia-Ju Bai
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     
  • When iscsi WRITE underflow occurs there are two different scenarios
    that can happen.

    Normally in practice, when an EDTL vs. SCSI CDB TRANSFER LENGTH
    underflow is detected, the iscsi immediate data payload is the
    smaller SCSI CDB TRANSFER LENGTH.

    That is, when a host fabric LLD is using a fixed size EDTL for
    a specific control CDB, the SCSI CDB TRANSFER LENGTH and actual
    SCSI payload ends up being smaller than EDTL. In iscsi, this
    means the received iscsi immediate data payload matches the
    smaller SCSI CDB TRANSFER LENGTH, because there is no more
    SCSI payload to accept beyond SCSI CDB TRANSFER LENGTH.

    However, it's possible for a malicous host to send a WRITE
    underflow where EDTL is larger than SCSI CDB TRANSFER LENGTH,
    but incoming iscsi immediate data actually matches EDTL.

    In the wild, we've never had a iscsi host environment actually
    try to do this.

    For this special case, it's wrong to truncate part of the
    control CDB payload and continue to process the command during
    underflow when immediate data payload received was larger than
    SCSI CDB TRANSFER LENGTH, so go ahead and reject and drop the
    bogus payload as a defensive action.

    Note this potential bug was originally relaxed by the following
    for allowing WRITE underflow in MSFT FCP host environments:

    commit c72c5250224d475614a00c1d7e54a67f77cd3410
    Author: Roland Dreier
    Date: Wed Jul 22 15:08:18 2015 -0700

    target: allow underflow/overflow for PR OUT etc. commands

    Cc: Roland Dreier
    Cc: Mike Christie
    Cc: Hannes Reinecke
    Cc: Martin K. Petersen
    Cc: # v4.3+
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     
  • This patch fixes a BUG() in iscsit_close_session() that could be
    triggered when iscsit_logout_post_handler() execution from within
    tx thread context was not run for more than SECONDS_FOR_LOGOUT_COMP
    (15 seconds), and the TCP connection didn't already close before
    then forcing tx thread context to automatically exit.

    This would manifest itself during explicit logout as:

    [33206.974254] 1 connection(s) still exist for iSCSI session to iqn.1993-08.org.debian:01:3f5523242179
    [33206.980184] INFO: NMI handler (kgdb_nmi_handler) took too long to run: 2100.772 msecs
    [33209.078643] ------------[ cut here ]------------
    [33209.078646] kernel BUG at drivers/target/iscsi/iscsi_target.c:4346!

    Normally when explicit logout attempt fails, the tx thread context
    exits and iscsit_close_connection() from rx thread context does the
    extra cleanup once it detects conn->conn_logout_remove has not been
    cleared by the logout type specific post handlers.

    To address this special case, if the logout post handler in tx thread
    context detects conn->tx_thread_active has already been cleared, simply
    return and exit in order for existing iscsit_close_connection()
    logic from rx thread context do failed logout cleanup.

    Reported-by: Bart Van Assche
    Tested-by: Bart Van Assche
    Cc: Mike Christie
    Cc: Hannes Reinecke
    Cc: Sagi Grimberg
    Cc: stable@vger.kernel.org # 3.14+
    Tested-by: Gary Guo
    Tested-by: Chu Yuan Lin
    Signed-off-by: Nicholas Bellinger

    Nicholas Bellinger
     

08 Jun, 2017

1 commit

  • the adapter consumes two tids for every ipv6 offload
    connection be it active or passive, calculate tid usage
    count accordingly.

    Also change the signatures of relevant functions to get
    the address family.

    Signed-off-by: Rizwan Ansari
    Signed-off-by: Varun Prakash
    Signed-off-by: Ganesh Goudar
    Signed-off-by: David S. Miller

    Ganesh Goudar