[PATCH] erofs-utils: lib: fix potential overflow issue

Hongzhen Luo hongzhen at linux.alibaba.com
Tue Aug 6 15:08:47 AEST 2024


On 2024/8/6 02:39, Sandeep Dhavale wrote:
> On Sun, Aug 4, 2024 at 8:25 PM Hongzhen Luo<hongzhen at linux.alibaba.com>  wrote:
>> Coverity-id: 502377
>>
>> Signed-off-by: Hongzhen Luo<hongzhen at linux.alibaba.com>
>> ---
>>   lib/kite_deflate.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/lib/kite_deflate.c b/lib/kite_deflate.c
>> index a5ebd66..e52e382 100644
>> --- a/lib/kite_deflate.c
>> +++ b/lib/kite_deflate.c
>> @@ -817,7 +817,8 @@ static const struct kite_matchfinder_cfg {
>>   /* 9 */ {32, 258, 258, 4096, true},    /* maximum compression */
>>   };
>>
>> -static int kite_mf_init(struct kite_matchfinder *mf, int wsiz, int level)
>> +static int kite_mf_init(struct kite_matchfinder *mf, unsigned int wsiz,
>> +                       int level)
>>   {
>>          const struct kite_matchfinder_cfg *cfg;
>>
>> --
>> 2.43.5
>>
> Hi Hongzhen,
> Can you please explain to me where the potential overflow is? Checkers
> can be smart so easy for me to miss.
> I see a below check in kitle_me_init()
>
>      if (wsiz > kHistorySize32 || (1 << ilog2(wsiz)) != wsiz)
>            return -EINVAL;
>
> So any larger value than kHistorySize32 which is (1U << 15) is already
> rejected. So what overflow case is this int => unsigned int type
> conversion solving?
>
> Thanks,
> Sandeep.

Hi Sandeep,

The coverity tool says that for code `mf->chain = 
malloc(sizeof(mf->chain[0]) * wsiz);` there is a potential overflow issue:

overflow_const: Expression 4UL * wsiz, which is equal to 
18446744065119617024, where wsiz is known to be equal to -2147483648, 
overflows the type that receives it, an unsigned integer 64 bits wide.

For example, when `wsiz` is set to -1, it is converted to an unsigned 
long value of 18446744073709551615, and multiplying this by 4 would lead 
to an overflow error. Consequently, I have defined wsiz as unsigned int, 
which has a maximum value of 4294967295. After converting this to 
unsigned long and multiplying by 4, an overflow will not occur.

In practical applications, however, `wsiz` would not take on such odd 
values.

---

Thanks,

Hongzhen Luo
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/linux-erofs/attachments/20240806/ae6749a2/attachment.htm>


More information about the Linux-erofs mailing list