From 298fc566417ec4f4a7f4710a44c2499bd3578947 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 20 Feb 2026 16:11:50 +0900 Subject: [PATCH 1/3] import: fix NULL pointer dereference Follow-up for a9f6ba04969d6eb2e629e30299fab7538ef42a57. Fixes CID#1645106. --- src/import/pull-oci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/import/pull-oci.c b/src/import/pull-oci.c index 39b9c6e768..6ab58eb1ac 100644 --- a/src/import/pull-oci.c +++ b/src/import/pull-oci.c @@ -101,7 +101,10 @@ static OciLayerState* oci_layer_state_free(OciLayerState *st) { pidref_done_sigkill_wait(&st->tar_pid); if (st->temp_path) { - import_remove_tree(st->temp_path, st->pull ? &st->pull->userns_fd : NULL, st->pull->flags); + import_remove_tree( + st->temp_path, + st->pull ? &st->pull->userns_fd : NULL, + st->pull ? st->pull->flags : 0); free(st->temp_path); } free(st->final_path); From b78db85bca664b6ae5c0babb6ee12a938f6e6211 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 20 Feb 2026 16:18:07 +0900 Subject: [PATCH 2/3] mstack: fix resource leak on failure path This makes the mstack_load() requires 'ret', as clearing the loaded mstack without use is meaningless. All callers already pass non-NULL for the argument. Follow-up for 8343032a86b62f62780de85a696ab8f9d2632244. Fixes CID#1645105. --- src/shared/mstack.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/shared/mstack.c b/src/shared/mstack.c index f0ebd57635..d1eddda28b 100644 --- a/src/shared/mstack.c +++ b/src/shared/mstack.c @@ -1120,19 +1120,18 @@ int mstack_apply( return mstack_bind_mounts(&mstack, where, /* where_fd= */ -EBADF, flags, ret_root_fd); } -int mstack_load(const char *dir, - int dir_fd, - MStack **ret) { - +int mstack_load(const char *dir, int dir_fd, MStack **ret) { int r; + assert(ret); + /* Well-known errors: * * -ENOTUNIQ → Multiple conflicting layers for the same path defined * -EBADMSG → Bad file suffix, inode type for layer, or unrecognized entry */ - MStack *mstack = new(MStack, 1); + _cleanup_(mstack_freep) MStack *mstack = new(MStack, 1); if (!mstack) return -ENOMEM; @@ -1142,9 +1141,7 @@ int mstack_load(const char *dir, if (r < 0) return r; - if (ret) - *ret = TAKE_PTR(mstack); - + *ret = TAKE_PTR(mstack); return 0; } From ecf9f81af4de890010769cd425633dc32da2f06b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 20 Feb 2026 16:22:00 +0900 Subject: [PATCH 3/3] mstack: coding style cleanups --- src/shared/mstack.c | 4 ++-- src/shared/mstack.h | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/shared/mstack.c b/src/shared/mstack.c index d1eddda28b..e5dcd91e52 100644 --- a/src/shared/mstack.c +++ b/src/shared/mstack.c @@ -56,7 +56,7 @@ static void mstack_done(MStack *mstack) { safe_close(mstack->usr_mount_fd); } -MStack *mstack_free(MStack *mstack) { +MStack* mstack_free(MStack *mstack) { if (!mstack) return NULL; @@ -501,7 +501,7 @@ static bool mount_is_ro(MStackMount *m, MStackFlags flags) { IN_SET(m->mount_type, MSTACK_LAYER, MSTACK_ROBIND); } -static const char *mount_name(MStackMount *m) { +static const char* mount_name(MStackMount *m) { assert(m); /* Returns some vaguely useful identifier for this layer, for showing in debug output */ diff --git a/src/shared/mstack.h b/src/shared/mstack.h index b71ff86940..3a05221e5e 100644 --- a/src/shared/mstack.h +++ b/src/shared/mstack.h @@ -47,7 +47,7 @@ typedef struct MStack { .usr_mount_fd = -EBADF, \ } -MStack *mstack_free(MStack *mstack); +MStack* mstack_free(MStack *mstack); DEFINE_TRIVIAL_CLEANUP_FUNC(MStack*, mstack_free); int mstack_load(const char *dir, int dir_fd, MStack **ret); @@ -56,7 +56,17 @@ int mstack_make_mounts(MStack *mstack, const char *temp_mount_dir, MStackFlags f int mstack_bind_mounts(MStack *mstack, const char *where, int where_fd, MStackFlags flags, int *ret_root_fd); /* The four calls above in one */ -int mstack_apply(const char *dir, int dir_fd, const char *where, const char *temp_mount_dir, sd_varlink *mountfsd_link, int userns_fd, const ImagePolicy *image_policy, const ImageFilter *image_filter, MStackFlags flags, int *ret_root_fd); +int mstack_apply( + const char *dir, + int dir_fd, + const char *where, + const char *temp_mount_dir, + sd_varlink *mountfsd_link, + int userns_fd, + const ImagePolicy *image_policy, + const ImageFilter *image_filter, + MStackFlags flags, + int *ret_root_fd); int mstack_is_read_only(MStack *mstack); int mstack_is_foreign_uid_owned(MStack *mstack);