]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
lib/LzmaEnc: Validate "len" before subtracting
authorLidong Chen <lidong.chen@oracle.com>
Thu, 12 Jun 2025 00:03:58 +0000 (00:03 +0000)
committerDaniel Kiper <daniel.kiper@oracle.com>
Tue, 17 Jun 2025 11:37:31 +0000 (13:37 +0200)
In LzmaEnc_CodeOneBlock(), both GetOptimumFast() and GetOptimum()
returns a value of greater or equal to 1, which is assigned to
"len". But since LZMA_MATCH_LEN_MIN == 2, "len" should be validated
before performing "len - LZMA_MATCH_LEN_MIN" to avoid underflow
when "len" equals to 1.

Fixes: CID 51508
Signed-off-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
grub-core/lib/LzmaEnc.c

index 52b3315586858e397853f75fec9c649a53f79d28..e97cd15a087c21a6e1c1ea78d016cac21d5e5b5b 100644 (file)
@@ -1880,6 +1880,11 @@ static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize
         UInt32 posSlot, lenToPosState;
         RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
         p->state = kMatchNextStates[p->state];
+        if (len < LZMA_MATCH_LEN_MIN)
+        {
+          p->result = SZ_ERROR_DATA;
+          return CheckErrors(p);
+        }
         LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
         pos -= LZMA_NUM_REPS;
         GetPosSlot(pos, posSlot);