Commit 8ffcb756 authored by Corey Minyard's avatar Corey Minyard
Browse files

ipmi: Fix strcpy source and destination the same



The source and destination of some strcpy operations was the same.
Split out the part of the operations that needed to be done for those
particular calls so the unnecessary copy wasn't done.

Reported-by: default avatarkernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202506140756.EFXXvIP4-lkp@intel.com/


Signed-off-by: default avatarCorey Minyard <corey@minyard.net>
parent cd2e103d
Loading
Loading
Loading
Loading
+42 −17
Original line number Diff line number Diff line
@@ -1146,14 +1146,8 @@ static struct ipmi_smi_watcher smi_watcher = {
	.smi_gone = ipmi_smi_gone
};

static int action_op(const char *inval, char *outval)
static int action_op_set_val(const char *inval)
{
	if (outval)
		strcpy(outval, action);

	if (!inval)
		return 0;

	if (strcmp(inval, "reset") == 0)
		action_val = WDOG_TIMEOUT_RESET;
	else if (strcmp(inval, "none") == 0)
@@ -1164,18 +1158,26 @@ static int action_op(const char *inval, char *outval)
		action_val = WDOG_TIMEOUT_POWER_DOWN;
	else
		return -EINVAL;
	strcpy(action, inval);
	return 0;
}

static int preaction_op(const char *inval, char *outval)
static int action_op(const char *inval, char *outval)
{
	int rv;

	if (outval)
		strcpy(outval, preaction);
		strcpy(outval, action);

	if (!inval)
		return 0;
	rv = action_op_set_val(inval);
	if (!rv)
		strcpy(action, inval);
	return rv;
}

static int preaction_op_set_val(const char *inval)
{
	if (strcmp(inval, "pre_none") == 0)
		preaction_val = WDOG_PRETIMEOUT_NONE;
	else if (strcmp(inval, "pre_smi") == 0)
@@ -1188,18 +1190,26 @@ static int preaction_op(const char *inval, char *outval)
		preaction_val = WDOG_PRETIMEOUT_MSG_INT;
	else
		return -EINVAL;
	strcpy(preaction, inval);
	return 0;
}

static int preop_op(const char *inval, char *outval)
static int preaction_op(const char *inval, char *outval)
{
	int rv;

	if (outval)
		strcpy(outval, preop);
		strcpy(outval, preaction);

	if (!inval)
		return 0;
	rv = preaction_op_set_val(inval);
	if (!rv)
		strcpy(preaction, inval);
	return 0;
}

static int preop_op_set_val(const char *inval)
{
	if (strcmp(inval, "preop_none") == 0)
		preop_val = WDOG_PREOP_NONE;
	else if (strcmp(inval, "preop_panic") == 0)
@@ -1208,6 +1218,21 @@ static int preop_op(const char *inval, char *outval)
		preop_val = WDOG_PREOP_GIVE_DATA;
	else
		return -EINVAL;
	return 0;
}

static int preop_op(const char *inval, char *outval)
{
	int rv;

	if (outval)
		strcpy(outval, preop);

	if (!inval)
		return 0;

	rv = preop_op_set_val(inval);
	if (!rv)
		strcpy(preop, inval);
	return 0;
}
@@ -1245,18 +1270,18 @@ static int __init ipmi_wdog_init(void)
{
	int rv;

	if (action_op(action, NULL)) {
	if (action_op_set_val(action)) {
		action_op("reset", NULL);
		pr_info("Unknown action '%s', defaulting to reset\n", action);
	}

	if (preaction_op(preaction, NULL)) {
	if (preaction_op_set_val(preaction)) {
		preaction_op("pre_none", NULL);
		pr_info("Unknown preaction '%s', defaulting to none\n",
			preaction);
	}

	if (preop_op(preop, NULL)) {
	if (preop_op_set_val(preop)) {
		preop_op("preop_none", NULL);
		pr_info("Unknown preop '%s', defaulting to none\n", preop);
	}