*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#include "netdissect-stdinc.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <assert.h>
#include "netdissect.h"
{
int i;
- for ( i = 0; i < length; i++ )
- {
+ for ( i = 0; i < length; i++ ) {
accum = ((accum << 8) & 0x3ff)
^ crc10_table[( accum >> 2) & 0xff]
^ *p++;
int x;
int y;
- uint32_t mul;
+ int32_t mul;
uint32_t c0;
- uint32_t c1;
+ uint64_t c1;
uint16_t checksum;
int idx;
mul = (length - checksum_offset)*(c0);
- x = mul - c0 - c1;
- y = c1 - mul - 1;
-
- if ( y >= 0 ) y++;
- if ( x < 0 ) x--;
+ /*
+ * Casting c0 and c1 here is guaranteed to be safe, because we know
+ * they have values between 0 and 254 inclusive. These casts are
+ * done to ensure that all of the arithmetic operations are
+ * well-defined (i.e., not mixing signed and unsigned integers).
+ */
+ x = mul - (int)c0 - (int)c1;
+ y = (int)c1 - mul;
x %= 255;
y %= 255;
-
- if (x == 0) x = 255;
- if (y == 0) y = 255;
+ if (x <= 0) x += 255;
+ if (y <= 0) y += 255;
y &= 0x00FF;
- checksum = ((x << 8) | y);
+ checksum = (uint16_t)((x << 8) | y);
return checksum;
}