Page MenuHomeFreeBSD

D44813.diff
No OneTemporary

D44813.diff

diff --git a/crypto/heimdal/lib/asn1/Makefile.am b/crypto/heimdal/lib/asn1/Makefile.am
--- a/crypto/heimdal/lib/asn1/Makefile.am
+++ b/crypto/heimdal/lib/asn1/Makefile.am
@@ -37,6 +37,7 @@
gen_files_pkcs12 = asn1_pkcs12_asn1.x
gen_files_pkcs8 = asn1_pkcs8_asn1.x
gen_files_pkcs9 = asn1_pkcs9_asn1.x
+gen_files_test_template = test_template_asn1-template.c
gen_files_test = asn1_test_asn1.x
gen_files_digest = asn1_digest_asn1.x
gen_files_kx509 = asn1_kx509_asn1.x
@@ -53,7 +54,7 @@
check_der_SOURCES = check-der.c check-common.c check-common.h
check_template_SOURCES = check-template.c check-common.c check-common.h
-nodist_check_template_SOURCES = $(gen_files_test:.x=.c)
+nodist_check_template_SOURCES = $(gen_files_test_template:.x=.c)
dist_check_gen_SOURCES = check-gen.c check-common.c check-common.h
nodist_check_gen_SOURCES = $(gen_files_test:.x=.c)
@@ -134,6 +135,7 @@
$(gen_files_pkcs12) \
$(gen_files_digest) \
$(gen_files_kx509) \
+ $(gen_files_test_template) \
$(gen_files_test) $(nodist_check_gen_SOURCES) \
asn1_err.c asn1_err.h \
rfc2459_asn1_files rfc2459_asn1*.h* \
@@ -145,6 +147,7 @@
pkcs12_asn1_files pkcs12_asn1*.h* \
digest_asn1_files digest_asn1*.h* \
kx509_asn1_files kx509_asn1*.h* \
+ test_template_asn1_files test_template_asn1*.h* \
test_asn1_files test_asn1*.h*
dist_include_HEADERS = der.h heim_asn1.h der-protos.h der-private.h
@@ -170,6 +173,7 @@
priv_headers += pkcs12_asn1-priv.h
priv_headers += digest_asn1-priv.h
priv_headers += kx509_asn1-priv.h
+priv_headers += test_template_asn1.h test_template_asn1-priv.h
priv_headers += test_asn1.h test_asn1-priv.h
@@ -178,7 +182,7 @@
$(libasn1_la_OBJECTS): $(nodist_include_HEADERS) $(priv_headers) asn1_err.h $(srcdir)/der-protos.h $(srcdir)/der-private.h
$(libasn1base_la_OBJECTS): asn1_err.h $(srcdir)/der-protos.h $(srcdir)/der-private.h
$(check_gen_OBJECTS): test_asn1.h
-$(check_template_OBJECTS): test_asn1_files
+$(check_template_OBJECTS): test_template_asn1.h test_template_asn1_files
$(asn1_print_OBJECTS): krb5_asn1.h
asn1parse.h: asn1parse.c
@@ -192,6 +196,7 @@
$(gen_files_kx509) kx509_asn1.hx kx509_asn1-priv.hx: kx509_asn1_files
$(gen_files_rfc2459) rfc2459_asn1.hx rfc2459_asn1-priv.hx: rfc2459_asn1_files
$(gen_files_cms) cms_asn1.hx cms_asn1-priv.hx: cms_asn1_files
+$(gen_files_test_template) test_template_asn1.hx test_template_asn1-priv.hx: test_template_asn1_files
$(gen_files_test) test_asn1.hx test_asn1-priv.hx: test_asn1_files
rfc2459_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/rfc2459.asn1
@@ -221,6 +226,9 @@
kx509_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/kx509.asn1
$(ASN1_COMPILE) --one-code-file $(srcdir)/kx509.asn1 kx509_asn1 || (rm -f kx509_asn1_files ; exit 1)
+test_template_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/test.asn1
+ $(ASN1_COMPILE) --template --sequence=TESTSeqOf $(srcdir)/test.asn1 test_template_asn1 || (rm -f test_template_asn1_files ; exit 1)
+
test_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/test.asn1
$(ASN1_COMPILE) --one-code-file --sequence=TESTSeqOf $(srcdir)/test.asn1 test_asn1 || (rm -f test_asn1_files ; exit 1)
diff --git a/crypto/heimdal/lib/asn1/asn1-template.h b/crypto/heimdal/lib/asn1/asn1-template.h
index 107706ce834081e4b75601dbb4f9f9ba5e424015..5fd6b812630f45e012122a3421ceb80becff2c38
GIT binary patch
literal 4104
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
byrH9H4wLNDQIs1vj$Y^1Q~bY7ylnjgQU9ZE
literal 4065
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
Vc6|`#29Bc_u<;E4lM>Gx{{Sopnt1>K
diff --git a/crypto/heimdal/lib/asn1/asn1parse.h b/crypto/heimdal/lib/asn1/asn1parse.h
--- a/crypto/heimdal/lib/asn1/asn1parse.h
+++ b/crypto/heimdal/lib/asn1/asn1parse.h
@@ -224,7 +224,7 @@
typedef union YYSTYPE
#line 71 "asn1parse.y"
{
- int constant;
+ int64_t constant;
struct value *value;
struct range *range;
char *name;
diff --git a/crypto/heimdal/lib/asn1/asn1parse.c b/crypto/heimdal/lib/asn1/asn1parse.c
--- a/crypto/heimdal/lib/asn1/asn1parse.c
+++ b/crypto/heimdal/lib/asn1/asn1parse.c
@@ -304,7 +304,7 @@
typedef union YYSTYPE
#line 71 "asn1parse.y"
{
- int constant;
+ int64_t constant;
struct value *value;
struct range *range;
char *name;
@@ -1874,7 +1874,7 @@
lex_error_message("Non-integer in first part of range");
(yyval.range) = ecalloc(1, sizeof(*(yyval.range)));
(yyval.range)->min = (yyvsp[(2) - (5)].value)->u.integervalue;
- (yyval.range)->max = (yyvsp[(2) - (5)].value)->u.integervalue - 1;
+ (yyval.range)->max = INT_MAX;
}
break;
@@ -1884,7 +1884,7 @@
if((yyvsp[(4) - (5)].value)->type != integervalue)
lex_error_message("Non-integer in second part of range");
(yyval.range) = ecalloc(1, sizeof(*(yyval.range)));
- (yyval.range)->min = (yyvsp[(4) - (5)].value)->u.integervalue + 2;
+ (yyval.range)->min = INT_MIN;
(yyval.range)->max = (yyvsp[(4) - (5)].value)->u.integervalue;
}
break;
diff --git a/crypto/heimdal/lib/asn1/asn1parse.y b/crypto/heimdal/lib/asn1/asn1parse.y
--- a/crypto/heimdal/lib/asn1/asn1parse.y
+++ b/crypto/heimdal/lib/asn1/asn1parse.y
@@ -69,7 +69,7 @@
%}
%union {
- int constant;
+ int64_t constant;
struct value *value;
struct range *range;
char *name;
@@ -370,14 +370,14 @@
lex_error_message("Non-integer in first part of range");
$$ = ecalloc(1, sizeof(*$$));
$$->min = $2->u.integervalue;
- $$->max = $2->u.integervalue - 1;
+ $$->max = INT_MAX;
}
| '(' kw_MIN RANGE Value ')'
{
if($4->type != integervalue)
lex_error_message("Non-integer in second part of range");
$$ = ecalloc(1, sizeof(*$$));
- $$->min = $4->u.integervalue + 2;
+ $$->min = INT_MIN;
$$->max = $4->u.integervalue;
}
| '(' Value ')'
diff --git a/crypto/heimdal/lib/asn1/check-gen.c b/crypto/heimdal/lib/asn1/check-gen.c
--- a/crypto/heimdal/lib/asn1/check-gen.c
+++ b/crypto/heimdal/lib/asn1/check-gen.c
@@ -764,6 +764,124 @@
return failed;
}
+static int
+check_tag_length64(void)
+{
+ struct test_data td[] = {
+ { 1, 3, 3, "\x02\x01\x00"},
+ { 1, 7, 7, "\x02\x05\x01\xff\xff\xff\xff"},
+ { 1, 7, 7, "\x02\x05\x02\x00\x00\x00\x00"},
+ { 1, 9, 9, "\x02\x07\x7f\xff\xff\xff\xff\xff\xff"},
+ { 1, 10, 10, "\x02\x08\x00\x80\x00\x00\x00\x00\x00\x00"},
+ { 1, 10, 10, "\x02\x08\x7f\xff\xff\xff\xff\xff\xff\xff"},
+ { 1, 11, 11, "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff"},
+ { 0, 3, 0, "\x02\x02\x00"},
+ { 0, 3, 0, "\x02\x7f\x7f"},
+ { 0, 4, 0, "\x02\x03\x00\x80"},
+ { 0, 4, 0, "\x02\x7f\x01\x00"},
+ { 0, 5, 0, "\x02\xff\x7f\x02\x00"}
+ };
+ size_t sz;
+ TESTuint64 values[] = {0, 8589934591LL, 8589934592LL,
+ 36028797018963967LL, 36028797018963968LL,
+ 9223372036854775807LL, 18446744073709551615ULL,
+ 0, 127, 128, 256, 512 };
+ TESTuint64 u;
+ int i, ret, failed = 0;
+ void *buf;
+
+ for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) {
+ struct map_page *page;
+
+ buf = map_alloc(OVERRUN, td[i].data, td[i].len, &page);
+
+ ret = decode_TESTuint64(buf, td[i].len, &u, &sz);
+ if (ret) {
+ if (td[i].ok) {
+ printf("failed with tag len test %d\n", i);
+ printf("ret = %d\n", ret);
+ failed = 1;
+ }
+ } else {
+ if (td[i].ok == 0) {
+ printf("failed with success for tag len test %d\n", i);
+ failed = 1;
+ }
+ if (td[i].expected_len != sz) {
+ printf("wrong expected size for tag test %d\n", i);
+ printf("sz = %d\n", sz);
+ failed = 1;
+ }
+ if (values[i] != u) {
+ printf("wrong value for tag test %d\n", i);
+ printf("Expected value: %lld\nActual value: %lld\n", values[i], u);
+ failed = 1;
+ }
+ }
+ map_free(page, "test", "decode");
+ }
+ return failed;
+}
+
+static int
+check_tag_length64s(void)
+{
+ struct test_data td[] = {
+ { 1, 3, 3, "\x02\x01\x00"},
+ { 1, 7, 7, "\x02\x05\xfe\x00\x00\x00\x01"},
+ { 1, 7, 7, "\x02\x05\xfe\x00\x00\x00\x00"},
+ { 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x01"},
+ { 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x00"},
+ { 1, 10, 10, "\x02\x08\x80\x00\x00\x00\x00\x00\x00\x01"},
+ { 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x01"},
+ { 0, 3, 0, "\x02\x02\x00"},
+ { 0, 3, 0, "\x02\x7f\x7f"},
+ { 0, 4, 0, "\x02\x03\x00\x80"},
+ { 0, 4, 0, "\x02\x7f\x01\x00"},
+ { 0, 5, 0, "\x02\xff\x7f\x02\x00"}
+ };
+ size_t sz;
+ TESTint64 values[] = {0, -8589934591LL, -8589934592LL,
+ -36028797018963967LL, -36028797018963968LL,
+ -9223372036854775807LL, -36028797018963967LL,
+ 0, 127, 128, 256, 512 };
+ TESTint64 u;
+ int i, ret, failed = 0;
+ void *buf;
+
+ for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) {
+ struct map_page *page;
+
+ buf = map_alloc(OVERRUN, td[i].data, td[i].len, &page);
+
+ ret = decode_TESTint64(buf, td[i].len, &u, &sz);
+ if (ret) {
+ if (td[i].ok) {
+ printf("failed with tag len test %d\n", i);
+ printf("ret = %d\n", ret);
+ failed = 1;
+ }
+ } else {
+ if (td[i].ok == 0) {
+ printf("failed with success for tag len test %d\n", i);
+ failed = 1;
+ }
+ if (td[i].expected_len != sz) {
+ printf("wrong expected size for tag test %d\n", i);
+ printf("sz = %d\n", sz);
+ failed = 1;
+ }
+ if (values[i] != u) {
+ printf("wrong value for tag test %d\n", i);
+ printf("Expected value: %lld\nActual value: %lld\n", values[i], u);
+ failed = 1;
+ }
+ }
+ map_free(page, "test", "decode");
+ }
+ return failed;
+}
+
static int
cmp_TESTChoice (void *a, void *b)
{
@@ -1291,6 +1409,8 @@
ret += test_cert();
ret += check_tag_length();
+ ret += check_tag_length64();
+ ret += check_tag_length64s();
ret += test_large_tag();
ret += test_choice();
diff --git a/crypto/heimdal/lib/asn1/der-protos.h b/crypto/heimdal/lib/asn1/der-protos.h
--- a/crypto/heimdal/lib/asn1/der-protos.h
+++ b/crypto/heimdal/lib/asn1/der-protos.h
@@ -67,6 +67,11 @@
const int */*from*/,
int */*to*/);
+int
+der_copy_integer64 (
+ const int64_t */*from*/,
+ int64_t */*to*/);
+
int
der_copy_octet_string (
const heim_octet_string */*from*/,
@@ -92,6 +97,11 @@
const unsigned */*from*/,
unsigned */*to*/);
+int
+der_copy_unsigned64 (
+ const uint64_t */*from*/,
+ uint64_t */*to*/);
+
int
der_copy_utctime (
const time_t */*from*/,
@@ -128,6 +138,9 @@
void
der_free_integer (int */*i*/);
+void
+der_free_integer64 (int64_t */*i*/);
+
void
der_free_octet_string (heim_octet_string */*k*/);
@@ -143,6 +156,9 @@
void
der_free_unsigned (unsigned */*u*/);
+void
+der_free_unsigned64 (uint64_t */*u*/);
+
void
der_free_utctime (time_t */*t*/);
@@ -214,6 +230,13 @@
int */*ret*/,
size_t */*size*/);
+int
+der_get_integer64 (
+ const unsigned char */*p*/,
+ size_t /*len*/,
+ int64_t */*ret*/,
+ size_t */*size*/);
+
int
der_get_length (
const unsigned char */*p*/,
@@ -284,6 +307,13 @@
unsigned */*ret*/,
size_t */*size*/);
+int
+der_get_unsigned64 (
+ const unsigned char */*p*/,
+ size_t /*len*/,
+ uint64_t */*ret*/,
+ size_t */*size*/);
+
int
der_get_utctime (
const unsigned char */*p*/,
@@ -367,6 +397,9 @@
size_t
der_length_integer (const int */*data*/);
+size_t
+der_length_integer64 (const int64_t */*data*/);
+
size_t
der_length_len (size_t /*len*/);
@@ -388,6 +421,9 @@
size_t
der_length_unsigned (const unsigned */*data*/);
+size_t
+der_length_unsigned64 (const uint64_t */*data*/);
+
size_t
der_length_utctime (const time_t */*t*/);
@@ -508,6 +544,13 @@
const int */*v*/,
size_t */*size*/);
+int
+der_put_integer64 (
+ unsigned char */*p*/,
+ size_t /*len*/,
+ const int64_t */*v*/,
+ size_t */*size*/);
+
int
der_put_length (
unsigned char */*p*/,
@@ -569,6 +612,13 @@
const unsigned */*v*/,
size_t */*size*/);
+int
+der_put_unsigned64 (
+ unsigned char */*p*/,
+ size_t /*len*/,
+ const uint64_t */*v*/,
+ size_t */*size*/);
+
int
der_put_utctime (
unsigned char */*p*/,
diff --git a/crypto/heimdal/lib/asn1/der_copy.c b/crypto/heimdal/lib/asn1/der_copy.c
--- a/crypto/heimdal/lib/asn1/der_copy.c
+++ b/crypto/heimdal/lib/asn1/der_copy.c
@@ -54,6 +54,13 @@
return 0;
}
+int
+der_copy_integer64 (const int64_t *from, int64_t *to)
+{
+ *to = *from;
+ return 0;
+}
+
int
der_copy_unsigned (const unsigned *from, unsigned *to)
{
@@ -61,6 +68,13 @@
return 0;
}
+int
+der_copy_unsigned64 (const uint64_t *from, uint64_t *to)
+{
+ *to = *from;
+ return 0;
+}
+
int
der_copy_generalized_time (const time_t *from, time_t *to)
{
diff --git a/crypto/heimdal/lib/asn1/der_free.c b/crypto/heimdal/lib/asn1/der_free.c
--- a/crypto/heimdal/lib/asn1/der_free.c
+++ b/crypto/heimdal/lib/asn1/der_free.c
@@ -50,12 +50,24 @@
*i = 0;
}
+void
+der_free_integer64 (int64_t *i)
+{
+ *i = 0;
+}
+
void
der_free_unsigned (unsigned *u)
{
*u = 0;
}
+void
+der_free_unsigned64 (uint64_t *u)
+{
+ *u = 0;
+}
+
void
der_free_generalized_time(time_t *t)
{
diff --git a/crypto/heimdal/lib/asn1/der_get.c b/crypto/heimdal/lib/asn1/der_get.c
--- a/crypto/heimdal/lib/asn1/der_get.c
+++ b/crypto/heimdal/lib/asn1/der_get.c
@@ -48,9 +48,28 @@
unsigned val = 0;
size_t oldlen = len;
- if (len == sizeof(unsigned) + 1 && p[0] == 0)
+ if (len == sizeof(val) + 1 && p[0] == 0)
;
- else if (len > sizeof(unsigned))
+ else if (len > sizeof(val))
+ return ASN1_OVERRUN;
+
+ while (len--)
+ val = val * 256 + *p++;
+ *ret = val;
+ if(size) *size = oldlen;
+ return 0;
+}
+
+int
+der_get_unsigned64 (const unsigned char *p, size_t len,
+ uint64_t *ret, size_t *size)
+{
+ uint64_t val = 0;
+ size_t oldlen = len;
+
+ if (len == sizeof(val) + 1 && p[0] == 0)
+ ;
+ else if (len > sizeof(val))
return ASN1_OVERRUN;
while (len--)
@@ -67,7 +86,27 @@
int val = 0;
size_t oldlen = len;
- if (len > sizeof(int))
+ if (len > sizeof(val))
+ return ASN1_OVERRUN;
+
+ if (len > 0) {
+ val = (signed char)*p++;
+ while (--len)
+ val = val * 256 + *p++;
+ }
+ *ret = val;
+ if(size) *size = oldlen;
+ return 0;
+}
+
+int
+der_get_integer64 (const unsigned char *p, size_t len,
+ int64_t *ret, size_t *size)
+{
+ int64_t val = 0;
+ size_t oldlen = len;
+
+ if (len > sizeof(val))
return ASN1_OVERRUN;
if (len > 0) {
diff --git a/crypto/heimdal/lib/asn1/der_length.c b/crypto/heimdal/lib/asn1/der_length.c
--- a/crypto/heimdal/lib/asn1/der_length.c
+++ b/crypto/heimdal/lib/asn1/der_length.c
@@ -55,6 +55,24 @@
return ret;
}
+size_t
+_heim_len_unsigned64 (uint64_t val)
+{
+ size_t ret = 0;
+ int last_val_gt_128;
+
+ do {
+ ++ret;
+ last_val_gt_128 = (val >= 128);
+ val /= 256;
+ } while (val);
+
+ if(last_val_gt_128)
+ ret++;
+
+ return ret;
+}
+
size_t
_heim_len_int (int val)
{
@@ -82,6 +100,33 @@
return ret;
}
+size_t
+_heim_len_int64 (int64_t val)
+{
+ unsigned char q;
+ size_t ret = 0;
+
+ 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;
+}
+
static size_t
len_oid (const heim_oid *oid)
{
@@ -134,12 +179,24 @@
return _heim_len_int (*data);
}
+size_t
+der_length_integer64 (const int64_t *data)
+{
+ return _heim_len_int64 (*data);
+}
+
size_t
der_length_unsigned (const unsigned *data)
{
return _heim_len_unsigned(*data);
}
+size_t
+der_length_unsigned64 (const uint64_t *data)
+{
+ return _heim_len_unsigned64(*data);
+}
+
size_t
der_length_enumerated (const unsigned *data)
{
diff --git a/crypto/heimdal/lib/asn1/der_put.c b/crypto/heimdal/lib/asn1/der_put.c
--- a/crypto/heimdal/lib/asn1/der_put.c
+++ b/crypto/heimdal/lib/asn1/der_put.c
@@ -75,6 +75,38 @@
}
}
+int
+der_put_unsigned64 (unsigned char *p, size_t len, const uint64_t *v, size_t *size)
+{
+ unsigned char *base = p;
+ uint64_t val = *v;
+
+ if (val) {
+ while (len > 0 && val) {
+ *p-- = val % 256;
+ val /= 256;
+ --len;
+ }
+ if (val != 0)
+ return ASN1_OVERFLOW;
+ else {
+ if(p[1] >= 128) {
+ if(len < 1)
+ return ASN1_OVERFLOW;
+ *p-- = 0;
+ }
+ *size = base - p;
+ return 0;
+ }
+ } else if (len < 1)
+ return ASN1_OVERFLOW;
+ else {
+ *p = 0;
+ *size = 1;
+ return 0;
+ }
+}
+
int
der_put_integer (unsigned char *p, size_t len, const int *v, size_t *size)
{
@@ -115,6 +147,46 @@
return 0;
}
+int
+der_put_integer64 (unsigned char *p, size_t len, const int64_t *v, size_t *size)
+{
+ unsigned char *base = p;
+ int64_t val = *v;
+
+ if(val >= 0) {
+ do {
+ if(len < 1)
+ return ASN1_OVERFLOW;
+ *p-- = val % 256;
+ len--;
+ val /= 256;
+ } while(val);
+ if(p[1] >= 128) {
+ if(len < 1)
+ return ASN1_OVERFLOW;
+ *p-- = 0;
+ len--;
+ }
+ } else {
+ val = ~val;
+ do {
+ if(len < 1)
+ return ASN1_OVERFLOW;
+ *p-- = ~(val % 256);
+ len--;
+ val /= 256;
+ } while(val);
+ if(p[1] < 128) {
+ if(len < 1)
+ return ASN1_OVERFLOW;
+ *p-- = 0xff;
+ len--;
+ }
+ }
+ *size = base - p;
+ return 0;
+}
+
int
der_put_length (unsigned char *p, size_t len, size_t val, size_t *size)
diff --git a/crypto/heimdal/lib/asn1/gen.c b/crypto/heimdal/lib/asn1/gen.c
--- a/crypto/heimdal/lib/asn1/gen.c
+++ b/crypto/heimdal/lib/asn1/gen.c
@@ -303,7 +303,7 @@
fprintf(codefile, "if((%s = strdup(\"%s\")) == NULL)\nreturn ENOMEM;\n", var, val->u.stringvalue);
break;
case integervalue:
- fprintf(codefile, "%s = %d;\n", var, val->u.integervalue);
+ fprintf(codefile, "%s = %" PRId64 ";\n", var, val->u.integervalue);
break;
case booleanvalue:
if(val->u.booleanvalue)
@@ -324,7 +324,7 @@
fprintf(codefile, "if(strcmp(%s, \"%s\") != 0)\n", var, val->u.stringvalue);
break;
case integervalue:
- fprintf(codefile, "if(%s != %d)\n", var, val->u.integervalue);
+ fprintf(codefile, "if(%s != %" PRId64 ")\n", var, val->u.integervalue);
break;
case booleanvalue:
if(val->u.booleanvalue)
@@ -397,7 +397,7 @@
case booleanvalue:
break;
case integervalue:
- fprintf (headerfile, "enum { %s = %d };\n\n",
+ fprintf (headerfile, "enum { %s = %" PRId64 " };\n\n",
s->gen_name, s->value->u.integervalue);
break;
case nullvalue:
@@ -540,7 +540,7 @@
if(t->members == NULL) {
fprintf (headerfile, "INTEGER");
if (t->range)
- fprintf (headerfile, " (%d..%d)",
+ fprintf (headerfile, " (%" PRId64 "..%" PRId64 ")",
t->range->min, t->range->max);
} else {
Member *m;
@@ -723,14 +723,16 @@
fprintf (headerfile, "} %s;\n", name);
} else if (t->range == NULL) {
fprintf (headerfile, "heim_integer %s;\n", name);
- } else if (t->range->min == INT_MIN && t->range->max == INT_MAX) {
+ } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) {
+ fprintf (headerfile, "int64_t %s;\n", name);
+ } else if (t->range->min >= 0 && t->range->max > UINT_MAX) {
+ fprintf (headerfile, "uint64_t %s;\n", name);
+ } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) {
fprintf (headerfile, "int %s;\n", name);
- } else if (t->range->min == 0 && t->range->max == UINT_MAX) {
- fprintf (headerfile, "unsigned int %s;\n", name);
- } else if (t->range->min == 0 && t->range->max == INT_MAX) {
+ } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) {
fprintf (headerfile, "unsigned int %s;\n", name);
} else
- errx(1, "%s: unsupported range %d -> %d",
+ errx(1, "%s: unsupported range %" PRId64 " -> %" PRId64 "",
name, t->range->min, t->range->max);
break;
case TBoolean:
diff --git a/crypto/heimdal/lib/asn1/gen_decode.c b/crypto/heimdal/lib/asn1/gen_decode.c
--- a/crypto/heimdal/lib/asn1/gen_decode.c
+++ b/crypto/heimdal/lib/asn1/gen_decode.c
@@ -189,19 +189,19 @@
{
if (r->min == r->max + 2 || r->min < r->max)
fprintf (codefile,
- "if ((%s)->%s > %d) {\n"
+ "if ((%s)->%s > %" PRId64 ") {\n"
"e = ASN1_MAX_CONSTRAINT; %s;\n"
"}\n",
name, length, r->max, forwstr);
if (r->min - 1 == r->max || r->min < r->max)
fprintf (codefile,
- "if ((%s)->%s < %d) {\n"
+ "if ((%s)->%s < %" PRId64 ") {\n"
"e = ASN1_MIN_CONSTRAINT; %s;\n"
"}\n",
name, length, r->min, forwstr);
if (r->max == r->min)
fprintf (codefile,
- "if ((%s)->%s != %d) {\n"
+ "if ((%s)->%s != %" PRId64 ") {\n"
"e = ASN1_EXACT_CONSTRAINT; %s;\n"
"}\n",
name, length, r->min, forwstr);
@@ -252,14 +252,16 @@
name);
} else if (t->range == NULL) {
decode_primitive ("heim_integer", name, forwstr);
- } else if (t->range->min == INT_MIN && t->range->max == INT_MAX) {
+ } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) {
+ decode_primitive ("integer64", name, forwstr);
+ } else if (t->range->min >= 0 && t->range->max > UINT_MAX) {
+ decode_primitive ("unsigned64", name, forwstr);
+ } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) {
decode_primitive ("integer", name, forwstr);
- } else if (t->range->min == 0 && t->range->max == UINT_MAX) {
- decode_primitive ("unsigned", name, forwstr);
- } else if (t->range->min == 0 && t->range->max == INT_MAX) {
+ } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) {
decode_primitive ("unsigned", name, forwstr);
} else
- errx(1, "%s: unsupported range %d -> %d",
+ errx(1, "%s: unsupported range %" PRId64 " -> %" PRId64,
name, t->range->min, t->range->max);
break;
case TBoolean:
diff --git a/crypto/heimdal/lib/asn1/gen_encode.c b/crypto/heimdal/lib/asn1/gen_encode.c
--- a/crypto/heimdal/lib/asn1/gen_encode.c
+++ b/crypto/heimdal/lib/asn1/gen_encode.c
@@ -129,14 +129,16 @@
fprintf(codefile, "}\n;");
} else if (t->range == NULL) {
encode_primitive ("heim_integer", name);
- } else if (t->range->min == INT_MIN && t->range->max == INT_MAX) {
+ } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) {
+ encode_primitive ("integer64", name);
+ } else if (t->range->min >= 0 && t->range->max > UINT_MAX) {
+ encode_primitive ("unsigned64", name);
+ } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) {
encode_primitive ("integer", name);
- } else if (t->range->min == 0 && t->range->max == UINT_MAX) {
- encode_primitive ("unsigned", name);
- } else if (t->range->min == 0 && t->range->max == INT_MAX) {
+ } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) {
encode_primitive ("unsigned", name);
} else
- errx(1, "%s: unsupported range %d -> %d",
+ errx(1, "%s: unsupported range %" PRId64 " -> %" PRId64,
name, t->range->min, t->range->max);
constructed = 0;
break;
diff --git a/crypto/heimdal/lib/asn1/gen_length.c b/crypto/heimdal/lib/asn1/gen_length.c
--- a/crypto/heimdal/lib/asn1/gen_length.c
+++ b/crypto/heimdal/lib/asn1/gen_length.c
@@ -80,14 +80,16 @@
fprintf(codefile, "}\n");
} else if (t->range == NULL) {
length_primitive ("heim_integer", name, variable);
- } else if (t->range->min == INT_MIN && t->range->max == INT_MAX) {
+ } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) {
+ length_primitive ("integer64", name, variable);
+ } else if (t->range->min >= 0 && t->range->max > UINT_MAX) {
+ length_primitive ("unsigned64", name, variable);
+ } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) {
length_primitive ("integer", name, variable);
- } else if (t->range->min == 0 && t->range->max == UINT_MAX) {
- length_primitive ("unsigned", name, variable);
- } else if (t->range->min == 0 && t->range->max == INT_MAX) {
+ } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) {
length_primitive ("unsigned", name, variable);
} else
- errx(1, "%s: unsupported range %d -> %d",
+ errx(1, "%s: unsupported range %" PRId64 " -> %" PRId64,
name, t->range->min, t->range->max);
break;
diff --git a/crypto/heimdal/lib/asn1/gen_template.c b/crypto/heimdal/lib/asn1/gen_template.c
index edd68e12238009d796c30f2fa77667a507b4291b..15bf7d30c4983684d5e2553487dda870e8f4c4b5
GIT binary patch
literal 22932
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
Go&N)E%tLkn
literal 22737
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
E0frY1tpET3
diff --git a/crypto/heimdal/lib/asn1/lex.l b/crypto/heimdal/lib/asn1/lex.l
--- a/crypto/heimdal/lib/asn1/lex.l
+++ b/crypto/heimdal/lib/asn1/lex.l
@@ -255,7 +255,7 @@
}
-?0x[0-9A-Fa-f]+|-?[0-9]+ { char *e, *y = yytext;
- yylval.constant = strtol((const char *)yytext,
+ yylval.constant = strtoll((const char *)yytext,
&e, 0);
if(e == y)
lex_error_message("malformed constant (%s)", yytext);
diff --git a/crypto/heimdal/lib/asn1/symbol.h b/crypto/heimdal/lib/asn1/symbol.h
--- a/crypto/heimdal/lib/asn1/symbol.h
+++ b/crypto/heimdal/lib/asn1/symbol.h
@@ -78,7 +78,7 @@
} type;
union {
int booleanvalue;
- int integervalue;
+ int64_t integervalue;
char *stringvalue;
struct objid *objectidentifiervalue;
} u;
@@ -109,8 +109,12 @@
};
struct range {
- int min;
- int max;
+ /*
+ * We can't represent unsigned 64-bit ranges because max might be
+ * negative...
+ */
+ int64_t min;
+ int64_t max;
};
enum ctype { CT_CONTENTS, CT_USER } ;
diff --git a/crypto/heimdal/lib/asn1/template.c b/crypto/heimdal/lib/asn1/template.c
--- a/crypto/heimdal/lib/asn1/template.c
+++ b/crypto/heimdal/lib/asn1/template.c
@@ -66,7 +66,9 @@
el(integer, int),
el(heim_integer, heim_integer),
el(integer, int),
+ el(integer64, int64_t),
el(unsigned, unsigned),
+ el(unsigned64, uint64_t),
el(general_string, heim_general_string),
el(octet_string, heim_octet_string),
elber(octet_string, heim_octet_string),
diff --git a/crypto/heimdal/lib/asn1/test.asn1 b/crypto/heimdal/lib/asn1/test.asn1
--- a/crypto/heimdal/lib/asn1/test.asn1
+++ b/crypto/heimdal/lib/asn1/test.asn1
@@ -7,6 +7,8 @@
IMPORTS heim_any FROM heim;
TESTuint32 ::= INTEGER (0..4294967295)
+TESTuint64 ::= INTEGER(0..18446744073709551615)
+TESTint64 ::= INTEGER(-9223372036854775808..9223372036854775807)
TESTLargeTag ::= SEQUENCE {
foo[127] INTEGER (-2147483648..2147483647),

File Metadata

Mime Type
text/plain
Expires
Sun, Mar 1, 2:23 AM (8 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29092043
Default Alt Text
D44813.diff (43 KB)

Event Timeline