aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval/funcs.c14
-rw-r--r--src/nvim/eval/typval.c13
-rw-r--r--src/nvim/globals.h1
3 files changed, 23 insertions, 5 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index c5fa0f12cc..b56034b92d 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -95,7 +95,6 @@ PRAGMA_DIAG_POP
static char *e_listarg = N_("E686: Argument of %s must be a List");
-static char *e_stringreq = N_("E928: String required");
static char *e_invalwindow = N_("E957: Invalid window number");
/// Dummy va_list for passing to vim_snprintf
@@ -1877,10 +1876,12 @@ static void f_eventhandler(typval_T *argvars, typval_T *rettv, FunPtr fptr)
*/
static void f_executable(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- const char *name = tv_get_string(&argvars[0]);
+ if (tv_check_for_string(&argvars[0]) == FAIL) {
+ return;
+ }
// Check in $PATH and also check directly if there is a directory name
- rettv->vval.v_number = os_can_exe(name, NULL, true);
+ rettv->vval.v_number = os_can_exe(tv_get_string(&argvars[0]), NULL, true);
}
typedef struct {
@@ -1984,10 +1985,13 @@ static void f_execute(typval_T *argvars, typval_T *rettv, FunPtr fptr)
/// "exepath()" function
static void f_exepath(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
- const char *arg = tv_get_string(&argvars[0]);
+ if (tv_check_for_string(&argvars[0]) == FAIL) {
+ return;
+ }
+
char *path = NULL;
- (void)os_can_exe(arg, &path, true);
+ (void)os_can_exe(tv_get_string(&argvars[0]), &path, true);
rettv->v_type = VAR_STRING;
rettv->vval.v_string = (char_u *)path;
diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c
index b62820fecc..02d32a4f86 100644
--- a/src/nvim/eval/typval.c
+++ b/src/nvim/eval/typval.c
@@ -2953,6 +2953,19 @@ float_T tv_get_float(const typval_T *const tv)
return 0;
}
+// Give an error and return FAIL unless "tv" is a non-empty string.
+int tv_check_for_string(const typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_PURE
+{
+ if (tv->v_type != VAR_STRING
+ || tv->vval.v_string == NULL
+ || *tv->vval.v_string == NUL) {
+ EMSG(_(e_stringreq));
+ return FAIL;
+ }
+ return OK;
+}
+
/// Get the string value of a "stringish" VimL object.
///
/// @param[in] tv Object to get value of.
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index e0853e900f..c53c1546a4 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -935,6 +935,7 @@ EXTERN char_u e_readonly[] INIT(= N_(
"E45: 'readonly' option is set (add ! to override)"));
EXTERN char_u e_readonlyvar[] INIT(= N_(
"E46: Cannot change read-only variable \"%.*s\""));
+EXTERN char_u e_stringreq[] INIT(= N_("E928: String required"));
EXTERN char_u e_dictreq[] INIT(= N_("E715: Dictionary required"));
EXTERN char_u e_toomanyarg[] INIT(= N_(
"E118: Too many arguments for function: %s"));