diff options
author | Eliseo Martínez <eliseomarmol@gmail.com> | 2015-01-27 17:02:57 +0100 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2015-02-02 01:21:58 -0500 |
commit | 4d0ef9a6b92953eb06937c3f74001909bd071c86 (patch) | |
tree | 4a80a9d2984f2b97fdc60442dbca7b39e2dd05da /src/nvim/os_unix.c | |
parent | 323f0488c24044971adf5180fed9f41d91a87b13 (diff) | |
download | rneovim-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.c | 22 |
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); |