vim-patch:9.0.0540: assigning stack variable to argument confuses Coverity

Problem:    Assigning stack variable to argument confuses Coverity.
Solution:   Use a local pointer, also makes the code simpler.
6f98114e4a
This commit is contained in:
zeertzjq 2022-09-22 21:05:29 +08:00
parent 679f3072f6
commit 33f1471472

View File

@ -779,10 +779,11 @@ void ex_set(exarg_T *eap)
/// Part of do_set() for string options. /// Part of do_set() for string options.
/// @return FAIL on failure, do not process further options. /// @return FAIL on failure, do not process further options.
static int do_set_string(int opt_idx, int opt_flags, char **arg, int nextchar, set_op_T op_arg, static int do_set_string(int opt_idx, int opt_flags, char **argp, int nextchar, set_op_T op_arg,
uint32_t flags, char *varp_arg, char *errbuf, size_t errbuflen, uint32_t flags, char *varp_arg, char *errbuf, size_t errbuflen,
int *value_checked, char **errmsg) int *value_checked, char **errmsg)
{ {
char *arg = *argp;
set_op_T op = op_arg; set_op_T op = op_arg;
char *varp = varp_arg; char *varp = varp_arg;
char *save_arg = NULL; char *save_arg = NULL;
@ -849,15 +850,15 @@ static int do_set_string(int opt_idx, int opt_flags, char **arg, int nextchar, s
} else if (nextchar == '<') { // set to global val } else if (nextchar == '<') { // set to global val
newval = xstrdup(*(char **)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL)); newval = xstrdup(*(char **)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL));
} else { } else {
(*arg)++; // jump to after the '=' or ':' arg++; // jump to after the '=' or ':'
// Set 'keywordprg' to ":help" if an empty // Set 'keywordprg' to ":help" if an empty
// value was passed to :set by the user. // value was passed to :set by the user.
// Misuse errbuf[] for the resulting string. // Misuse errbuf[] for the resulting string.
if (varp == (char *)&p_kp && (**arg == NUL || **arg == ' ')) { if (varp == (char *)&p_kp && (*arg == NUL || *arg == ' ')) {
STRCPY(errbuf, ":help"); STRCPY(errbuf, ":help");
save_arg = *arg; save_arg = arg;
*arg = errbuf; arg = errbuf;
} else if (varp == (char *)&p_bs && ascii_isdigit(**(char_u **)varp)) { } else if (varp == (char *)&p_bs && ascii_isdigit(**(char_u **)varp)) {
// Convert 'backspace' number to string, for // Convert 'backspace' number to string, for
// adding, prepending and removing string. // adding, prepending and removing string.
@ -887,11 +888,11 @@ static int do_set_string(int opt_idx, int opt_flags, char **arg, int nextchar, s
origval_g = *(char_u **)varp; origval_g = *(char_u **)varp;
} }
oldval = *(char_u **)varp; oldval = *(char_u **)varp;
} else if (varp == (char *)&p_ww && ascii_isdigit(**arg)) { } else if (varp == (char *)&p_ww && ascii_isdigit(*arg)) {
// Convert 'whichwrap' number to string, for backwards compatibility // Convert 'whichwrap' number to string, for backwards compatibility
// with Vim 3.0. // with Vim 3.0.
*whichwrap = NUL; *whichwrap = NUL;
int i = getdigits_int(arg, true, 0); int i = getdigits_int(&arg, true, 0);
if (i & 1) { if (i & 1) {
xstrlcat(whichwrap, "b,", sizeof(whichwrap)); xstrlcat(whichwrap, "b,", sizeof(whichwrap));
} }
@ -910,12 +911,12 @@ static int do_set_string(int opt_idx, int opt_flags, char **arg, int nextchar, s
if (*whichwrap != NUL) { // remove trailing , if (*whichwrap != NUL) { // remove trailing ,
whichwrap[strlen(whichwrap) - 1] = NUL; whichwrap[strlen(whichwrap) - 1] = NUL;
} }
save_arg = *arg; save_arg = arg;
*arg = whichwrap; arg = whichwrap;
} else if (**arg == '>' && (varp == (char *)&p_dir || varp == (char *)&p_bdir)) { } else if (*arg == '>' && (varp == (char *)&p_dir || varp == (char *)&p_bdir)) {
// Remove '>' before 'dir' and 'bdir', for backwards compatibility with // Remove '>' before 'dir' and 'bdir', for backwards compatibility with
// version 3.0 // version 3.0
(*arg)++; arg++;
} }
// Copy the new string into allocated memory. // Copy the new string into allocated memory.
@ -923,7 +924,7 @@ static int do_set_string(int opt_idx, int opt_flags, char **arg, int nextchar, s
// backslashes. // backslashes.
// get a bit too much // get a bit too much
newlen = (unsigned)strlen(*arg) + 1; newlen = (unsigned)strlen(arg) + 1;
if (op != OP_NONE) { if (op != OP_NONE) {
newlen += (unsigned)STRLEN(origval) + 1; newlen += (unsigned)STRLEN(origval) + 1;
} }
@ -935,26 +936,26 @@ static int do_set_string(int opt_idx, int opt_flags, char **arg, int nextchar, s
// are not removed, and keep backslash at start, for "\\machine\path", // are not removed, and keep backslash at start, for "\\machine\path",
// but do remove it for "\\\\machine\\path". // but do remove it for "\\\\machine\\path".
// The reverse is found in ExpandOldSetting(). // The reverse is found in ExpandOldSetting().
while (**arg && !ascii_iswhite(**arg)) { while (*arg && !ascii_iswhite(*arg)) {
if (**arg == '\\' && (*arg)[1] != NUL if (*arg == '\\' && arg[1] != NUL
#ifdef BACKSLASH_IN_FILENAME #ifdef BACKSLASH_IN_FILENAME
&& !((flags & P_EXPAND) && !((flags & P_EXPAND)
&& vim_isfilec((*arg)[1]) && vim_isfilec(arg[1])
&& !ascii_iswhite((*arg)[1]) && !ascii_iswhite(arg[1])
&& ((*arg)[1] != '\\' && (arg[1] != '\\'
|| (s == newval && (*arg)[2] != '\\'))) || (s == newval && arg[2] != '\\')))
#endif #endif
) { ) {
(*arg)++; // remove backslash arg++; // remove backslash
} }
int i = utfc_ptr2len(*arg); int i = utfc_ptr2len(arg);
if (i > 1) { if (i > 1) {
// copy multibyte char // copy multibyte char
memmove(s, *arg, (size_t)i); memmove(s, arg, (size_t)i);
*arg += i; arg += i;
s += i; s += i;
} else { } else {
*s++ = *(*arg)++; *s++ = *arg++;
} }
} }
*s = NUL; *s = NUL;
@ -1062,7 +1063,7 @@ static int do_set_string(int opt_idx, int opt_flags, char **arg, int nextchar, s
} }
if (save_arg != NULL) { // number for 'whichwrap' if (save_arg != NULL) { // number for 'whichwrap'
*arg = save_arg; arg = save_arg;
} }
} }
@ -1117,6 +1118,7 @@ static int do_set_string(int opt_idx, int opt_flags, char **arg, int nextchar, s
xfree(saved_origval_g); xfree(saved_origval_g);
xfree(saved_newval); xfree(saved_newval);
*argp = arg;
return *errmsg == NULL ? OK : FAIL; return *errmsg == NULL ? OK : FAIL;
} }