From ca3a1dbbcad4b179edc723bf4a56b864f64e7ea8 Mon Sep 17 00:00:00 2001 From: Vedansh Bhartia Date: Thu, 6 Jul 2023 11:27:43 +0530 Subject: [PATCH] rgw: add coverity annotations and asserts for null dereferences Signed-off-by: Vedansh Bhartia --- src/rgw/driver/rados/rgw_d3n_datacache.h | 2 ++ src/rgw/driver/rados/rgw_rados.cc | 4 ++++ src/rgw/driver/rados/rgw_sync.cc | 5 +++-- src/rgw/rgw_file.cc | 2 ++ src/rgw/rgw_kmip_client_impl.cc | 6 +----- src/rgw/rgw_op.cc | 11 ++++++++++- 6 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/rgw/driver/rados/rgw_d3n_datacache.h b/src/rgw/driver/rados/rgw_d3n_datacache.h index 668e224e85b94..196f892329f8c 100644 --- a/src/rgw/driver/rados/rgw_d3n_datacache.h +++ b/src/rgw/driver/rados/rgw_d3n_datacache.h @@ -177,6 +177,8 @@ int D3nRGWDataCache::get_obj_iterate_cb(const DoutPrefixProvider *dpp, const if (r < 0) return r; + // astate can be modified by append_atomic_test + // coverity[check_after_deref:SUPPRESS] if (astate && obj_ofs < astate->data.length()) { unsigned chunk_len = std::min((uint64_t)astate->data.length() - obj_ofs, (uint64_t)len); diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index 2a213cafc6e03..20eda066aa3e7 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -6491,6 +6491,8 @@ int RGWRados::Object::Read::read(int64_t ofs, int64_t end, if (r < 0) return r; + // astate can be modified by append_atomic_test + // coverity[check_after_deref:SUPPRESS] if (astate && astate->prefetch_data) { if (!ofs && astate->data.length() >= len) { bl = astate->data; @@ -6606,6 +6608,8 @@ int RGWRados::get_obj_iterate_cb(const DoutPrefixProvider *dpp, if (r < 0) return r; + // astate can be modified by append_atomic_test + // coverity[check_after_deref:SUPPRESS] if (astate && obj_ofs < astate->data.length()) { unsigned chunk_len = std::min((uint64_t)astate->data.length() - obj_ofs, (uint64_t)len); diff --git a/src/rgw/driver/rados/rgw_sync.cc b/src/rgw/driver/rados/rgw_sync.cc index 262e00ba9dc20..c7634d07bbd6c 100644 --- a/src/rgw/driver/rados/rgw_sync.cc +++ b/src/rgw/driver/rados/rgw_sync.cc @@ -81,13 +81,14 @@ int RGWBackoffControlCR::operate(const DoutPrefixProvider *dpp) { // retry the operation until it succeeds while (true) { yield { - std::lock_guard l{lock}; + std::lock_guard l{lock}; cr = alloc_cr(); cr->get(); call(cr); } { - std::lock_guard l{lock}; + std::lock_guard l{lock}; + // coverity[var_deref_model:SUPPRESS] cr->put(); cr = NULL; } diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index ee32170a11618..dbf85f491f559 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -383,6 +383,7 @@ namespace rgw { /* implies !rgw_fh, so also !LOCKED */ return -ENOENT; } + assert(rgw_fh); if (bs.num_entries > 1) { unref(bkt_fh); /* return stat_bucket ref */ @@ -449,6 +450,7 @@ namespace rgw { /* ENOENT when raced with other s3 gateway */ if (! rc || rc == -ENOENT) { + // coverity[var_deref_op:SUPPRESS] rgw_fh->flags |= RGWFileHandle::FLAG_DELETED; fh_cache.remove(rgw_fh->fh.fh_hk.object, rgw_fh, RGWFileHandle::FHCache::FLAG_LOCK); diff --git a/src/rgw/rgw_kmip_client_impl.cc b/src/rgw/rgw_kmip_client_impl.cc index b7f4f38e620d9..e83a62e1507fd 100644 --- a/src/rgw/rgw_kmip_client_impl.cc +++ b/src/rgw/rgw_kmip_client_impl.cc @@ -243,11 +243,7 @@ RGWKmipHandleBuilder::build() const failed = 0; Done: - if (!failed) - ; - else if (!r) - ; - else { + if(failed && r) { kmip_free_handle_stuff(r); delete r; r = 0; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 77adef88c748d..b9f7d2d4cc6bb 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -4292,7 +4292,10 @@ void RGWPutObj::execute(optional_yield y) if (compressor && compressor->is_compressed()) { bufferlist tmp; - RGWCompressionInfo cs_info; + RGWCompressionInfo cs_info; + assert(plugin != nullptr); + // plugin exists when the compressor does + // coverity[dereference:SUPPRESS] cs_info.compression_type = plugin->get_type_name(); cs_info.orig_size = s->obj_size; cs_info.compressor_message = compressor->get_compressor_message(); @@ -4632,6 +4635,9 @@ void RGWPostObj::execute(optional_yield y) if (compressor && compressor->is_compressed()) { ceph::bufferlist tmp; RGWCompressionInfo cs_info; + assert(plugin != nullptr); + // plugin exists when the compressor does + // coverity[dereference:SUPPRESS] cs_info.compression_type = plugin->get_type_name(); cs_info.orig_size = s->obj_size; cs_info.compressor_message = compressor->get_compressor_message(); @@ -7757,6 +7763,9 @@ int RGWBulkUploadOp::handle_file(const std::string_view path, if (compressor && compressor->is_compressed()) { ceph::bufferlist tmp; RGWCompressionInfo cs_info; + assert(plugin != nullptr); + // plugin exists when the compressor does + // coverity[dereference:SUPPRESS] cs_info.compression_type = plugin->get_type_name(); cs_info.orig_size = size; cs_info.compressor_message = compressor->get_compressor_message(); -- 2.39.5