]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ec: validate memallocs in ErasureCodeIsaDefault::prepare() 68131/head
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 31 Mar 2026 13:04:33 +0000 (13:04 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 7 Apr 2026 09:43:58 +0000 (09:43 +0000)
When testing FastEC in crimson, segfault have been seen during
initialization of the EC plugin based on ISA-L:

```
Got SIGSEGV on shard 0
Backtrace:
  0# 0x00007F8A34E3FC30 in /lib64/libc.so.6
 1# ErasureCodeIsaDefault::prepare() in /usr/lib64/ceph/erasure-code/libec_isa.so
 2# ErasureCodeIsa::init(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<s
td::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11:
:basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&, std::ostream*) in /usr/lib64/ceph/erasure-code/libec_isa.so
 3# ErasureCodePluginIsa::factory(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char
> \>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std
::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&, std::shared_ptr<ceph::ErasureCodeIn
terface>*, std::ostream*) in /usr/lib64/ceph/erasure-code/libec_isa.so
```

This commit asserts on the invariant that cache tables, after
initialization, must be available.

Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/erasure-code/isa/ErasureCodeIsa.cc

index 0fbd5c99c312d8417858702652b90c3143f14cd6..e31199a35d9dc9373d6f515e80cebc9bdc262943 100644 (file)
@@ -640,9 +640,11 @@ ErasureCodeIsaDefault::prepare()
   // setup shared encoding table and coefficients
   unsigned char** p_enc_table =
     tcache.getEncodingTable(matrixtype, k, m);
+  ceph_assert(p_enc_table);
 
   unsigned char** p_enc_coeff =
     tcache.getEncodingCoefficient(matrixtype, k, m);
+  ceph_assert(p_enc_coeff);
 
   if (!*p_enc_coeff) {
     dout(10) << "[ cache tables ] creating coeff for k=" <<
@@ -665,6 +667,7 @@ ErasureCodeIsaDefault::prepare()
   } else {
     encode_coeff = *p_enc_coeff;
   }
+  ceph_assert(encode_coeff);
 
   if (!*p_enc_table) {
     dout(10) << "[ cache tables ] creating tables for k=" <<
@@ -680,6 +683,7 @@ ErasureCodeIsaDefault::prepare()
   } else {
     encode_tbls = *p_enc_table;
   }
+  ceph_assert(encode_tbls);
 
   unsigned memory_lru_cache =
     k * (m + k) * 32 * tcache.decoding_tables_lru_length;