All of lore.kernel.org
 help / color / mirror / Atom feed
From: Petr Vorel <pvorel@suse.cz>
To: Li Wang <liwang@redhat.com>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH 1/3] kconfig: add funtion to parse /proc/cmdline
Date: Fri, 8 Mar 2024 08:12:30 +0100	[thread overview]
Message-ID: <20240308071230.GB238191@pevik> (raw)
In-Reply-To: <20240308045230.3106549-1-liwang@redhat.com>

Hi Li,

> In tst_kconfig.c, it adds the tst_kcmdline_parse function to
> read and parse command-line parameters from /proc/cmdline.
> This function tokenizes the command line, matches keys with
> the provided parameter array, and stores the associated values.
> The update enhances the testing framework's ability to handle
> kernel configuration parameters dynamically.

> Signed-off-by: Li Wang <liwang@redhat.com>
> ---
>  include/tst_kconfig.h | 23 +++++++++++++++++++++++
>  lib/tst_kconfig.c     | 41 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 64 insertions(+)

> diff --git a/include/tst_kconfig.h b/include/tst_kconfig.h
> index 8b24a8380..0ecf2c0d1 100644
> --- a/include/tst_kconfig.h
> +++ b/include/tst_kconfig.h
> @@ -64,4 +64,27 @@ void tst_kconfig_read(struct tst_kconfig_var vars[], size_t vars_len);
>   */
>  int tst_kconfig_check(const char *const kconfigs[]);

> +/**
> + * Macro to initialize a tst_kcmdline_param structure with a specified parameter
> + * name and an empty value. This is useful for setting up an array of parameter
> + * structures before parsing the actual command-line arguments.
> + */
> +#define TST_KCMDLINE_INIT(paraname) { \
> +	.key = paraname, \
> +	.value = "" \
> +}
> +
> +/* Structure for storing command-line parameter key and its corresponding value */
> +struct tst_kcmdline_param {
> +	const char *key;
> +	char value[128];
> +};
> +
> +/**
> + * Parses command-line parameters from /proc/cmdline and stores them in params array
> + * params: The array of tst_kcmdline_param structures to be filled with parsed key-value pairs
> + * params_len: The length of the params array, indicating how many parameters to parse
> + */
> +void tst_kcmdline_parse(struct tst_kcmdline_param params[], size_t params_len);
> +
>  #endif	/* TST_KCONFIG_H__ */
> diff --git a/lib/tst_kconfig.c b/lib/tst_kconfig.c
> index 595ea4b09..f79dea5c6 100644
> --- a/lib/tst_kconfig.c
> +++ b/lib/tst_kconfig.c
> @@ -565,3 +565,44 @@ char tst_kconfig_get(const char *confname)

>  	return var.choice;
>  }
> +
> +void tst_kcmdline_parse(struct tst_kcmdline_param params[], size_t params_len) {
> +	FILE *proc_cmdline;
> +	char cmdline[4096];
> +	char *token, *key, *value;
> +
> +	proc_cmdline = fopen("/proc/cmdline", "r");
Why not SAFE_FOPEN() ?
> +	if (proc_cmdline == NULL)
> +		tst_brk(TBROK | TERRNO, "Failed to open /proc/cmdline for reading");
> +
> +	if (fgets(cmdline, sizeof(cmdline), proc_cmdline) == NULL) {
> +		fclose(proc_cmdline);
Maybe SAFE_FCLOSE() ?
> +
> +		if (feof(proc_cmdline))
tst_kconfig.c:581:21: warning: pointer ‘proc_cmdline’ used after ‘fclose’ [-Wuse-after-free]
  581 |                 if (feof(proc_cmdline))
      |                     ^~~~~~~~~~~~~~~~~~
tst_kconfig.c:579:17: note: call to ‘fclose’ here
  579 |                 fclose(proc_cmdline);
      |                 ^~~~~~~~~~~~~~~~~~~~

> +			tst_brk(TBROK, "End-of-File reached on /proc/cmdline without reading any data");
> +		else
> +			tst_brk(TBROK | TERRNO, "Failed to read from /proc/cmdline");
> +	}
> +	fclose(proc_cmdline);
Maybe SAFE_FCLOSE() ?

Kind regards,
Petr

> +
> +	token = strtok(cmdline, " ");
> +	while (token != NULL) {
> +		key = token;
> +		value = strchr(token, '=');
> +
> +		if (value != NULL) {
> +			/* Split the token into key and value at '=' */
> +			*value++ = '\0';
> +
> +			for (size_t i = 0; i < params_len; i++) {
> +				if (strcmp(params[i].key, key) == 0) {
> +					strncpy(params[i].value, value, sizeof(params[i].value) - 1);
> +					params[i].value[sizeof(params[i].value) - 1] = '\0';
> +					break;
> +				}
> +			}
> +		}
> +
> +		token = strtok(NULL, " ");
> +	}
> +}

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

  parent reply	other threads:[~2024-03-08  7:16 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-08  4:52 [LTP] [PATCH 1/3] kconfig: add funtion to parse /proc/cmdline Li Wang
2024-03-08  4:52 ` [LTP] [PATCH 2/3] init_module: To handle kernel module signature enforcement Li Wang
2024-03-08  8:47   ` Petr Vorel
2024-03-09  8:11     ` Li Wang
2024-03-08  4:52 ` [LTP] [PATCH 3/3] stack_clash: make use of tst_kcmdline_parse Li Wang
2024-03-08  8:56   ` Petr Vorel
2024-03-08  7:12 ` Petr Vorel [this message]
2024-03-08 16:31 ` [LTP] [PATCH 1/3] kconfig: add funtion to parse /proc/cmdline Cyril Hrubis
2024-03-09  8:09   ` Li Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240308071230.GB238191@pevik \
    --to=pvorel@suse.cz \
    --cc=liwang@redhat.com \
    --cc=ltp@lists.linux.it \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.