Re: [PATCH] strparser: Fix signed/unsigned mismatch bug

From: Jacob Keller

Date: Wed Nov 05 2025 - 18:47:05 EST




On 11/5/2025 3:12 PM, Nate Karstens wrote:
> Thanks, Jake!
>
>> So, without the ssize_t, I guess everything switches back to unsigned
>> here when subtracting skb->len..
>
> That's right. In C, if there is a mix of signed an unsigned, then signed are converted to unsigned and unsigned arithmetic is used.
>
>> I don't quite recall the signed vs unsigned rules for this. Is
>> stm.strp.offset also unsigned? which means that after head->len -
>> skb->len resolves to unsigned 0 then we underflow?
>
> Here is a summary of the types for the variables involved:
>
> len => ssize_t (signed)
> (ssize_t)head->len => unsigned int cast to ssize_t
> skb->len => unsigned int, causes the whole comparison to use unsigned arithmetic
> stm->strp.offset => int (see struct strp_msg)
>

Ah, right so if we don't cast skb->len then the entire thing uses
unsigned arithmetic which results in the bad outcome for certain values
of input.

Casting would fix this. Another alternative would be to re-write the
checks so that they don't fail when using unsigned arithmetic.

Given that we already cast one to ssize_t, it does seem reasonable to
just add the other cast as your patch did.
>> If we don't actually use the strparser code anywhere then it could be
>> dropped
>
> It is still used elsewhere, and ktls still uses some of the data structures.
>

Right. Fixing it makes the most sense, so that other users don't
accidentally behave unexpectedly.

> Cheers,
>
> Nate

Attachment: OpenPGP_signature.asc
Description: OpenPGP digital signature