Fix len_unsigned for certain negative integers, it got the length
wrong, fix from Panasas, Inc. rename len_int and len_unsigned to _heim_\& git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@13316 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -35,8 +35,8 @@
|
||||
|
||||
RCSID("$Id$");
|
||||
|
||||
static size_t
|
||||
len_unsigned (unsigned val)
|
||||
size_t
|
||||
_heim_len_unsigned (unsigned val)
|
||||
{
|
||||
size_t ret = 0;
|
||||
|
||||
@@ -47,22 +47,29 @@ len_unsigned (unsigned val)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static size_t
|
||||
len_int (int val)
|
||||
size_t
|
||||
_heim_len_int (int val)
|
||||
{
|
||||
unsigned char q;
|
||||
size_t ret = 0;
|
||||
|
||||
if (val == 0)
|
||||
return 1;
|
||||
while (val > 255 || val < -255) {
|
||||
++ret;
|
||||
val /= 256;
|
||||
}
|
||||
if (val != 0) {
|
||||
++ret;
|
||||
if ((signed char)val != val)
|
||||
++ret;
|
||||
val /= 256;
|
||||
if (val >= 0) {
|
||||
do {
|
||||
q = val % 256;
|
||||
ret++;
|
||||
val /= 256;
|
||||
} while(val);
|
||||
if(q >= 128)
|
||||
ret++;
|
||||
} else {
|
||||
val = ~val;
|
||||
do {
|
||||
q = ~(val % 256);
|
||||
ret++;
|
||||
val /= 256;
|
||||
} while(val);
|
||||
if(q < 128)
|
||||
ret++;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -92,7 +99,7 @@ length_len (size_t len)
|
||||
if (len < 128)
|
||||
return 1;
|
||||
else
|
||||
return len_unsigned (len) + 1;
|
||||
return _heim_len_unsigned (len) + 1;
|
||||
}
|
||||
|
||||
size_t
|
||||
@@ -104,7 +111,7 @@ length_boolean (const int *data)
|
||||
size_t
|
||||
length_integer (const int *data)
|
||||
{
|
||||
size_t len = len_int (*data);
|
||||
size_t len = _heim_len_int (*data);
|
||||
|
||||
return 1 + length_len(len) + len;
|
||||
}
|
||||
@@ -128,7 +135,7 @@ length_unsigned (const unsigned *data)
|
||||
size_t
|
||||
length_enumerated (const unsigned *data)
|
||||
{
|
||||
size_t len = len_int (*data);
|
||||
size_t len = _heim_len_int (*data);
|
||||
|
||||
return 1 + length_len(len) + len;
|
||||
}
|
||||
|
Reference in New Issue
Block a user