From 505b9101254e9a7941f69bd1ec9b85a5edac9505 Mon Sep 17 00:00:00 2001 From: chunmei-liu Date: Tue, 12 Apr 2022 00:15:50 -0700 Subject: [PATCH] crimson/osd: check long attr name Signed-off-by: chunmei-liu --- src/crimson/common/errorator.h | 1 + src/crimson/osd/ops_executer.h | 1 + src/crimson/osd/pg_backend.cc | 6 +++--- src/crimson/osd/pg_backend.h | 9 ++++++++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index f695bd82a6148..14c2e941e2400 100644 --- a/src/crimson/common/errorator.h +++ b/src/crimson/common/errorator.h @@ -1144,6 +1144,7 @@ namespace ct_error { using address_not_available = ct_error_code; using ecanceled = ct_error_code; using einprogress = ct_error_code; + using enametoolong = ct_error_code; struct pass_further_all { template diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index 659c682da3a65..9459cb4c62b07 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -43,6 +43,7 @@ class OpsExecuter : public seastar::enable_lw_shared_from_this { crimson::ct_error::invarg, crimson::ct_error::erange, crimson::ct_error::ecanceled, + crimson::ct_error::enametoolong, crimson::ct_error::permission_denied, crimson::ct_error::operation_not_supported, crimson::ct_error::input_output_error, diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index c6a74d2ec0124..4c507f7ae0000 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -821,7 +821,7 @@ PGBackend::list_objects(const hobject_t& start, uint64_t limit) const }); } -PGBackend::interruptible_future<> PGBackend::setxattr( +PGBackend::setxattr_ierrorator::future<> PGBackend::setxattr( ObjectState& os, const OSDOp& osd_op, ceph::os::Transaction& txn, @@ -829,13 +829,13 @@ PGBackend::interruptible_future<> PGBackend::setxattr( { if (local_conf()->osd_max_attr_size > 0 && osd_op.op.xattr.value_len > local_conf()->osd_max_attr_size) { - throw crimson::osd::make_error(-EFBIG); + return crimson::ct_error::file_too_large::make(); } const auto max_name_len = std::min( store->get_max_attr_name_length(), local_conf()->osd_max_attr_name_len); if (osd_op.op.xattr.name_len > max_name_len) { - throw crimson::osd::make_error(-ENAMETOOLONG); + return crimson::ct_error::enametoolong::make(); } maybe_create_new_object(os, txn, delta_stats); diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 60728d3af6da6..005fe9602750b 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -194,7 +194,14 @@ public: interruptible_future, hobject_t>> list_objects( const hobject_t& start, uint64_t limit) const; - interruptible_future<> setxattr( + using setxattr_errorator = crimson::errorator< + crimson::ct_error::file_too_large, + crimson::ct_error::enametoolong>; + using setxattr_ierrorator = + ::crimson::interruptible::interruptible_errorator< + ::crimson::osd::IOInterruptCondition, + setxattr_errorator>; + setxattr_ierrorator::future<> setxattr( ObjectState& os, const OSDOp& osd_op, ceph::os::Transaction& trans, -- 2.39.5