Re: [PATCH 1/2] scsi: target: add extract_param_str() helper

Lee Duncan <[email protected]> Wed, 3 Jun 2026 09:30:57 -0700
Newsgroups org.kernel.vger.target-devel,org.kernel.vger.linux-scsi
Message-ID <CAPj3X_XbHq3W0yozq6LWMom-m2jcWeGiwK=cbJKyns9UXEFeog@mail.gmail.com>
On Tue, Jun 2, 2026 at 5:04 AM David Disseldorp <[email protected]> wrote:
>
> The existing extract_param() helper, detects and strips any hex (0x/0X)
> or base64 (0b/0B). This makes sense for some parameters, but not strings
> such as CHAP_N.
>
> Signed-off-by: David Disseldorp <[email protected]>
> ---
>  drivers/target/iscsi/iscsi_target_nego.c | 37 ++++++++++++++++++++++++
>  drivers/target/iscsi/iscsi_target_nego.h |  1 +
>  2 files changed, 38 insertions(+)
>
> diff --git a/drivers/target/iscsi/iscsi_target_nego.c b/drivers/target/iscsi/iscsi_target_nego.c
> index b03ed154ca34e..53b17d3cc86c3 100644
> --- a/drivers/target/iscsi/iscsi_target_nego.c
> +++ b/drivers/target/iscsi/iscsi_target_nego.c
> @@ -98,6 +98,43 @@ int extract_param(
>         return 0;
>  }
>
> +/* same as extract_param() above, but don't interpret any type-prefix */
> +int extract_param_str(
> +       const char *in_buf,
> +       const char *pattern,
> +       unsigned int max_length,
> +       char *out_buf)
> +{
> +       char *ptr;
> +       int len;
> +
> +       if (!in_buf || !pattern || !out_buf)
> +               return -EINVAL;
> +
> +       ptr = strstr(in_buf, pattern);
> +       if (!ptr)
> +               return -ENOENT;
> +
> +       ptr = strstr(ptr, "=");
> +       if (!ptr)
> +               return -EINVAL;
> +
> +       ptr += 1;
> +       len = strlen_semi(ptr);
> +       if (len < 0)
> +               return -EINVAL;
> +
> +       if (len >= max_length) {
> +               pr_err("Length of input: %d exceeds max_length:"
> +                       " %d\n", len, max_length);
> +               return -EINVAL;
> +       }
> +       memcpy(out_buf, ptr, len);
> +       out_buf[len] = '\0';
> +
> +       return 0;
> +}
> +
>  static struct iscsi_node_auth *iscsi_get_node_auth(struct iscsit_conn *conn)
>  {
>         struct iscsi_portal_group *tpg;
> diff --git a/drivers/target/iscsi/iscsi_target_nego.h b/drivers/target/iscsi/iscsi_target_nego.h
> index e60a46d348352..6b72edd2aef2e 100644
> --- a/drivers/target/iscsi/iscsi_target_nego.h
> +++ b/drivers/target/iscsi/iscsi_target_nego.h
> @@ -13,6 +13,7 @@ struct iscsi_np;
>  extern void convert_null_to_semi(char *, int);
>  extern int extract_param(const char *, const char *, unsigned int, char *,
>                 unsigned char *);
> +extern int extract_param_str(const char *, const char *, unsigned int, char *);
>  extern int iscsi_target_check_login_request(struct iscsit_conn *,
>                 struct iscsi_login *);
>  extern int iscsi_target_locate_portal(struct iscsi_np *, struct iscsit_conn *,
> --
> 2.51.0
>
>

Reviewed-by: Lee Duncan <[email protected]>