aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/main.c7
-rw-r--r--src/nvim/message.c2
-rw-r--r--src/nvim/misc1.c16
-rw-r--r--src/nvim/os/env.c13
-rw-r--r--src/nvim/screen.c6
-rw-r--r--src/nvim/strings.c2
6 files changed, 33 insertions, 13 deletions
diff --git a/src/nvim/main.c b/src/nvim/main.c
index 96c2168bca..af7c194edc 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -605,9 +605,14 @@ void getout(int exitval)
buf_T *buf = wp->w_buffer;
if (buf_get_changedtick(buf) != -1) {
+ bufref_T bufref;
+
+ set_bufref(&bufref, buf);
apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname,
buf->b_fname, false, buf);
- buf_set_changedtick(buf, -1); // note that we did it already
+ if (bufref_valid(&bufref)) {
+ buf_set_changedtick(buf, -1); // note that we did it already
+ }
// start all over, autocommands may mess up the lists
next_tp = first_tabpage;
break;
diff --git a/src/nvim/message.c b/src/nvim/message.c
index 947cd0735e..4b0824c90f 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -610,7 +610,7 @@ static bool emsgfv(const char *fmt, va_list ap)
/// detected when fuzzing vim.
void iemsg(const char *s)
{
- msg((char_u *)s);
+ emsg((char_u *)s);
#ifdef ABORT_ON_INTERNAL_ERROR
abort();
#endif
diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c
index e87c754eb8..caaa310a8b 100644
--- a/src/nvim/misc1.c
+++ b/src/nvim/misc1.c
@@ -1605,11 +1605,19 @@ int del_bytes(colnr_T count, bool fixpos_arg, bool use_delcombine)
char_u *oldp = ml_get(lnum);
colnr_T oldlen = (colnr_T)STRLEN(oldp);
- /*
- * Can't do anything when the cursor is on the NUL after the line.
- */
- if (col >= oldlen)
+ // Can't do anything when the cursor is on the NUL after the line.
+ if (col >= oldlen) {
+ return FAIL;
+ }
+ // If "count" is zero there is nothing to do.
+ if (count == 0) {
+ return OK;
+ }
+ // If "count" is negative the caller must be doing something wrong.
+ if (count < 1) {
+ IEMSGN("E950: Invalid count for del_bytes(): %ld", count);
return FAIL;
+ }
/* If 'delcombine' is set and deleting (less than) one character, only
* delete the last combining character. */
diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c
index 6997156d4c..2f90d0bc9e 100644
--- a/src/nvim/os/env.c
+++ b/src/nvim/os/env.c
@@ -457,12 +457,15 @@ void expand_env_esc(char_u *restrict srcp,
} else if ((src[0] == ' ' || src[0] == ',') && !one) {
at_start = true;
}
- *dst++ = *src++;
- --dstlen;
+ if (dstlen > 0) {
+ *dst++ = *src++;
+ dstlen--;
- if (prefix != NULL && src - prefix_len >= srcp
- && STRNCMP(src - prefix_len, prefix, prefix_len) == 0) {
- at_start = true;
+ if (prefix != NULL
+ && src - prefix_len >= srcp
+ && STRNCMP(src - prefix_len, prefix, prefix_len) == 0) {
+ at_start = true;
+ }
}
}
}
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index c3996046e0..6b75902f87 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -1448,7 +1448,11 @@ static void win_update(win_T *wp)
wp->w_lines[idx].wl_lnum = lnum;
wp->w_lines[idx].wl_valid = true;
- if (row > wp->w_height) { // past end of screen
+
+ // Past end of the window or end of the screen. Note that after
+ // resizing wp->w_height may be end up too big. That's a problem
+ // elsewhere, but prevent a crash here.
+ if (row > wp->w_height || row + wp->w_winrow >= Rows) {
// we may need the size of that too long line later on
if (dollar_vcol == -1) {
wp->w_lines[idx].wl_size = plines_win(wp, lnum, true);
diff --git a/src/nvim/strings.c b/src/nvim/strings.c
index f24de72743..17c4a75a64 100644
--- a/src/nvim/strings.c
+++ b/src/nvim/strings.c
@@ -1217,6 +1217,7 @@ int vim_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap,
str_arg_l = 3;
zero_padding = 0;
} else {
+ // Regular float number
format[0] = '%';
size_t l = 1;
if (force_sign) {
@@ -1241,7 +1242,6 @@ int vim_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap,
format[l] = (char)(fmt_spec == 'F' ? 'f' : fmt_spec);
format[l + 1] = NUL;
- // Regular float number
str_arg_l = (size_t)snprintf(tmp, sizeof(tmp), format, f);
assert(str_arg_l < sizeof(tmp));