BMPString and UniversalString fuzz testing
diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c
index 942fc6b..e618609 100644
--- a/skeletons/OCTET_STRING.c
+++ b/skeletons/OCTET_STRING.c
@@ -1313,28 +1313,32 @@
return per_put_many_bits(po, buf, unit_bits * units);
}
- for(ub -= lb; buf < end; buf += bpc) {
- int ch;
- uint32_t value;
- switch(bpc) {
- case 1: value = *(const uint8_t *)buf; break;
- case 2: value = (buf[0] << 8) | buf[1]; break;
- case 4: value = (buf[0] << 24) | (buf[1] << 16)
- | (buf[2] << 8) | buf[3]; break;
- default: return -1;
- }
- ch = value - lb;
- if(ch < 0 || ch > ub) {
- ASN_DEBUG("Character %d (0x%02x)"
- " is out of range (%ld..%ld)",
- *buf, *buf, lb, ub + lb);
- return -1;
- }
- if(per_put_few_bits(po, ch, unit_bits))
- return -1;
- }
+ for(ub -= lb; buf < end; buf += bpc) {
+ int ch;
+ uint32_t value;
+ switch(bpc) {
+ case 1:
+ value = *(const uint8_t *)buf;
+ break;
+ case 2:
+ value = (buf[0] << 8) | buf[1];
+ break;
+ case 4:
+ value = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
+ break;
+ default:
+ return -1;
+ }
+ ch = value - lb;
+ if(ch < 0 || ch > ub) {
+ ASN_DEBUG("Character %d (0x%02x) is out of range (%ld..%ld)", *buf,
+ value, lb, ub + lb);
+ return -1;
+ }
+ if(per_put_few_bits(po, ch, unit_bits)) return -1;
+ }
- return 0;
+ return 0;
}
static asn_per_constraints_t asn_DEF_OCTET_STRING_constraints = {
@@ -1998,13 +2002,19 @@
break;
case 2:
for(b = buf; b < bend; b += unit_bytes) {
- *(uint16_t *)b = OCTET_STRING__random_char(clb, cub);
+ uint32_t code = OCTET_STRING__random_char(clb, cub);
+ b[0] = code >> 8;
+ b[1] = code;
}
*(uint16_t *)b = 0;
break;
case 4:
for(b = buf; b < bend; b += unit_bytes) {
- *(uint32_t *)b = OCTET_STRING__random_char(clb, cub);
+ uint32_t code = OCTET_STRING__random_char(clb, cub);
+ b[0] = code >> 24;
+ b[1] = code >> 16;
+ b[2] = code >> 8;
+ b[3] = code;
}
*(uint32_t *)b = 0;
break;
diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c
index 8d99cad..67fb6a1 100644
--- a/skeletons/UniversalString.c
+++ b/skeletons/UniversalString.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
+ * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
* Redistribution and modifications are permitted subject to BSD license.
*/
#include <asn_internal.h>
@@ -236,3 +236,36 @@
return 0;
}
+/*
+ * Biased function for randomizing UCS-4 sequences.
+ */
+static size_t
+UniversalString__random_char(uint8_t *b) {
+ uint32_t code;
+
+ switch(asn_random_between(0, 4)) {
+ case 0:
+ code = 0;
+ break;
+ case 1:
+ code = 1;
+ break;
+ case 2:
+ code = 0xd7ff; /* End of pre-surrogate block */
+ break;
+ case 3:
+ code = 0xe000; /* Beginning of post-surrogate block */
+ break;
+ case 4:
+ code = 0x10ffff;
+ break;
+ }
+
+ b[0] = code >> 24;
+ b[1] = code >> 16;
+ b[2] = code >> 8;
+ b[3] = code;
+
+ return 4;
+}
+