In the Linux kernel, the following vulnerability has been resolved:
clk: clk-loongson2: Fix potential buffer overflow in flexible-array member access
Flexible-array member hws
in struct clk_hw_onecell_data
is annotated
with the counted_by()
attribute. This means that when memory is
allocated for this array, the counter, which in this case is member
num
in the flexible structure, should be set to the maximum number of
elements the flexible array can contain, or fewer.
In this case, the total number of elements for the flexible array is
determined by variable clks_num
when allocating heap space via
devm_kzalloc()
, as shown below:
289 struct loongson2_clk_provider *clp;
...
296 for (p = data; p->name; p++)
297 clks_num++;
298
299 clp = devm_kzalloc(dev, struct_size(clp, clk_data.hws, clks_num),
300 GFP_KERNEL);
So, clp->clk_data.num
should be set to clks_num
or less, and not
exceed clks_num
, as is currently the case. Otherwise, if data is
written into clp->clk_data.hws[clks_num]
, the instrumentation
provided by the compiler won't detect the overflow, leading to a
memory corruption bug at runtime.
Fix this issue by setting clp->clk_data.num
to clks_num
.
References
In the Linux kernel, the following vulnerability has been resolved:
clk: clk-loongson2: Fix potential buffer overflow in flexible-array member access
Flexible-array member
hws
instruct clk_hw_onecell_data
is annotatedwith the
counted_by()
attribute. This means that when memory isallocated for this array, the counter, which in this case is member
num
in the flexible structure, should be set to the maximum number ofelements the flexible array can contain, or fewer.
In this case, the total number of elements for the flexible array is
determined by variable
clks_num
when allocating heap space viadevm_kzalloc()
, as shown below:289 struct loongson2_clk_provider *clp;
...
296 for (p = data; p->name; p++)
297 clks_num++;
298
299 clp = devm_kzalloc(dev, struct_size(clp, clk_data.hws, clks_num),
300 GFP_KERNEL);
So,
clp->clk_data.num
should be set toclks_num
or less, and notexceed
clks_num
, as is currently the case. Otherwise, if data iswritten into
clp->clk_data.hws[clks_num]
, the instrumentationprovided by the compiler won't detect the overflow, leading to a
memory corruption bug at runtime.
Fix this issue by setting
clp->clk_data.num
toclks_num
.References