Commit b7a202e5 authored by Lev Walkin's avatar Lev Walkin

check length size in default BMPString and UniversalString constraints

parent 86526e3f
...@@ -27,7 +27,7 @@ asn_TYPE_operation_t asn_OP_BMPString = { ...@@ -27,7 +27,7 @@ asn_TYPE_operation_t asn_OP_BMPString = {
OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ OCTET_STRING_free, /* Implemented in terms of OCTET STRING */
BMPString_print, BMPString_print,
OCTET_STRING_compare, OCTET_STRING_compare,
asn_generic_no_constraint, /* No constraint by default */ BMPString_constraint,
OCTET_STRING_decode_ber, OCTET_STRING_decode_ber,
OCTET_STRING_encode_der, OCTET_STRING_encode_der,
BMPString_decode_xer, /* Convert from UTF-8 */ BMPString_decode_xer, /* Convert from UTF-8 */
...@@ -52,7 +52,7 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = { ...@@ -52,7 +52,7 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = {
"BMPString", "BMPString",
"BMPString", "BMPString",
&asn_OP_BMPString, &asn_OP_BMPString,
asn_generic_no_constraint, /* No constraint by default */ BMPString_constraint,
asn_DEF_BMPString_tags, asn_DEF_BMPString_tags,
sizeof(asn_DEF_BMPString_tags) sizeof(asn_DEF_BMPString_tags)
/ sizeof(asn_DEF_BMPString_tags[0]) - 1, / sizeof(asn_DEF_BMPString_tags[0]) - 1,
...@@ -65,6 +65,28 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = { ...@@ -65,6 +65,28 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = {
&asn_SPC_BMPString_specs &asn_SPC_BMPString_specs
}; };
int
BMPString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
asn_app_constraint_failed_f *ctfailcb,
void *app_key) {
const BMPString_t *st = (const BMPString_t *)sptr;
if(st && st->buf) {
if(st->size & 1) {
ASN__CTFAIL(app_key, td, sptr,
"%s: invalid size %zu not divisible by 2 (%s:%d)",
td->name, st->size, __FILE__, __LINE__);
return -1;
}
} else {
ASN__CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name,
__FILE__, __LINE__);
return -1;
}
return 0;
}
/* /*
* BMPString specific contents printer. * BMPString specific contents printer.
*/ */
......
...@@ -18,6 +18,7 @@ extern asn_TYPE_operation_t asn_OP_BMPString; ...@@ -18,6 +18,7 @@ extern asn_TYPE_operation_t asn_OP_BMPString;
extern asn_OCTET_STRING_specifics_t asn_SPC_BMPString_specs; extern asn_OCTET_STRING_specifics_t asn_SPC_BMPString_specs;
asn_struct_print_f BMPString_print; /* Human-readable output */ asn_struct_print_f BMPString_print; /* Human-readable output */
asn_constr_check_f BMPString_constraint;
xer_type_decoder_f BMPString_decode_xer; xer_type_decoder_f BMPString_decode_xer;
xer_type_encoder_f BMPString_encode_xer; xer_type_encoder_f BMPString_encode_xer;
......
...@@ -27,7 +27,7 @@ asn_TYPE_operation_t asn_OP_UniversalString = { ...@@ -27,7 +27,7 @@ asn_TYPE_operation_t asn_OP_UniversalString = {
OCTET_STRING_free, OCTET_STRING_free,
UniversalString_print, /* Convert into UTF8 and print */ UniversalString_print, /* Convert into UTF8 and print */
OCTET_STRING_compare, OCTET_STRING_compare,
asn_generic_no_constraint, UniversalString_constraint,
OCTET_STRING_decode_ber, OCTET_STRING_decode_ber,
OCTET_STRING_encode_der, OCTET_STRING_encode_der,
UniversalString_decode_xer, /* Convert from UTF-8 */ UniversalString_decode_xer, /* Convert from UTF-8 */
...@@ -52,7 +52,7 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = { ...@@ -52,7 +52,7 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = {
"UniversalString", "UniversalString",
"UniversalString", "UniversalString",
&asn_OP_UniversalString, &asn_OP_UniversalString,
asn_generic_no_constraint, UniversalString_constraint,
asn_DEF_UniversalString_tags, asn_DEF_UniversalString_tags,
sizeof(asn_DEF_UniversalString_tags) sizeof(asn_DEF_UniversalString_tags)
/ sizeof(asn_DEF_UniversalString_tags[0]) - 1, / sizeof(asn_DEF_UniversalString_tags[0]) - 1,
...@@ -65,6 +65,27 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = { ...@@ -65,6 +65,27 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = {
&asn_SPC_UniversalString_specs &asn_SPC_UniversalString_specs
}; };
int
UniversalString_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
asn_app_constraint_failed_f *ctfailcb,
void *app_key) {
const UniversalString_t *st = (const UniversalString_t *)sptr;
if(st && st->buf) {
if(st->size & 3) {
ASN__CTFAIL(app_key, td, sptr,
"%s: invalid size %zu not divisible by 4 (%s:%d)",
td->name, st->size, __FILE__, __LINE__);
return -1;
}
} else {
ASN__CTFAIL(app_key, td, sptr, "%s: value not given (%s:%d)", td->name,
__FILE__, __LINE__);
return -1;
}
return 0;
}
static ssize_t static ssize_t
UniversalString__dump(const UniversalString_t *st, UniversalString__dump(const UniversalString_t *st,
......
...@@ -18,6 +18,7 @@ extern asn_TYPE_operation_t asn_OP_UniversalString; ...@@ -18,6 +18,7 @@ extern asn_TYPE_operation_t asn_OP_UniversalString;
extern asn_OCTET_STRING_specifics_t asn_SPC_UniversalString_specs; extern asn_OCTET_STRING_specifics_t asn_SPC_UniversalString_specs;
asn_struct_print_f UniversalString_print; /* Human-readable output */ asn_struct_print_f UniversalString_print; /* Human-readable output */
asn_constr_check_f UniversalString_constraint;
xer_type_decoder_f UniversalString_decode_xer; xer_type_decoder_f UniversalString_decode_xer;
xer_type_encoder_f UniversalString_encode_xer; xer_type_encoder_f UniversalString_encode_xer;
......
...@@ -9,13 +9,21 @@ static void ...@@ -9,13 +9,21 @@ static void
check_encode_failed(asn_TYPE_descriptor_t *td, const char *buf, size_t buflen) { check_encode_failed(asn_TYPE_descriptor_t *td, const char *buf, size_t buflen) {
uint8_t uper_output_buffer[32]; uint8_t uper_output_buffer[32];
UniversalString_t *st_in; UniversalString_t *st_in;
char error_buf[128];
size_t error_buf_len = sizeof(error_buf);
st_in = OCTET_STRING_new_fromBuf(td, buf, buflen); st_in = OCTET_STRING_new_fromBuf(td, buf, buflen);
assert(st_in); assert(st_in);
assert(st_in->size == buflen); assert(st_in->size == buflen);
asn_enc_rval_t enc =
uper_encode_to_buffer(&asn_DEF_UniversalString, st_in, /* First signal that something is wrong with the length */
uper_output_buffer, sizeof(uper_output_buffer)); int st_in_ct = asn_check_constraints(td, st_in, error_buf, &error_buf_len);
assert(st_in_ct != 0);
fprintf(stderr, "%s\n", error_buf);
/* Second signal that something is wrong with the length */
asn_enc_rval_t enc = uper_encode_to_buffer(td, st_in, uper_output_buffer,
sizeof(uper_output_buffer));
assert(enc.encoded == -1); assert(enc.encoded == -1);
ASN_STRUCT_FREE(*td, st_in); ASN_STRUCT_FREE(*td, st_in);
...@@ -31,14 +39,18 @@ check_round_trip_OK(asn_TYPE_descriptor_t *td, const char *buf, size_t buflen) { ...@@ -31,14 +39,18 @@ check_round_trip_OK(asn_TYPE_descriptor_t *td, const char *buf, size_t buflen) {
assert(st_in); assert(st_in);
assert(st_in->size == buflen); assert(st_in->size == buflen);
int st_in_ct = asn_check_constraints(td, st_in, NULL, NULL);
assert(st_in_ct == 0);
asn_enc_rval_t enc = asn_enc_rval_t enc =
uper_encode_to_buffer(&asn_DEF_UniversalString, st_in, uper_encode_to_buffer(td, st_in,
uper_output_buffer, sizeof(uper_output_buffer)); uper_output_buffer, sizeof(uper_output_buffer));
assert(enc.encoded > 0); assert(enc.encoded > 0);
asn_dec_rval_t dec = asn_dec_rval_t dec =
uper_decode(0, &asn_DEF_UniversalString, (void **)&st_out, uper_decode(0, &asn_DEF_UniversalString, (void **)&st_out,
uper_output_buffer, (enc.encoded + 7) / 8, 0, 0); uper_output_buffer, (enc.encoded + 7) / 8, 0, 0);
int st_out_ct = asn_check_constraints(td, st_out, NULL, NULL);
assert(st_out_ct == 0);
assert(dec.consumed == enc.encoded); assert(dec.consumed == enc.encoded);
assert(st_in->size == st_out->size); assert(st_in->size == st_out->size);
assert(memcmp(st_in->buf, st_out->buf, st_in->size) == 0); assert(memcmp(st_in->buf, st_out->buf, st_in->size) == 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment