Skip to content

Commit 83c3166

Browse files
committed
Fix issue 293 by handling default value with type ATV_BITVECTOR
1. Modify asn1p_y.c and asn1p_y.y to fix an error that function _convert_bitstring2binary() always return NULL. 2. Add handling for default value with type ATV_BITVECTOR in function try_inline_default().
1 parent 4cc779f commit 83c3166

File tree

3 files changed

+45
-11
lines changed

3 files changed

+45
-11
lines changed

libasn1compiler/asn1c_C.c

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2321,11 +2321,26 @@ emit_default_string_value(arg_t *arg, asn1p_value_t *v) {
23212321
uint8_t *e = v->value.string.size + b;
23222322
OUT("{ ");
23232323
for(;b < e; b++)
2324-
OUT("0x%02x, ", *b);
2324+
OUT("0x%02X, ", *b);
23252325
OUT("0 };\n");
23262326
}
23272327
}
23282328

2329+
static void
2330+
emit_default_bitstring_value(arg_t *arg, asn1p_value_t *v) {
2331+
2332+
OUT("static const uint8_t defv[] = { ");
2333+
assert(v->type == ATV_BITVECTOR);
2334+
2335+
uint8_t *b = v->value.binary_vector.bits;
2336+
for (int i = 0; i < (v->value.binary_vector.size_in_bits + 7)/8; i++, b++) {
2337+
OUT("0x%02X", *b);
2338+
if(i < (v->value.binary_vector.size_in_bits + 7)/8 - 1)
2339+
OUT(", ");
2340+
}
2341+
OUT(" };\n");
2342+
}
2343+
23292344
static int
23302345
try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
23312346
int save_target = arg->target->target;
@@ -2421,9 +2436,9 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
24212436
//expr->marker.flags &= ~EM_INDIRECT;
24222437
return 0;
24232438
default:
2424-
if(etype & ASN_STRING_KM_MASK) {
2425-
if(expr->marker.default_value == NULL
2426-
|| expr->marker.default_value->type != ATV_STRING)
2439+
if(expr->marker.default_value) {
2440+
if((expr->marker.default_value->type != ATV_STRING) &&
2441+
(expr->marker.default_value->type != ATV_BITVECTOR))
24272442
break;
24282443
if(!out) {
24292444
if(C99_MODE) OUT(".default_value_cmp = ");
@@ -2441,15 +2456,23 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
24412456
OUT("static int asn_DFL_%d_cmp(const void *sptr) {\n",
24422457
expr->_type_unique_index);
24432458
INDENT(+1);
2444-
emit_default_string_value(arg, expr->marker.default_value);
2459+
if(expr->marker.default_value->type == ATV_STRING)
2460+
emit_default_string_value(arg, expr->marker.default_value);
2461+
else
2462+
emit_default_bitstring_value(arg, expr->marker.default_value);
24452463
OUT("const %s *st = sptr;\n", asn1c_type_name(arg, expr, TNF_CTYPE));
24462464
OUT("\n");
24472465
OUT("if(!st) {\n");
24482466
OUT("\treturn -1; /* No value is not a default value */\n");
24492467
OUT("}\n");
24502468
OUT("\n");
2451-
OUT("if(st->size == (sizeof(defv) - 1)\n");
2452-
OUT("&& memcmp(st->buf, &defv, sizeof(defv) - 1) == 0)\n");
2469+
if(expr->marker.default_value->type == ATV_STRING) {
2470+
OUT("if(st->size == (sizeof(defv) - 1)\n");
2471+
OUT("&& memcmp(st->buf, &defv, sizeof(defv) - 1) == 0)\n");
2472+
} else {
2473+
OUT("if(st->size == (sizeof(defv))\n");
2474+
OUT("&& memcmp(st->buf, &defv, sizeof(defv)) == 0)\n");
2475+
}
24532476
OUT("\treturn 0;\n");
24542477
OUT("return 1;\n");
24552478
INDENT(-1);
@@ -2458,7 +2481,10 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
24582481
OUT("static int asn_DFL_%d_set(void **sptr) {\n",
24592482
expr->_type_unique_index);
24602483
INDENT(+1);
2461-
emit_default_string_value(arg, expr->marker.default_value);
2484+
if(expr->marker.default_value->type == ATV_STRING)
2485+
emit_default_string_value(arg, expr->marker.default_value);
2486+
else
2487+
emit_default_bitstring_value(arg, expr->marker.default_value);
24622488
OUT("%s *st = *sptr;\n", asn1c_type_name(arg, expr, TNF_CTYPE));
24632489
OUT("uint8_t *nstr = MALLOC(sizeof(defv));\n");
24642490
OUT("\n");
@@ -2472,7 +2498,13 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
24722498
OUT("\tif(!st) { FREEMEM(nstr); return -1; }\n");
24732499
OUT("}\n");
24742500
OUT("st->buf = nstr;\n");
2475-
OUT("st->size = sizeof(defv) - 1;\n");
2501+
if(expr->marker.default_value->type == ATV_STRING) {
2502+
OUT("st->size = sizeof(defv) - 1;\n");
2503+
} else {
2504+
OUT("st->size = sizeof(defv);\n");
2505+
if(etype == ASN_BASIC_BIT_STRING)
2506+
OUT("st->bits_unused = %d;\n", (8 - expr->marker.default_value->value.binary_vector.size_in_bits % 8) % 8);
2507+
}
24762508
OUT("\n");
24772509
OUT("return 0;\n");
24782510
INDENT(-1);

libasn1parser/asn1p_y.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5208,9 +5208,10 @@ _convert_bitstring2binary(char *str, int base) {
52085208
memlen = slen / (8 / baselen); /* Conservative estimate */
52095209

52105210
bv_ptr = binary_vector = malloc(memlen + 1);
5211-
if(bv_ptr == NULL)
5211+
if(bv_ptr == NULL) {
52125212
/* ENOMEM */
52135213
return NULL;
5214+
}
52145215

52155216
cur_val = 0;
52165217
bits = 0;

libasn1parser/asn1p_y.y

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2524,9 +2524,10 @@ _convert_bitstring2binary(char *str, int base) {
25242524
memlen = slen / (8 / baselen); /* Conservative estimate */
25252525

25262526
bv_ptr = binary_vector = malloc(memlen + 1);
2527-
if(bv_ptr == NULL)
2527+
if(bv_ptr == NULL) {
25282528
/* ENOMEM */
25292529
return NULL;
2530+
}
25302531

25312532
cur_val = 0;
25322533
bits = 0;

0 commit comments

Comments
 (0)