From f3c67ff2df6413bec2c7c99ed009a968e62195bf Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 12 Jul 2024 10:55:20 +0000 Subject: [PATCH] verify error code for empty bucket name --- deps/oblib/src/lib/restore/cos/ob_cos_wrapper_handle.cpp | 6 +++++- deps/oblib/src/lib/restore/ob_i_storage.cpp | 2 +- deps/oblib/src/lib/restore/ob_i_storage.h | 1 + deps/oblib/src/lib/restore/ob_storage_oss_base.cpp | 5 ++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/deps/oblib/src/lib/restore/cos/ob_cos_wrapper_handle.cpp b/deps/oblib/src/lib/restore/cos/ob_cos_wrapper_handle.cpp index ca974d672c..860b660555 100644 --- a/deps/oblib/src/lib/restore/cos/ob_cos_wrapper_handle.cpp +++ b/deps/oblib/src/lib/restore/cos/ob_cos_wrapper_handle.cpp @@ -192,7 +192,11 @@ int ObCosWrapperHandle::build_bucket_and_object_name(const ObString &uri) if ('/' == *(uri.ptr() + bucket_end)) { ObString::obstr_size_t bucket_length = bucket_end - bucket_start; //must end with '\0' - if (OB_FAIL(databuff_printf(bucket_name_buff, OB_MAX_URI_LENGTH, "%.*s", bucket_length, uri.ptr() + bucket_start))) { + if (OB_UNLIKELY(bucket_length <= 0)) { + ret = OB_INVALID_ARGUMENT; + OB_LOG(WARN,"bucket is empty", K(ret), K(bucket_end), K(bucket_start), K(uri)); + } else if (OB_FAIL(databuff_printf(bucket_name_buff, OB_MAX_URI_LENGTH, "%.*s", + bucket_length, uri.ptr() + bucket_start))) { OB_LOG(WARN, "fail to deep copy bucket", K(uri), K(bucket_start), K(bucket_length), K(ret)); } else { bucket_name_.assign_ptr(bucket_name_buff, strlen(bucket_name_buff) + 1);// must include '\0' diff --git a/deps/oblib/src/lib/restore/ob_i_storage.cpp b/deps/oblib/src/lib/restore/ob_i_storage.cpp index e54e7d4314..4b4ba2547f 100644 --- a/deps/oblib/src/lib/restore/ob_i_storage.cpp +++ b/deps/oblib/src/lib/restore/ob_i_storage.cpp @@ -103,7 +103,7 @@ int handle_listed_directory(ObBaseDirEntryOperator &op, return ret; } -static int get_storage_prefix_from_path(const common::ObString &uri, const char *&prefix) +int get_storage_prefix_from_path(const common::ObString &uri, const char *&prefix) { int ret = OB_SUCCESS; if (uri.prefix_match(OB_OSS_PREFIX)) { diff --git a/deps/oblib/src/lib/restore/ob_i_storage.h b/deps/oblib/src/lib/restore/ob_i_storage.h index 5d6d14401c..2e97d3fbad 100644 --- a/deps/oblib/src/lib/restore/ob_i_storage.h +++ b/deps/oblib/src/lib/restore/ob_i_storage.h @@ -53,6 +53,7 @@ int handle_listed_object(ObBaseDirEntryOperator &op, const char *obj_name, const int64_t obj_name_len, const int64_t obj_size); int handle_listed_directory(ObBaseDirEntryOperator &op, const char *dir_name, const int64_t dir_name_len); +int get_storage_prefix_from_path(const common::ObString &uri, const char *&prefix); int build_bucket_and_object_name(ObIAllocator &allocator, const ObString &uri, ObString &bucket, ObString &object); int construct_fragment_full_name(const ObString &logical_appendable_object_name, diff --git a/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp b/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp index 1faf708e27..fdcc346349 100644 --- a/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp +++ b/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp @@ -144,7 +144,10 @@ int get_bucket_object_name(const ObString &uri, ObString &bucket, ObString &obje for (bucket_end = bucket_start; OB_SUCC(ret) && bucket_end < uri.length(); ++bucket_end) { if ('/' == *(uri.ptr() + bucket_end)) { ObString::obstr_size_t bucket_length = bucket_end - bucket_start; - if (OB_ISNULL(buf = reinterpret_cast(allocator.alloc(OB_MAX_URI_LENGTH)))) { + if (OB_UNLIKELY(bucket_length <= 0)) { + ret = OB_INVALID_ARGUMENT; + OB_LOG(WARN,"bucket is empty", K(ret), K(bucket_end), K(bucket_start), K(uri)); + } else if (OB_ISNULL(buf = reinterpret_cast(allocator.alloc(OB_MAX_URI_LENGTH)))) { ret = OB_ALLOCATE_MEMORY_FAILED; OB_LOG(WARN,"allocate memory error", K(OB_MAX_URI_LENGTH), K(ret)); } else {