aboutsummaryrefslogtreecommitdiffstats
path: root/skeletons/ber_tlv_length.c
diff options
context:
space:
mode:
authorvlm <vlm@59561ff5-6e30-0410-9f3c-9617f08c8826>2004-09-29 14:19:14 +0000
committervlm <vlm@59561ff5-6e30-0410-9f3c-9617f08c8826>2004-09-29 14:19:14 +0000
commit6130a2f2f0f713e36324970ea99157a79c95aa99 (patch)
tree2051c94ffc15821d013b6c9092fc20739c337311 /skeletons/ber_tlv_length.c
parent4a168ae4b6eceb78321f0bccfcfb6017b26abea9 (diff)
added stack checking into ber_skip_length also
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@451 59561ff5-6e30-0410-9f3c-9617f08c8826
Diffstat (limited to 'skeletons/ber_tlv_length.c')
-rw-r--r--skeletons/ber_tlv_length.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/skeletons/ber_tlv_length.c b/skeletons/ber_tlv_length.c
index a0ec1e5d..10a9e1c3 100644
--- a/skeletons/ber_tlv_length.c
+++ b/skeletons/ber_tlv_length.c
@@ -74,13 +74,29 @@ ber_fetch_length(int _is_constructed, void *bufptr, size_t size,
}
ssize_t
-ber_skip_length(int _is_constructed, void *ptr, size_t size) {
+ber_skip_length(asn_codec_ctx_t *opt_codec_ctx,
+ int _is_constructed, void *ptr, size_t size) {
ber_tlv_len_t vlen; /* Length of V in TLV */
ssize_t tl; /* Length of L in TLV */
ssize_t ll; /* Length of L in TLV */
size_t skip;
/*
+ * Make sure we didn't exceed the maximum stack size.
+ */
+ if(opt_codec_ctx && opt_codec_ctx->max_stack_size) {
+ ptrdiff_t usedstack = ((char *)opt_codec_ctx - (char *)&size);
+ /* double negative is required to avoid int wrap-around */
+ if(usedstack > 0) usedstack = -usedstack;
+ ASN_DEBUG("Current stack size %ld", -(long)usedstack);
+ if(usedstack < -(ptrdiff_t)opt_codec_ctx->max_stack_size) {
+ ASN_DEBUG("Stack limit %ld reached",
+ (long)opt_codec_ctx->max_stack_size);
+ return -1;
+ }
+ }
+
+ /*
* Determine the size of L in TLV.
*/
ll = ber_fetch_length(_is_constructed, ptr, size, &vlen);
@@ -107,7 +123,8 @@ ber_skip_length(int _is_constructed, void *ptr, size_t size) {
tl = ber_fetch_tag(ptr, size, &tag);
if(tl <= 0) return tl;
- ll = ber_skip_length(BER_TLV_CONSTRUCTED(ptr),
+ ll = ber_skip_length(opt_codec_ctx,
+ BER_TLV_CONSTRUCTED(ptr),
((char *)ptr) + tl, size - tl);
if(ll <= 0) return ll;