Skip to content

Commit af41d06

Browse files
committed
Changes to support PER encoding support
1 parent a58ee20 commit af41d06

File tree

12 files changed

+181
-112
lines changed

12 files changed

+181
-112
lines changed

src/asn1/generated/INTEGER.c

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*-
2-
* Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin <vlm@lionet.info>.
2+
* Copyright (c) 2003-2014 Lev Walkin <vlm@lionet.info>.
33
* All rights reserved.
44
* Redistribution and modifications are permitted subject to BSD license.
55
*/
@@ -601,30 +601,35 @@ INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
601601
}
602602
}
603603

604-
/* X.691, #12.2.2 */
604+
/* X.691-2008/11, #13.2.2, constrained whole number */
605605
if(ct && ct->flags != APC_UNCONSTRAINED) {
606-
/* #10.5.6 */
606+
/* #11.5.6 */
607607
ASN_DEBUG("Integer with range %d bits", ct->range_bits);
608608
if(ct->range_bits >= 0) {
609-
long value;
610-
if(ct->range_bits == 32) {
611-
long lhalf;
612-
value = per_get_few_bits(pd, 16);
613-
if(value < 0) _ASN_DECODE_STARVED;
614-
lhalf = per_get_few_bits(pd, 16);
615-
if(lhalf < 0) _ASN_DECODE_STARVED;
616-
value = (value << 16) | lhalf;
609+
if((size_t)ct->range_bits > 8 * sizeof(unsigned long))
610+
_ASN_DECODE_FAILED;
611+
612+
if(specs && specs->field_unsigned) {
613+
unsigned long uvalue;
614+
if(uper_get_constrained_whole_number(pd,
615+
&uvalue, ct->range_bits))
616+
_ASN_DECODE_STARVED;
617+
ASN_DEBUG("Got value %lu + low %ld",
618+
uvalue, ct->lower_bound);
619+
uvalue += ct->lower_bound;
620+
if(asn_ulong2INTEGER(st, uvalue))
621+
_ASN_DECODE_FAILED;
617622
} else {
618-
value = per_get_few_bits(pd, ct->range_bits);
619-
if(value < 0) _ASN_DECODE_STARVED;
623+
unsigned long svalue;
624+
if(uper_get_constrained_whole_number(pd,
625+
&svalue, ct->range_bits))
626+
_ASN_DECODE_STARVED;
627+
ASN_DEBUG("Got value %ld + low %ld",
628+
svalue, ct->lower_bound);
629+
svalue += ct->lower_bound;
630+
if(asn_long2INTEGER(st, svalue))
631+
_ASN_DECODE_FAILED;
620632
}
621-
ASN_DEBUG("Got value %ld + low %ld",
622-
value, ct->lower_bound);
623-
value += ct->lower_bound;
624-
if((specs && specs->field_unsigned)
625-
? asn_ulong2INTEGER(st, value)
626-
: asn_long2INTEGER(st, value))
627-
_ASN_DECODE_FAILED;
628633
return rval;
629634
}
630635
} else {
@@ -731,22 +736,14 @@ INTEGER_encode_uper(asn_TYPE_descriptor_t *td,
731736
}
732737

733738

734-
/* X.691, #12.2.2 */
739+
/* X.691-11/2008, #13.2.2, test if constrained whole number */
735740
if(ct && ct->range_bits >= 0) {
736-
/* #10.5.6 */
737-
ASN_DEBUG("Encoding integer with range %d bits",
738-
ct->range_bits);
739-
if(ct->range_bits == 32) {
740-
/* TODO: extend to >32 bits */
741-
long v = value - ct->lower_bound;
742-
if(per_put_few_bits(po, v >> 1, 31)
743-
|| per_put_few_bits(po, v, 1))
744-
_ASN_ENCODE_FAILED;
745-
} else {
746-
if(per_put_few_bits(po, value - ct->lower_bound,
747-
ct->range_bits))
748-
_ASN_ENCODE_FAILED;
749-
}
741+
/* #11.5.6 -> #11.3 */
742+
ASN_DEBUG("Encoding integer %ld (%lu) with range %d bits",
743+
value, value - ct->lower_bound, ct->range_bits);
744+
unsigned long v = value - ct->lower_bound;
745+
if(uper_put_constrained_whole_number_u(po, v, ct->range_bits))
746+
_ASN_ENCODE_FAILED;
750747
_ASN_ENCODED_OK(er);
751748
}
752749

src/asn1/generated/NULL.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ static enum xer_pbd_rval
7979
NULL__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size) {
8080
(void)td;
8181
(void)sptr;
82+
(void)chunk_buf; /* Going to be empty according to the rules below. */
8283

8384
/*
8485
* There must be no content in self-terminating <NULL/> tag.

src/asn1/generated/OCTET_STRING.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx,
201201
}
202202

203203
/* Restore parsing context */
204-
ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
204+
ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
205205

206206
switch(ctx->phase) {
207207
case 0:
@@ -1149,7 +1149,7 @@ OCTET_STRING__decode_xer(asn_codec_ctx_t *opt_codec_ctx,
11491149
}
11501150

11511151
/* Restore parsing context */
1152-
ctx = (asn_struct_ctx_t *)(((void *)*sptr) + specs->ctx_offset);
1152+
ctx = (asn_struct_ctx_t *)(((char *)*sptr) + specs->ctx_offset);
11531153

11541154
return xer_decode_general(opt_codec_ctx, ctx, *sptr, xml_tag,
11551155
buf_ptr, size, opt_unexpected_tag_decoder, body_receiver);
@@ -1722,7 +1722,7 @@ OCTET_STRING_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) {
17221722
? (asn_OCTET_STRING_specifics_t *)td->specifics
17231723
: &asn_DEF_OCTET_STRING_specs;
17241724
asn_struct_ctx_t *ctx = (asn_struct_ctx_t *)
1725-
((void *)st + specs->ctx_offset);
1725+
((char *)st + specs->ctx_offset);
17261726
struct _stack *stck;
17271727

17281728
if(!td || !st)

src/asn1/generated/REAL.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ static volatile double real_zero GCC_NOTUSED = 0.0;
2727
#define INFINITY (1.0/real_zero)
2828
#endif
2929

30+
#ifdef isfinite
31+
#define _asn_isfinite(d) isfinite(d) /* ISO C99 */
32+
#else
33+
#define _asn_isfinite(d) finite(d) /* Deprecated on Mac OS X 10.9 */
34+
#endif
35+
3036
/*
3137
* REAL basic type description.
3238
*/
@@ -94,7 +100,7 @@ REAL__dump(double d, int canonical, asn_app_consume_bytes_f *cb, void *app_key)
94100
buf = specialRealValue[SRV__NOT_A_NUMBER].string;
95101
buflen = specialRealValue[SRV__NOT_A_NUMBER].length;
96102
return (cb(buf, buflen, app_key) < 0) ? -1 : buflen;
97-
} else if(!finite(d)) {
103+
} else if(!_asn_isfinite(d)) {
98104
if(copysign(1.0, d) < 0.0) {
99105
buf = specialRealValue[SRV__MINUS_INFINITY].string;
100106
buflen = specialRealValue[SRV__MINUS_INFINITY].length;
@@ -464,7 +470,7 @@ asn_REAL2double(const REAL_t *st, double *dbl_value) {
464470
return -1;
465471
}
466472
if(used_malloc) FREEMEM(buf);
467-
if(finite(d)) {
473+
if(_asn_isfinite(d)) {
468474
*dbl_value = d;
469475
return 0;
470476
} else {
@@ -544,7 +550,7 @@ asn_REAL2double(const REAL_t *st, double *dbl_value) {
544550
m = ldexp(m, scaleF) * pow(pow(2, base), expval);
545551
*/
546552
m = ldexp(m, expval * baseF + scaleF);
547-
if(finite(m)) {
553+
if(_asn_isfinite(m)) {
548554
*dbl_value = sign ? -m : m;
549555
} else {
550556
errno = ERANGE;
@@ -605,7 +611,7 @@ asn_double2REAL(REAL_t *st, double dbl_value) {
605611
st->buf[0] = 0x42; /* NaN */
606612
st->buf[1] = 0;
607613
st->size = 1;
608-
} else if(!finite(dbl_value)) {
614+
} else if(!_asn_isfinite(dbl_value)) {
609615
if(copysign(1.0, dbl_value) < 0.0) {
610616
st->buf[0] = 0x41; /* MINUS-INFINITY */
611617
} else {

src/asn1/generated/constr_CHOICE.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#undef ADVANCE
3535
#define ADVANCE(num_bytes) do { \
3636
size_t num = num_bytes; \
37-
ptr = ((const void *)ptr) + num;\
37+
ptr = ((const char *)ptr) + num;\
3838
size -= num; \
3939
if(ctx->left >= 0) \
4040
ctx->left -= num; \
@@ -133,7 +133,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
133133
/*
134134
* Restore parsing context.
135135
*/
136-
ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
136+
ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
137137

138138
/*
139139
* Start to parse where left previously
@@ -211,7 +211,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
211211

212212
skip = ber_skip_length(opt_codec_ctx,
213213
BER_TLV_CONSTRUCTED(ptr),
214-
(const void *)ptr + tag_len,
214+
(const char *)ptr + tag_len,
215215
LEFT - tag_len);
216216

217217
switch(skip) {
@@ -244,7 +244,7 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
244244
*/
245245
if(elm->flags & ATF_POINTER) {
246246
/* Member is a pointer to another structure */
247-
memb_ptr2 = (void **)((void *)st + elm->memb_offset);
247+
memb_ptr2 = (void **)((char *)st + elm->memb_offset);
248248
} else {
249249
/*
250250
* A pointer to a pointer
@@ -390,7 +390,7 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr,
390390
*/
391391
elm = &td->elements[present-1];
392392
if(elm->flags & ATF_POINTER) {
393-
memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
393+
memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
394394
if(memb_ptr == 0) {
395395
if(elm->optional) {
396396
erval.encoded = 0;
@@ -400,7 +400,7 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr,
400400
_ASN_ENCODE_FAILED;
401401
}
402402
} else {
403-
memb_ptr = (void *)((void *)sptr + elm->memb_offset);
403+
memb_ptr = (void *)((char *)sptr + elm->memb_offset);
404404
}
405405

406406
/*
@@ -463,10 +463,10 @@ CHOICE_outmost_tag(asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber
463463

464464
if(elm->flags & ATF_POINTER) {
465465
memb_ptr = *(const void * const *)
466-
((const void *)ptr + elm->memb_offset);
466+
((const char *)ptr + elm->memb_offset);
467467
} else {
468468
memb_ptr = (const void *)
469-
((const void *)ptr + elm->memb_offset);
469+
((const char *)ptr + elm->memb_offset);
470470
}
471471

472472
return asn_TYPE_outmost_tag(elm->type, memb_ptr,
@@ -498,7 +498,7 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
498498
const void *memb_ptr;
499499

500500
if(elm->flags & ATF_POINTER) {
501-
memb_ptr = *(const void * const *)((const void *)sptr + elm->memb_offset);
501+
memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
502502
if(!memb_ptr) {
503503
if(elm->optional)
504504
return 0;
@@ -508,7 +508,7 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
508508
return -1;
509509
}
510510
} else {
511-
memb_ptr = (const void *)((const void *)sptr + elm->memb_offset);
511+
memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
512512
}
513513

514514
if(elm->memb_constraints) {
@@ -535,7 +535,7 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
535535
#undef XER_ADVANCE
536536
#define XER_ADVANCE(num_bytes) do { \
537537
size_t num = num_bytes; \
538-
buf_ptr = ((const void *)buf_ptr) + num;\
538+
buf_ptr = (const void *)(((const char *)buf_ptr) + num); \
539539
size -= num; \
540540
consumed_myself += num; \
541541
} while(0)
@@ -574,7 +574,7 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
574574
/*
575575
* Restore parsing context.
576576
*/
577-
ctx = (asn_struct_ctx_t *)((void *)st + specs->ctx_offset);
577+
ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset);
578578
if(ctx->phase == 0 && !*xml_tag)
579579
ctx->phase = 1; /* Skip the outer tag checking phase */
580580

@@ -605,7 +605,7 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
605605

606606
if(elm->flags & ATF_POINTER) {
607607
/* Member is a pointer to another structure */
608-
memb_ptr2 = (void **)((void *)st
608+
memb_ptr2 = (void **)((char *)st
609609
+ elm->memb_offset);
610610
} else {
611611
memb_ptr = (char *)st + elm->memb_offset;
@@ -797,10 +797,10 @@ CHOICE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr,
797797
unsigned int mlen = strlen(mname);
798798

799799
if(elm->flags & ATF_POINTER) {
800-
memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
800+
memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
801801
if(!memb_ptr) _ASN_ENCODE_FAILED;
802802
} else {
803-
memb_ptr = (void *)((void *)sptr + elm->memb_offset);
803+
memb_ptr = (void *)((char *)sptr + elm->memb_offset);
804804
}
805805

806806
er.encoded = 0;
@@ -884,7 +884,7 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
884884
elm = &td->elements[value];
885885
if(elm->flags & ATF_POINTER) {
886886
/* Member is a pointer to another structure */
887-
memb_ptr2 = (void **)((void *)st + elm->memb_offset);
887+
memb_ptr2 = (void **)((char *)st + elm->memb_offset);
888888
} else {
889889
memb_ptr = (char *)st + elm->memb_offset;
890890
memb_ptr2 = &memb_ptr;
@@ -962,7 +962,7 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td,
962962
elm = &td->elements[present];
963963
if(elm->flags & ATF_POINTER) {
964964
/* Member is a pointer to another structure */
965-
memb_ptr = *(void **)((void *)sptr + elm->memb_offset);
965+
memb_ptr = *(void **)((char *)sptr + elm->memb_offset);
966966
if(!memb_ptr) _ASN_ENCODE_FAILED;
967967
} else {
968968
memb_ptr = (char *)sptr + elm->memb_offset;
@@ -1010,10 +1010,10 @@ CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
10101010
const void *memb_ptr;
10111011

10121012
if(elm->flags & ATF_POINTER) {
1013-
memb_ptr = *(const void * const *)((const void *)sptr + elm->memb_offset);
1013+
memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset);
10141014
if(!memb_ptr) return (cb("<absent>", 8, app_key) < 0) ? -1 : 0;
10151015
} else {
1016-
memb_ptr = (const void *)((const void *)sptr + elm->memb_offset);
1016+
memb_ptr = (const void *)((const char *)sptr + elm->memb_offset);
10171017
}
10181018

10191019
/* Print member's name and stuff */
@@ -1053,11 +1053,11 @@ CHOICE_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) {
10531053
void *memb_ptr;
10541054

10551055
if(elm->flags & ATF_POINTER) {
1056-
memb_ptr = *(void **)((void *)ptr + elm->memb_offset);
1056+
memb_ptr = *(void **)((char *)ptr + elm->memb_offset);
10571057
if(memb_ptr)
10581058
ASN_STRUCT_FREE(*elm->type, memb_ptr);
10591059
} else {
1060-
memb_ptr = (void *)((void *)ptr + elm->memb_offset);
1060+
memb_ptr = (void *)((char *)ptr + elm->memb_offset);
10611061
ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr);
10621062
}
10631063
}
@@ -1082,7 +1082,7 @@ _fetch_present_idx(const void *struct_ptr, int pres_offset, int pres_size) {
10821082
const void *present_ptr;
10831083
int present;
10841084

1085-
present_ptr = ((const void *)struct_ptr) + pres_offset;
1085+
present_ptr = ((const char *)struct_ptr) + pres_offset;
10861086

10871087
switch(pres_size) {
10881088
case sizeof(int): present = *(const int *)present_ptr; break;
@@ -1100,7 +1100,7 @@ _fetch_present_idx(const void *struct_ptr, int pres_offset, int pres_size) {
11001100
static void
11011101
_set_present_idx(void *struct_ptr, int pres_offset, int pres_size, int present) {
11021102
void *present_ptr;
1103-
present_ptr = ((void *)struct_ptr) + pres_offset;
1103+
present_ptr = ((char *)struct_ptr) + pres_offset;
11041104

11051105
switch(pres_size) {
11061106
case sizeof(int): *(int *)present_ptr = present; break;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy