mirror of
https://github.com/neovim/neovim.git
synced 2025-09-18 17:28:23 +00:00
fix(api): validate command names in nvim_add_user_command (#17406)
This uses the same validation used when defining commands with `:command`.
This commit is contained in:
@@ -5164,6 +5164,24 @@ char_u *get_command_name(expand_T *xp, int idx)
|
||||
return cmdnames[idx].cmd_name;
|
||||
}
|
||||
|
||||
/// Check for a valid user command name
|
||||
///
|
||||
/// If the given {name} is valid, then a pointer to the end of the valid name is returned.
|
||||
/// Otherwise, returns NULL.
|
||||
char *uc_validate_name(char *name)
|
||||
{
|
||||
if (ASCII_ISALPHA(*name)) {
|
||||
while (ASCII_ISALNUM(*name)) {
|
||||
name++;
|
||||
}
|
||||
}
|
||||
if (!ends_excmd(*name) && !ascii_iswhite(*name)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
int uc_add_command(char_u *name, size_t name_len, char_u *rep, uint32_t argt, long def, int flags,
|
||||
int compl, char_u *compl_arg, LuaRef compl_luaref, cmd_addr_T addr_type,
|
||||
LuaRef luaref, bool force)
|
||||
@@ -5679,23 +5697,18 @@ static void ex_command(exarg_T *eap)
|
||||
|
||||
// Get the name (if any) and skip to the following argument.
|
||||
name = p;
|
||||
if (ASCII_ISALPHA(*p)) {
|
||||
while (ASCII_ISALNUM(*p)) {
|
||||
p++;
|
||||
}
|
||||
}
|
||||
if (!ends_excmd(*p) && !ascii_iswhite(*p)) {
|
||||
end = (char_u *)uc_validate_name((char *)name);
|
||||
if (!end) {
|
||||
emsg(_("E182: Invalid command name"));
|
||||
return;
|
||||
}
|
||||
end = p;
|
||||
name_len = (int)(end - name);
|
||||
name_len = (size_t)(end - name);
|
||||
|
||||
// If there is nothing after the name, and no attributes were specified,
|
||||
// we are listing commands
|
||||
p = skipwhite(end);
|
||||
if (!has_attr && ends_excmd(*p)) {
|
||||
uc_list(name, end - name);
|
||||
uc_list(name, name_len);
|
||||
} else if (!ASCII_ISUPPER(*name)) {
|
||||
emsg(_("E183: User defined commands must start with an uppercase letter"));
|
||||
} else if (name_len <= 4 && STRNCMP(name, "Next", name_len) == 0) {
|
||||
@@ -5703,7 +5716,7 @@ static void ex_command(exarg_T *eap)
|
||||
} else if (compl > 0 && (argt & EX_EXTRA) == 0) {
|
||||
emsg(_(e_complete_used_without_nargs));
|
||||
} else {
|
||||
uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg, LUA_NOREF,
|
||||
uc_add_command(name, name_len, p, argt, def, flags, compl, compl_arg, LUA_NOREF,
|
||||
addr_type_arg, LUA_NOREF, eap->forceit);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user