aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/os_unix.c
diff options
context:
space:
mode:
authorEliseo Martínez <eliseomarmol@gmail.com>2015-01-27 17:02:57 +0100
committerJustin M. Keyes <justinkz@gmail.com>2015-02-02 01:21:58 -0500
commit4d0ef9a6b92953eb06937c3f74001909bd071c86 (patch)
tree4a80a9d2984f2b97fdc60442dbca7b39e2dd05da /src/nvim/os_unix.c
parent323f0488c24044971adf5180fed9f41d91a87b13 (diff)
downloadrneovim-4d0ef9a6b92953eb06937c3f74001909bd071c86.tar.gz
rneovim-4d0ef9a6b92953eb06937c3f74001909bd071c86.tar.bz2
rneovim-4d0ef9a6b92953eb06937c3f74001909bd071c86.zip
coverity/13745: Argument cannot be negative: RI.
Problem : Argument cannot be negative @ 1165. Diagnostic : Real issue. Rationale : len can be assigned a negative value @ 1162; len is passed as an unsigned argument @ 1165. Resolution : Refactor variable's types: - Use ftello instead of ftell to avoid using long. - Assert ftello result is safely convertible to size_t. - Introduce variable read_size to avoid using i (int).
Diffstat (limited to 'src/nvim/os_unix.c')
-rw-r--r--src/nvim/os_unix.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/nvim/os_unix.c b/src/nvim/os_unix.c
index 15185aca49..d674db951f 100644
--- a/src/nvim/os_unix.c
+++ b/src/nvim/os_unix.c
@@ -1159,16 +1159,30 @@ int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file,
free(tempname);
goto notfound;
}
- fseek(fd, 0L, SEEK_END);
- len = ftell(fd); /* get size of temp file */
+ int fseek_res = fseek(fd, 0L, SEEK_END);
+ if (fseek_res < 0) {
+ free(tempname);
+ fclose(fd);
+ return FAIL;
+ }
+ long long templen = ftell(fd); /* get size of temp file */
+ if (templen < 0) {
+ free(tempname);
+ fclose(fd);
+ return FAIL;
+ }
+#if SIZEOF_LONG_LONG > SIZEOF_SIZE_T
+ assert(templen <= (long long)SIZE_MAX);
+#endif
+ len = (size_t)templen;
fseek(fd, 0L, SEEK_SET);
buffer = xmalloc(len + 1);
// fread() doesn't terminate buffer with NUL;
// appropiate termination (not always NUL) is done below.
- i = fread((char *)buffer, 1, len, fd);
+ size_t readlen = fread((char *)buffer, 1, len, fd);
fclose(fd);
os_remove((char *)tempname);
- if (i != (int)len) {
+ if (readlen != len) {
/* unexpected read error */
EMSG2(_(e_notread), tempname);
free(tempname);