On 2024/8/6 02:39, Sandeep Dhavale wrote:
On Sun, Aug 4, 2024 at 8:25 PM Hongzhen Luo<hongz...@linux.alibaba.com>  wrote:
Coverity-id: 502377

Signed-off-by: Hongzhen Luo<hongz...@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

Reply via email to