aboutsummaryrefslogtreecommitdiffstats
path: root/epan/oids.c
diff options
context:
space:
mode:
authorEvan Huus <eapache@gmail.com>2013-10-10 16:18:49 +0000
committerEvan Huus <eapache@gmail.com>2013-10-10 16:18:49 +0000
commita50dee3286db96e5749e21bba6f9b4bab3fb6dfc (patch)
treee54c24449cd5d5269bc435678e22a19309d5b61c /epan/oids.c
parent1370003beeecb819de990e215d65c02a8d7c3d92 (diff)
From Ed Beroset via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9246
Fix memory leaks and bad memory accesses in c1222 dissector. From me: use realloc in a handoff function since it may get called multiple times, and we only need the latest. svn path=/trunk/; revision=52497
Diffstat (limited to 'epan/oids.c')
-rw-r--r--epan/oids.c22
1 files changed, 7 insertions, 15 deletions
diff --git a/epan/oids.c b/epan/oids.c
index a93b950e4d..f232d93c20 100644
--- a/epan/oids.c
+++ b/epan/oids.c
@@ -1044,15 +1044,13 @@ guint oid_subid2encoded(guint subids_len, guint32* subids, guint8** bytes_p) {
guint32 subid;
guint8* b;
- if ( !subids || subids_len <= 0) {
+ if ( !subids || subids_len <= 1) {
*bytes_p = NULL;
return 0;
}
- subid = (subids[0] * 40) + subids[1];
- i = 2;
-
- do {
+ for (subid=subids[0] * 40, i = 1; i<subids_len; i++, subid=0) {
+ subid += subids[i];
if (subid <= 0x0000007F) {
bytelen += 1;
} else if (subid <= 0x00003FFF ) {
@@ -1064,18 +1062,14 @@ guint oid_subid2encoded(guint subids_len, guint32* subids, guint8** bytes_p) {
} else {
bytelen += 5;
}
-
- subid = subids[i];
- } while ( i++ < subids_len );
+ }
*bytes_p = b = (guint8 *)ep_alloc(bytelen);
- subid = (subids[0] * 40) + subids[1];
- i = 2;
-
- do {
+ for (subid=subids[0] * 40, i = 1; i<subids_len; i++, subid=0) {
guint len;
+ subid += subids[i];
if ((subid <= 0x0000007F )) len = 1;
else if ((subid <= 0x00003FFF )) len = 2;
else if ((subid <= 0x001FFFFF )) len = 3;
@@ -1090,9 +1084,7 @@ guint oid_subid2encoded(guint subids_len, guint32* subids, guint8** bytes_p) {
case 2: *(b++) = ((subid & 0x00003F80) >> 7) | 0x80;
case 1: *(b++) = subid & 0x0000007F ; break;
}
-
- subid = subids[i];
- } while ( i++ < subids_len);
+ }
return bytelen;
}