REORG/MINOR: cfgparse: eliminate code duplication by lshift_args()
Some checks are pending
Contrib / build (push) Waiting to run
alpine/musl / gcc (push) Waiting to run
VTest / Generate Build Matrix (push) Waiting to run
VTest / (push) Blocked by required conditions
Windows / Windows, gcc, all features (push) Waiting to run

There were similar parts of the code in "no" and "default" prefix
keywords handling. This duplication caused the bug once.

No backport needed.
This commit is contained in:
Egor Shestakov 2026-01-15 15:41:38 +00:00 committed by Willy Tarreau
parent 447d73dc99
commit a3ee35cbfc

View file

@ -133,6 +133,26 @@ struct cfg_kw_list cfg_keywords = {
.list = LIST_HEAD_INIT(cfg_keywords.list)
};
/*
* Shifts <args> one position to the left.
* This function tricky preserves internal allocated structure of the
* <args>. We defer the deallocation of the "shifted off" element, by
* making it an empty string and moving it into the gap that appears after
* the shift.
*/
static void
lshift_args(char **args)
{
int i;
char *shifted;
shifted = args[0];
for (i = 0; *args[i + 1]; i++)
args[i] = args[i + 1];
*shifted = '\0';
args[i] = shifted;
}
/*
* converts <str> to a list of listeners which are dynamically allocated.
* The format is "{addr|'*'}:port[-end][,{addr|'*'}:port[-end]]*", where :
@ -2674,24 +2694,12 @@ next_line:
/* check for keyword modifiers "no" and "default" */
if (strcmp(args[0], "no") == 0) {
char *tmp;
kwm = KWM_NO;
tmp = args[0];
for (arg=0; *args[arg+1]; arg++)
args[arg] = args[arg+1]; // shift args after inversion
*tmp = '\0'; // fix the next arg to \0
args[arg] = tmp;
lshift_args(args);
}
else if (strcmp(args[0], "default") == 0) {
char *tmp;
kwm = KWM_DEF;
tmp = args[0];
for (arg=0; *args[arg+1]; arg++)
args[arg] = args[arg+1]; // shift args after inversion
*tmp = '\0';
args[arg] = tmp;
lshift_args(args);
}
if (kwm != KWM_STD && strcmp(args[0], "option") != 0 &&