aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/README.md4
-rw-r--r--src/nvim/shada.c34
2 files changed, 25 insertions, 13 deletions
diff --git a/src/nvim/README.md b/src/nvim/README.md
index 02464c2500..3c956cb2e9 100644
--- a/src/nvim/README.md
+++ b/src/nvim/README.md
@@ -60,9 +60,9 @@ Enable the sanitizer(s) via these environment variables:
# Change to detect_leaks=1 to detect memory leaks (slower).
export ASAN_OPTIONS="detect_leaks=0:log_path=$HOME/logs/asan"
- export ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer
+ export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
- export MSAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer
+ export MSAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
export TSAN_OPTIONS="external_symbolizer_path=/usr/lib/llvm-5.0/bin/llvm-symbolizer log_path=${HOME}/logs/tsan"
Logs will be written to `${HOME}/logs/*san.PID`.
diff --git a/src/nvim/shada.c b/src/nvim/shada.c
index d23985ca86..3ebe75b980 100644
--- a/src/nvim/shada.c
+++ b/src/nvim/shada.c
@@ -274,7 +274,7 @@ typedef struct {
char sep;
list_T *additional_elements;
} history_item;
- struct reg {
+ struct reg { // yankreg_T
char name;
MotionType type;
char **contents;
@@ -4139,15 +4139,19 @@ static inline size_t shada_init_jumps(
void shada_encode_regs(msgpack_sbuffer *const sbuf)
FUNC_ATTR_NONNULL_ALL
{
- WriteMergerState wms;
- shada_initialize_registers(&wms, -1);
+ WriteMergerState *const wms = xcalloc(1, sizeof(*wms));
+ shada_initialize_registers(wms, -1);
msgpack_packer packer;
msgpack_packer_init(&packer, sbuf, msgpack_sbuffer_write);
- for (size_t i = 0; i < ARRAY_SIZE(wms.registers); i++) {
- if (wms.registers[i].data.type == kSDItemRegister) {
- shada_pack_pfreed_entry(&packer, wms.registers[i], 0);
+ for (size_t i = 0; i < ARRAY_SIZE(wms->registers); i++) {
+ if (wms->registers[i].data.type == kSDItemRegister) {
+ if (kSDWriteFailed
+ == shada_pack_pfreed_entry(&packer, wms->registers[i], 0)) {
+ abort();
+ }
}
}
+ xfree(wms);
}
/// Write jumplist ShaDa entries in given msgpack_sbuffer.
@@ -4163,7 +4167,9 @@ void shada_encode_jumps(msgpack_sbuffer *const sbuf)
msgpack_packer packer;
msgpack_packer_init(&packer, sbuf, msgpack_sbuffer_write);
for (size_t i = 0; i < jumps_size; i++) {
- shada_pack_pfreed_entry(&packer, jumps[i], 0);
+ if (kSDWriteFailed == shada_pack_pfreed_entry(&packer, jumps[i], 0)) {
+ abort();
+ }
}
}
@@ -4178,7 +4184,9 @@ void shada_encode_buflist(msgpack_sbuffer *const sbuf)
ShadaEntry buflist_entry = shada_get_buflist(&removable_bufs);
msgpack_packer packer;
msgpack_packer_init(&packer, sbuf, msgpack_sbuffer_write);
- shada_pack_entry(&packer, buflist_entry, 0);
+ if (kSDWriteFailed == shada_pack_entry(&packer, buflist_entry, 0)) {
+ abort();
+ }
xfree(buflist_entry.data.buffer_list.buffers);
}
@@ -4204,7 +4212,7 @@ void shada_encode_gvars(msgpack_sbuffer *const sbuf)
if (vartv.v_type != VAR_FUNC && vartv.v_type != VAR_PARTIAL) {
typval_T tgttv;
tv_copy(&vartv, &tgttv);
- shada_pack_entry(&packer, (ShadaEntry) {
+ ShaDaWriteResult r = shada_pack_entry(&packer, (ShadaEntry) {
.type = kSDItemVariable,
.timestamp = cur_timestamp,
.data = {
@@ -4215,6 +4223,9 @@ void shada_encode_gvars(msgpack_sbuffer *const sbuf)
}
}
}, 0);
+ if (kSDWriteFailed == r) {
+ abort();
+ }
tv_clear(&tgttv);
}
tv_clear(&vartv);
@@ -4252,8 +4263,9 @@ static int sd_sbuf_reader_skip_read(ShaDaReadDef *const sd_reader,
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
msgpack_sbuffer *sbuf = (msgpack_sbuffer *)sd_reader->cookie;
- const uintmax_t bytes_skipped = MIN(offset, sbuf->size - sd_reader->fpos);
- if (bytes_skipped < offset) {
+ assert(sbuf->size >= sd_reader->fpos);
+ const uintmax_t skip_bytes = MIN(offset, sbuf->size - sd_reader->fpos);
+ if (skip_bytes < offset) {
sd_reader->eof = true;
return FAIL;
}