diff options
author | Evan Huus <eapache@gmail.com> | 2013-10-10 16:18:49 +0000 |
---|---|---|
committer | Evan Huus <eapache@gmail.com> | 2013-10-10 16:18:49 +0000 |
commit | a50dee3286db96e5749e21bba6f9b4bab3fb6dfc (patch) | |
tree | e54c24449cd5d5269bc435678e22a19309d5b61c /epan/oids.c | |
parent | 1370003beeecb819de990e215d65c02a8d7c3d92 (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.c | 22 |
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; } |