Warning implies possible kerberos bug in krb5int_dns_nextans() in dnsglue.c
Jeffrey Hutzelman
jhutz at cmu.edu
Tue Mar 18 10:58:52 EDT 2008
--On Monday, March 17, 2008 11:45:58 PM -0600 Philip Guenther
<guenther at gmail.com> wrote:
> On Mon, Mar 17, 2008 at 6:36 PM, Jeffrey Hutzelman <jhutz at cmu.edu> wrote:
> ...
>> I think both concerns are valid. Harmless warnings should be
>> eliminated, as possible, because doing so makes it easier to find real
>> problem. In this case, I would suggest replacing the offending line
>> with the following:
>>
>> /* NB: sizeof(unsigned short) <= sizeof(unsigned int) */
>> if ((unsigned int)rdlen > INT_MAX)
>>
>> This eliminates the harmless warning, but should still generate one if
>> rdlen ever gets retyped to something bigger than an unsigned int.
>
> As Russ observed, the test is there to protect systems where short and
> int are both 16bit types. If an EDNS0 extension let the field in the
> packet grow to 32bits and rdlen was changed to a unsigned long as a
> result, then your 'fixed' code would make the test return false
> negatives when rdlen was > UINT_MAX but less than UINT_MAX+INT_MAX
> (and similarly in higher ranges) and it would *not* generate a warning
> when compiled.
Hrm. Indeed, an explicit cast to a smaller type does not seem to generate
a warning, in at least one compiler I tried. I believe it would be
possible to work something out by taking advantage of implicit promotion of
function call arguments, or even just eliminating the constant-ness of the
second argument. For example:
int too_big(unsigned int arg) { return arg > INT_MAX; }
int greater(unsigned short x, unsigned int y) { return x > y; }
However, I'm not convinced it's worth the ugliness.
> IMHO, the Right Thing would be to fix the API and make lenp point to
> an unsigned int instead of a signed int. If I'm reading the callers
> correctly, matching them match would be trivial.
I haven't examined the surrounding code. If the API in question is
entirely internal, this may be a possibility.
> Alternatively, just change the code to test against SHORT_MAX. Yeah,
> that limits it to 32kB RDATA fields, but the current code already
> imposes that limitation on systems where int is 16bits.
True, but since int is not 32 bits on most systems today, do we really want
to impose that limitation?
-- Jeff
More information about the krbdev
mailing list