diff --git a/src/nvim/errors.h b/src/nvim/errors.h index 2ac837faae..e0fc9ec0ca 100644 --- a/src/nvim/errors.h +++ b/src/nvim/errors.h @@ -198,6 +198,7 @@ EXTERN const char e_failed_to_find_all_diff_anchors[] INIT( = N_("E1550: Failed EXTERN const char e_diff_anchors_with_hidden_windows[] INIT( = N_("E1562: Diff anchors cannot be used with hidden diff windows")); EXTERN const char e_trustfile[] INIT(= N_("E5570: Cannot update trust file: %s")); +EXTERN const char e_cannot_read_from_str_2[] INIT(= N_("E282: Cannot read from \"%s\"")); EXTERN const char e_unknown_option2[] INIT(= N_("E355: Unknown option: %s")); diff --git a/src/nvim/main.c b/src/nvim/main.c index 380e81dd69..a3da291bae 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -2143,7 +2143,7 @@ static void source_startup_scripts(const mparm_T *const parmp) // Do nothing. } else { if (do_source(parmp->use_vimrc, false, DOSO_NONE, NULL) != OK) { - semsg(_("E282: Cannot read from \"%s\""), parmp->use_vimrc); + semsg(_(e_cannot_read_from_str_2), parmp->use_vimrc); } } } else if (!silent_mode) { diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c index 46d2dc99c5..84882dbfc1 100644 --- a/src/nvim/os/shell.c +++ b/src/nvim/os/shell.c @@ -789,15 +789,20 @@ char *get_cmd_output(char *cmd, char *infile, int flags, size_t *ret_len) // read the names from the file into memory FILE *fd = os_fopen(tempname, READBIN); - if (fd == NULL) { - semsg(_(e_notopen), tempname); + // Not being able to seek means we can't read the file. + long len_l; + if (fd == NULL + || fseek(fd, 0L, SEEK_END) == -1 + || (len_l = ftell(fd)) == -1 // get size of temp file + || fseek(fd, 0L, SEEK_SET) == -1) { // back to the start + semsg(_(e_cannot_read_from_str_2), tempname); + if (fd != NULL) { + fclose(fd); + } goto done; } - fseek(fd, 0, SEEK_END); - size_t len = (size_t)ftell(fd); // get size of temp file - fseek(fd, 0, SEEK_SET); - + size_t len = (size_t)len_l; buffer = xmalloc(len + 1); size_t i = fread(buffer, 1, len, fd); fclose(fd);