From 2a1a773777f3153c67a04425f78378ea7631a8a7 Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Mon, 30 Apr 2018 12:26:12 +0200 Subject: [PATCH] Fixes and workarounds for some Coverity scan reports. --- lib/libdevmapper.c | 12 +++++++++--- lib/luks2/luks2_disk_metadata.c | 14 ++++++++------ lib/verity/verity_fec.c | 1 + src/cryptsetup.c | 1 + src/cryptsetup_reencrypt.c | 2 ++ src/integritysetup.c | 2 +- src/veritysetup.c | 2 +- 7 files changed, 23 insertions(+), 11 deletions(-) diff --git a/lib/libdevmapper.c b/lib/libdevmapper.c index b568e2af..3788b086 100644 --- a/lib/libdevmapper.c +++ b/lib/libdevmapper.c @@ -1517,11 +1517,16 @@ static int _dm_query_crypt(uint32_t get_flags, if (get_flags & DM_ACTIVE_CRYPT_KEY) { if (key_[0] == ':') { - key_desc = strpbrk(strpbrk(key_ + 1, ":") + 1, ":") + 1; + /* ::: */ + key_desc = NULL; + endp = strpbrk(key_ + 1, ":"); + if (endp) + key_desc = strpbrk(endp + 1, ":"); if (!key_desc) { r = -ENOMEM; goto err; } + key_desc++; crypt_volume_key_set_description(vk, key_desc); } else { buffer[2] = '\0'; @@ -1723,9 +1728,10 @@ static int _dm_query_verity(uint32_t get_flags, goto err; } } - if (vp) + if (vp) { + free(fec_dev_str); fec_dev_str = str2; - else + } else free(str2); i++; } else if (!strcasecmp(arg, "fec_start")) { diff --git a/lib/luks2/luks2_disk_metadata.c b/lib/luks2/luks2_disk_metadata.c index 89df5295..4d9bce21 100644 --- a/lib/luks2/luks2_disk_metadata.c +++ b/lib/luks2/luks2_disk_metadata.c @@ -74,9 +74,10 @@ static int hdr_checksum_calculate(const char *alg, struct luks2_hdr_disk *hdr_di const char *json_area, size_t json_len) { struct crypt_hash *hd = NULL; - int r; + int hash_size, r; - if (crypt_hash_size(alg) <= 0 || crypt_hash_init(&hd, alg)) + hash_size = crypt_hash_size(alg); + if (hash_size <= 0 || crypt_hash_init(&hd, alg)) return -EINVAL; /* Binary header, csum zeroed. */ @@ -87,7 +88,7 @@ static int hdr_checksum_calculate(const char *alg, struct luks2_hdr_disk *hdr_di r = crypt_hash_write(hd, json_area, json_len); if (!r) - r = crypt_hash_final(hd, (char*)hdr_disk->csum, crypt_hash_size(alg)); + r = crypt_hash_final(hd, (char*)hdr_disk->csum, (size_t)hash_size); crypt_hash_destroy(hd); return r; @@ -100,9 +101,10 @@ static int hdr_checksum_check(const char *alg, struct luks2_hdr_disk *hdr_disk, const char *json_area, size_t json_len) { struct luks2_hdr_disk hdr_tmp; - int r; + int hash_size, r; - if (crypt_hash_size(alg) <= 0) + hash_size = crypt_hash_size(alg); + if (hash_size <= 0) return -EINVAL; /* Copy header and zero checksum. */ @@ -116,7 +118,7 @@ static int hdr_checksum_check(const char *alg, struct luks2_hdr_disk *hdr_disk, log_dbg_checksum(hdr_disk->csum, alg, "on-disk"); log_dbg_checksum(hdr_tmp.csum, alg, "in-memory"); - if (memcmp(hdr_tmp.csum, hdr_disk->csum, crypt_hash_size(alg))) + if (memcmp(hdr_tmp.csum, hdr_disk->csum, (size_t)hash_size)) return -EINVAL; return 0; diff --git a/lib/verity/verity_fec.c b/lib/verity/verity_fec.c index 38f6e362..b7161e9d 100644 --- a/lib/verity/verity_fec.c +++ b/lib/verity/verity_fec.c @@ -172,6 +172,7 @@ static int FEC_process_inputs(struct crypt_device *cd, goto out; } + /* coverity[tainted_data] */ r = decode_rs_char(rs, rs_block); if (r < 0) { log_err(cd, _("Failed to repair parity for block %" PRIu64 "."), n); diff --git a/src/cryptsetup.c b/src/cryptsetup.c index e28bdcf0..2341a16e 100644 --- a/src/cryptsetup.c +++ b/src/cryptsetup.c @@ -966,6 +966,7 @@ static int action_luksFormat(void) return -EPERM; log_dbg("Creating header file."); + /* coverity[toctou] */ fd = open(opt_header_device, O_CREAT|O_EXCL|O_WRONLY, S_IRUSR|S_IWUSR); if (fd == -1 || posix_fallocate(fd, 0, 4096)) log_err(_("Cannot create header file %s."), opt_header_device); diff --git a/src/cryptsetup_reencrypt.c b/src/cryptsetup_reencrypt.c index 44f26ac8..79541aff 100644 --- a/src/cryptsetup_reencrypt.c +++ b/src/cryptsetup_reencrypt.c @@ -717,6 +717,7 @@ static int backup_luks_headers(struct reenc_ctx *rc) goto out; if ((r = stat(rc->header_file_tmp, &st))) goto out; + /* coverity[toctou] */ if ((r = chmod(rc->header_file_tmp, st.st_mode | S_IWUSR))) goto out; } @@ -898,6 +899,7 @@ static int restore_luks_header(struct reenc_ctx *rc) goto out; } else if ((st.st_mode & S_IFMT) == S_IFREG && stat(rc->header_file_new, &st) != -1) { + /* coverity[toctou] */ fd = open(rc->device_header, O_WRONLY); if (fd != -1) { if (posix_fallocate(fd, 0, st.st_size)) {}; diff --git a/src/integritysetup.c b/src/integritysetup.c index c271a25b..121326c3 100644 --- a/src/integritysetup.c +++ b/src/integritysetup.c @@ -556,7 +556,7 @@ int main(int argc, const char **argv) action_argc++; /* Handle aliases */ - if (!strcmp(aname, "create")) { + if (!strcmp(aname, "create") && action_argc > 1) { /* create command had historically switched arguments */ if (action_argv[0] && action_argv[1]) { const char *tmp = action_argv[0]; diff --git a/src/veritysetup.c b/src/veritysetup.c index b4e49c5e..e65ccd69 100644 --- a/src/veritysetup.c +++ b/src/veritysetup.c @@ -515,7 +515,7 @@ int main(int argc, const char **argv) action_argc++; /* Handle aliases */ - if (!strcmp(aname, "create")) { + if (!strcmp(aname, "create") && action_argc > 1) { /* create command had historically switched arguments */ if (action_argv[0] && action_argv[1]) { const char *tmp = action_argv[0];