]> git.apps.os.sepia.ceph.com Git - ceph.git/commit
src: Fix memory leaks in generate_test_instance() by returning values instead of... 63910/head
authorKefu Chai <tchaikov@gmail.com>
Mon, 9 Jun 2025 12:35:44 +0000 (20:35 +0800)
committerKefu Chai <tchaikov@gmail.com>
Thu, 21 Aug 2025 07:19:18 +0000 (15:19 +0800)
commited6b71246137f9793f2d56b4d050b271a3da29fd
treee9e9bcf172d043cc0163b2e8354fe7c476407c1c
parent088180d2fd5a3ee13cec1e801ff477827f2b1538
src: Fix memory leaks in generate_test_instance() by returning values instead of pointers

Problem:

The current `generate_test_instance()` function returns `std::list<T*>`,
which creates memory management issues:

- Inconsistent lifecycle management of test instances
- Callers don't always properly clean up allocated memory
- Results in ASan memory leak reports in unit tests and ceph-dencoder

Solution:

Change `generate_test_instance()` to return `std::list<T>` instead of `std::list<T*>`:

Core Changes:

- Modified all classes with `generate_test_instance()` to return `std::list<T>`
- Use `emplace_back()` without parameters** to avoid copy/move
  constructors for classes that don't define them
- Updated ceph-dencoder to handle the new return type

ceph-dencoder Adaptations:

Since `m_list` now holds `T` objects instead of `T*`, and we can't
assume `T` is copyable/moveable:

- Keep `m_object` as a pointer for flexibility
- Handle two scenarios:
  1. `m_object` points to an element in `m_list`
  2. `m_object` points to a decoded instance (requires manual cleanup)
- Introduce `make_ptr()` as a factory function to create a smart pointer
  to conditionally free the managed pointer.

Additional Cleanup:

- Simplify DencoderBase constructor from template to plain
  function (extra parameters were never used in derived classes)

With this change, object lifecycles are now managed by value semantics
instead of raw pointers, eliminating memory leaks.

Signed-off-by: Kefu Chai <tchaikov@gmail.com>
273 files changed:
src/auth/Auth.h
src/auth/Crypto.cc
src/auth/Crypto.h
src/auth/cephx/CephxKeyServer.cc
src/auth/cephx/CephxKeyServer.h
src/auth/cephx/CephxProtocol.h
src/cls/2pc_queue/cls_2pc_queue_ops.h
src/cls/2pc_queue/cls_2pc_queue_types.h
src/cls/cas/cls_cas_internal.h
src/cls/cas/cls_cas_ops.h
src/cls/fifo/cls_fifo.cc
src/cls/fifo/cls_fifo_ops.h
src/cls/fifo/cls_fifo_types.h
src/cls/journal/cls_journal_types.cc
src/cls/journal/cls_journal_types.h
src/cls/lock/cls_lock_ops.cc
src/cls/lock/cls_lock_ops.h
src/cls/lock/cls_lock_types.cc
src/cls/lock/cls_lock_types.h
src/cls/log/cls_log_ops.h
src/cls/log/cls_log_types.h
src/cls/queue/cls_queue_ops.h
src/cls/queue/cls_queue_types.h
src/cls/rbd/cls_rbd.h
src/cls/rbd/cls_rbd_types.cc
src/cls/rbd/cls_rbd_types.h
src/cls/refcount/cls_refcount_ops.cc
src/cls/refcount/cls_refcount_ops.h
src/cls/rgw/cls_rgw_ops.cc
src/cls/rgw/cls_rgw_ops.h
src/cls/rgw/cls_rgw_types.cc
src/cls/rgw/cls_rgw_types.h
src/cls/rgw_gc/cls_rgw_gc_ops.h
src/cls/rgw_gc/cls_rgw_gc_types.h
src/cls/timeindex/cls_timeindex_ops.h
src/cls/timeindex/cls_timeindex_types.cc
src/cls/timeindex/cls_timeindex_types.h
src/cls/user/cls_user_ops.cc
src/cls/user/cls_user_ops.h
src/cls/user/cls_user_types.cc
src/cls/user/cls_user_types.h
src/cls/version/cls_version_ops.h
src/cls/version/cls_version_types.h
src/common/CompatSet.cc
src/common/DecayCounter.cc
src/common/DecayCounter.h
src/common/LogEntry.cc
src/common/LogEntry.h
src/common/SloppyCRCMap.cc
src/common/SloppyCRCMap.h
src/common/bit_vector.hpp
src/common/bloom_filter.cc
src/common/bloom_filter.hpp
src/common/ceph_json.h
src/common/entity_name.cc
src/common/entity_name.h
src/common/frag.cc
src/common/fs_types.cc
src/common/histogram.cc
src/common/histogram.h
src/common/hobject.cc
src/common/hobject.h
src/common/snap_types.cc
src/common/snap_types.h
src/crush/CrushWrapper.cc
src/crush/CrushWrapper.h
src/include/CompatSet.h
src/include/cephfs/metrics/Types.h
src/include/cephfs/types.h
src/include/filepath.cc
src/include/filepath.h
src/include/frag.h
src/include/fs_types.h
src/include/object.cc
src/include/object.h
src/include/types.cc
src/include/types.h
src/include/util.h
src/include/utime.cc
src/include/utime.h
src/include/uuid.cc
src/include/uuid.h
src/journal/Entry.cc
src/journal/Entry.h
src/librbd/WatchNotifyTypes.cc
src/librbd/WatchNotifyTypes.h
src/librbd/cache/pwl/Types.cc
src/librbd/cache/pwl/Types.h
src/librbd/cache/pwl/ssd/Types.h
src/librbd/journal/Types.cc
src/librbd/journal/Types.h
src/librbd/mirroring_watcher/Types.cc
src/librbd/mirroring_watcher/Types.h
src/librbd/trash_watcher/Types.cc
src/librbd/trash_watcher/Types.h
src/mds/Anchor.cc
src/mds/Anchor.h
src/mds/CInode.cc
src/mds/CInode.h
src/mds/Capability.cc
src/mds/Capability.h
src/mds/FSMap.cc
src/mds/FSMap.h
src/mds/FSMapUser.cc
src/mds/FSMapUser.h
src/mds/InoTable.cc
src/mds/InoTable.h
src/mds/JournalPointer.h
src/mds/MDSMap.cc
src/mds/MDSMap.h
src/mds/PurgeQueue.cc
src/mds/PurgeQueue.h
src/mds/SessionMap.cc
src/mds/SessionMap.h
src/mds/SimpleLock.cc
src/mds/SimpleLock.h
src/mds/SnapServer.cc
src/mds/SnapServer.h
src/mds/events/ECommitted.h
src/mds/events/EExport.h
src/mds/events/EFragment.h
src/mds/events/EImportFinish.h
src/mds/events/EImportStart.h
src/mds/events/ELid.h
src/mds/events/EMetaBlob.h
src/mds/events/EOpen.h
src/mds/events/EPeerUpdate.h
src/mds/events/EResetJournal.h
src/mds/events/ESegment.h
src/mds/events/ESession.h
src/mds/events/ESessions.h
src/mds/events/ESubtreeMap.h
src/mds/events/ETableClient.h
src/mds/events/ETableServer.h
src/mds/events/EUpdate.h
src/mds/flock.cc
src/mds/flock.h
src/mds/inode_backtrace.cc
src/mds/inode_backtrace.h
src/mds/journal.cc
src/mds/mdstypes.cc
src/mds/mdstypes.h
src/mds/snap.cc
src/mds/snap.h
src/messages/MClientReply.h
src/messages/MClientRequest.h
src/messages/MMDSBeacon.h
src/messages/MMDSCacheRejoin.h
src/messages/MMgrReport.h
src/mgr/DaemonHealthMetric.h
src/mgr/MDSPerfMetricTypes.h
src/mgr/MetricTypes.h
src/mgr/MgrCap.cc
src/mgr/MgrCap.h
src/mgr/OSDPerfMetricTypes.h
src/mgr/ServiceMap.cc
src/mgr/ServiceMap.h
src/mon/AuthMonitor.h
src/mon/ConnectionTracker.cc
src/mon/ConnectionTracker.h
src/mon/CreatingPGs.h
src/mon/MgrMap.h
src/mon/MonCap.cc
src/mon/MonCap.h
src/mon/MonCommand.h
src/mon/MonMap.cc
src/mon/MonMap.h
src/mon/MonitorDBStore.h
src/mon/PGMap.cc
src/mon/PGMap.h
src/mon/health_check.h
src/mon/mon_types.h
src/msg/msg_types.cc
src/msg/msg_types.h
src/os/SequencerPosition.h
src/os/Transaction.cc
src/os/Transaction.h
src/os/bluestore/bluefs_types.cc
src/os/bluestore/bluefs_types.h
src/os/bluestore/bluestore_types.cc
src/os/bluestore/bluestore_types.h
src/os/kstore/kstore_types.cc
src/os/kstore/kstore_types.h
src/osd/ECMsgTypes.cc
src/osd/ECMsgTypes.h
src/osd/ECTypes.h
src/osd/ECUtilL.cc
src/osd/ECUtilL.h
src/osd/HitSet.cc
src/osd/HitSet.h
src/osd/OSDMap.cc
src/osd/OSDMap.h
src/osd/SnapMapper.cc
src/osd/SnapMapper.h
src/osd/osd_types.cc
src/osd/osd_types.h
src/osdc/Journaler.h
src/rbd_replay/ActionTypes.cc
src/rbd_replay/ActionTypes.h
src/rgw/driver/rados/groups.cc
src/rgw/driver/rados/groups.h
src/rgw/driver/rados/rgw_bucket.cc
src/rgw/driver/rados/rgw_d3n_datacache.h
src/rgw/driver/rados/rgw_data_sync.cc
src/rgw/driver/rados/rgw_data_sync.h
src/rgw/driver/rados/rgw_datalog.cc
src/rgw/driver/rados/rgw_datalog.h
src/rgw/driver/rados/rgw_obj_manifest.cc
src/rgw/driver/rados/rgw_obj_manifest.h
src/rgw/driver/rados/rgw_rados.cc
src/rgw/driver/rados/rgw_rados.h
src/rgw/driver/rados/rgw_user.h
src/rgw/driver/rados/roles.cc
src/rgw/driver/rados/roles.h
src/rgw/driver/rados/users.cc
src/rgw/driver/rados/users.h
src/rgw/rgw_acl.cc
src/rgw/rgw_acl.h
src/rgw/rgw_acl_types.h
src/rgw/rgw_basic_types.cc
src/rgw/rgw_basic_types.h
src/rgw/rgw_bucket_encryption.h
src/rgw/rgw_bucket_types.h
src/rgw/rgw_cache.cc
src/rgw/rgw_cache.h
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_compression.cc
src/rgw/rgw_compression_types.h
src/rgw/rgw_cors.cc
src/rgw/rgw_cors.h
src/rgw/rgw_dencoder.cc
src/rgw/rgw_lc.cc
src/rgw/rgw_lc.h
src/rgw/rgw_log.cc
src/rgw/rgw_log.h
src/rgw/rgw_mdlog.h
src/rgw/rgw_meta_sync_status.h
src/rgw/rgw_metadata.cc
src/rgw/rgw_multi.cc
src/rgw/rgw_obj_types.h
src/rgw/rgw_object_lock.cc
src/rgw/rgw_object_lock.h
src/rgw/rgw_oidc_provider.cc
src/rgw/rgw_oidc_provider.h
src/rgw/rgw_period.cc
src/rgw/rgw_placement_types.h
src/rgw/rgw_pool_types.h
src/rgw/rgw_quota.cc
src/rgw/rgw_quota_types.h
src/rgw/rgw_realm.cc
src/rgw/rgw_sync_policy.cc
src/rgw/rgw_sync_policy.h
src/rgw/rgw_tag.cc
src/rgw/rgw_tag.h
src/rgw/rgw_user_types.h
src/rgw/rgw_zone.cc
src/rgw/rgw_zone.h
src/rgw/rgw_zone_types.h
src/test/osd/types.cc
src/test/rgw/test_rgw_common.h
src/test/rgw/test_rgw_manifest.cc
src/tools/ceph-dencoder/ceph_time.h
src/tools/ceph-dencoder/denc_registry.h
src/tools/ceph-dencoder/nvmeof_types.h
src/tools/ceph-dencoder/sstring.h
src/tools/ceph-dencoder/str.h
src/tools/rbd_mirror/image_map/Types.cc
src/tools/rbd_mirror/image_map/Types.h
src/tools/rbd_mirror/instance_watcher/Types.cc
src/tools/rbd_mirror/instance_watcher/Types.h
src/tools/rbd_mirror/leader_watcher/Types.cc
src/tools/rbd_mirror/leader_watcher/Types.h