]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
libceph: guard missing CRUSH type name lookup
authorZhao Zhang <zzhan461@ucr.edu>
Fri, 19 Jun 2026 07:40:03 +0000 (15:40 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Thu, 23 Jul 2026 18:29:41 +0000 (20:29 +0200)
Localized read selection can walk a parent bucket whose name exists in
the CRUSH map while its type has no matching entry in type_names.
get_immediate_parent() then dereferences a NULL type_cn and passes an
invalid pointer into strcmp(), causing a null-ptr-deref.

Skip such malformed parent buckets unless both the bucket name and type
name metadata are present. This keeps malformed hierarchy data from
crashing locality lookup and safely falls back to "not local".

[ idryomov: add WARN_ON_ONCE ]

Cc: stable@vger.kernel.org
Fixes: 117d96a04f00 ("libceph: support for balanced and localized reads")
Reported-by: Yuan Tan <yuantan098@gmail.com>
Reported-by: Zhengchuan Liang <zcliangcn@gmail.com>
Reported-by: Xin Liu <bird@lzu.edu.cn>
Assisted-by: Codex:GPT-5.4
Signed-off-by: Zhao Zhang <zzhan461@ucr.edu>
Signed-off-by: Ren Wei <n05ec@lzu.edu.cn>
Reviewed-by: Viacheslav Dubeyko <slava@dubeyko.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
net/ceph/osdmap.c

index 3c87f4b24e51787d71cd65bbbc36c1e14714a019..04036c047b8ca159d1c48e9795b182bef25d3bcf 100644 (file)
@@ -3060,8 +3060,11 @@ static int get_immediate_parent(struct crush_map *c, int id,
                        if (b->items[j] != id)
                                continue;
 
-                       *parent_type_id = b->type;
                        type_cn = lookup_crush_name(&c->type_names, b->type);
+                       if (WARN_ON_ONCE(!type_cn))
+                               continue;
+
+                       *parent_type_id = b->type;
                        parent_loc->cl_type_name = type_cn->cn_name;
                        parent_loc->cl_name = cn->cn_name;
                        return b->id;