aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-ber.c
diff options
context:
space:
mode:
authormorriss <morriss@f5534014-38df-0310-8fa8-9805f1628bb7>2010-07-07 22:00:44 +0000
committermorriss <morriss@f5534014-38df-0310-8fa8-9805f1628bb7>2010-07-07 22:00:44 +0000
commit3599398c12d768a5f48e2bac7f481adf5781302b (patch)
tree4c31d8557f27e33e6ddc8a74c19caa40f088923b /epan/dissectors/packet-ber.c
parent072a8c3bb02bfa08e13cdf41a9811322aefc7a20 (diff)
For: https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=4984#c4 : In try_get_ber_length() don't let a negative length make us go backwards. This should eliminate a possible infinite loop and appears to /help/ limit the depth of recursion.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@33471 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-ber.c')
-rw-r--r--epan/dissectors/packet-ber.c35
1 files changed, 20 insertions, 15 deletions
diff --git a/epan/dissectors/packet-ber.c b/epan/dissectors/packet-ber.c
index 11c236ab6a..1dabbb9507 100644
--- a/epan/dissectors/packet-ber.c
+++ b/epan/dissectors/packet-ber.c
@@ -978,26 +978,31 @@ try_get_ber_length(tvbuff_t *tvb, int *bl_offset, gboolean pc, guint32 *length,
tmp_length = (tmp_length<<8) + oct;
}
} else {
- /* 8.1.3.6 */
- /* indefinite length encoded - must be constructed */
+ /* 8.1.3.6 */
+ /* indefinite length encoded - must be constructed */
- if(!pc)
- return FALSE;
+ if(!pc)
+ return FALSE;
- tmp_offset = offset;
+ tmp_offset = offset;
- do {
- tmp_offset = get_ber_identifier(tvb, tmp_offset, &tclass, &tpc, &ttag);
- /* Make sure we move forward */
- if(tmp_offset > offset && try_get_ber_length(tvb, &tmp_offset, tpc, &tmp_len, &tmp_ind))
- tmp_offset += tmp_len;
- else
- return FALSE;
+ do {
+ tmp_offset = get_ber_identifier(tvb, tmp_offset, &tclass, &tpc, &ttag);
+
+ /* Make sure we move forward */
+ if(tmp_offset > offset && try_get_ber_length(tvb, &tmp_offset, tpc, &tmp_len, &tmp_ind)) {
+ if (tmp_len > 0) {
+ tmp_offset += tmp_len;
+ continue;
+ }
+ }
+
+ return FALSE;
- } while (!((tclass == BER_CLASS_UNI) && (ttag == 0) && (tmp_len == 0)));
+ } while (!((tclass == BER_CLASS_UNI) && (ttag == 0) && (tmp_len == 0)));
- tmp_length = tmp_offset - offset;
- tmp_ind = TRUE;
+ tmp_length = tmp_offset - offset;
+ tmp_ind = TRUE;
}
}