mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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:
parent
679f3072f6
commit
33f1471472
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user