diff options
author | lhchavez <lhchavez@lhchavez.com> | 2020-12-21 06:48:48 -0800 |
---|---|---|
committer | lhchavez <lhchavez@lhchavez.com> | 2020-12-21 07:02:54 -0800 |
commit | 212ae9a70eddf3a77783d5cdffd3418273bfedd7 (patch) | |
tree | 49deb8f4d96eb4b9a81b4f2afb36f5e98abbdf50 | |
parent | f4b473fa842a84147d8036a27bac5c026c44dad4 (diff) | |
download | libgit2-212ae9a70eddf3a77783d5cdffd3418273bfedd7.tar.gz |
Fix the `-DENABLE_WERROR=ON` build for gcc 10.2
This change makes it possible to build with newer versions of gcc
without warnings. There were two warnings issued:
* gcc 8 added
[`-Wstringop-truncation`](https://developers.redhat.com/blog/2018/05/24/detecting-string-truncation-with-gcc-8/),
which warns if a call to `strncpy(3)` is prone to accidentally
truncating the destination string, since `strncpy(3)` does NOT add a
terminating `NULL` if the destination buffer is not large enough to
hold the input.
This change uses the pattern suggested in
https://us-cert.cisa.gov/bsi/articles/knowledge/coding-practices/strncpy-and-strncat
to fix the locations flagged by gcc.
* There was a potentially uninitialized access of `dest` in `fs_copy`.
-rw-r--r-- | tests/clar/fs.h | 2 | ||||
-rw-r--r-- | tests/clar/sandbox.h | 11 | ||||
-rw-r--r-- | tests/clar_libgit2.c | 7 |
3 files changed, 12 insertions, 8 deletions
diff --git a/tests/clar/fs.h b/tests/clar/fs.h index 31a536427..d88f249c7 100644 --- a/tests/clar/fs.h +++ b/tests/clar/fs.h @@ -396,7 +396,7 @@ static void fs_copy(const char *source, const char *_dest) { char *dbuf = NULL; - const char *dest; + const char *dest = NULL; struct stat source_st, dest_st; cl_must_pass_(lstat(source, &source_st), "Failed to stat copy source"); diff --git a/tests/clar/sandbox.h b/tests/clar/sandbox.h index 2114819e4..0ba147962 100644 --- a/tests/clar/sandbox.h +++ b/tests/clar/sandbox.h @@ -2,7 +2,7 @@ #include <sys/syslimits.h> #endif -static char _clar_path[4096]; +static char _clar_path[4096 + 1]; static int is_valid_tmp_path(const char *path) @@ -39,7 +39,8 @@ find_tmp_path(char *buffer, size_t length) if (length >= PATH_MAX && realpath(env, buffer) != NULL) return 0; #endif - strncpy(buffer, env, length); + strncpy(buffer, env, length - 1); + buffer[length - 1] = '\0'; return 0; } } @@ -50,7 +51,8 @@ find_tmp_path(char *buffer, size_t length) if (length >= PATH_MAX && realpath("/tmp", buffer) != NULL) return 0; #endif - strncpy(buffer, "/tmp", length); + strncpy(buffer, "/tmp", length - 1); + buffer[length - 1] = '\0'; return 0; } @@ -65,7 +67,8 @@ find_tmp_path(char *buffer, size_t length) /* This system doesn't like us, try to use the current directory */ if (is_valid_tmp_path(".")) { - strncpy(buffer, ".", length); + strncpy(buffer, ".", length - 1); + buffer[length - 1] = '\0'; return 0; } diff --git a/tests/clar_libgit2.c b/tests/clar_libgit2.c index 65b8923f5..c4550c32a 100644 --- a/tests/clar_libgit2.c +++ b/tests/clar_libgit2.c @@ -275,7 +275,7 @@ const char* cl_git_fixture_url(const char *fixturename) const char* cl_git_path_url(const char *path) { - static char url[4096]; + static char url[4096 + 1]; const char *in_buf; git_buf path_buf = GIT_BUF_INIT; @@ -311,9 +311,10 @@ const char* cl_git_path_url(const char *path) in_buf++; } - cl_assert(url_buf.size < 4096); + cl_assert(url_buf.size < sizeof(url) - 1); - strncpy(url, git_buf_cstr(&url_buf), 4096); + strncpy(url, git_buf_cstr(&url_buf), sizeof(url) - 1); + url[sizeof(url) - 1] = '\0'; git_buf_dispose(&url_buf); git_buf_dispose(&path_buf); return url; |