aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap/nettrace_3gpp_32_423.c
diff options
context:
space:
mode:
authorlemur117 <lemur117@protonmail.com>2023-09-29 05:57:28 +0000
committerAndersBroman <a.broman58@gmail.com>2023-09-29 05:57:28 +0000
commitab99d061ef933eeec204d189b658ad2965f69337 (patch)
tree4a579ddaaaa44be5886cfb5f1fa5ec395d475881 /wiretap/nettrace_3gpp_32_423.c
parent5b5042b1eecc1fa525f11d4d01146b352df7a552 (diff)
Fixed memory leak of match_info, made regex easier to read
Diffstat (limited to 'wiretap/nettrace_3gpp_32_423.c')
-rw-r--r--wiretap/nettrace_3gpp_32_423.c77
1 files changed, 39 insertions, 38 deletions
diff --git a/wiretap/nettrace_3gpp_32_423.c b/wiretap/nettrace_3gpp_32_423.c
index 337379249c..b200356b59 100644
--- a/wiretap/nettrace_3gpp_32_423.c
+++ b/wiretap/nettrace_3gpp_32_423.c
@@ -50,7 +50,7 @@ static const guchar c_e_msg[] = "</msg>";
static const guchar c_s_rawmsg[] = "<rawMsg";
static const guchar c_change_time[] = "changeTime=\"";
static const guchar c_proto_name[] = "name=\"";
-static const guchar c_address[] = "ddress"; /* omit the 'a' to cater for "Address" */
+//static const guchar c_address[] = "ddress"; /* omit the 'a' to cater for "Address" */
static const guchar c_s_initiator[] = "<initiator";
static const guchar c_e_initiator[] = "</initiator>";
static const guchar c_s_target[] = "<target";
@@ -125,25 +125,13 @@ nettrace_parse_address(char* curr_pos, char* next_pos, gboolean is_src_addr, exp
char ip_addr_str[WS_INET6_ADDRSTRLEN];
ws_in6_addr ip6_addr;
guint32 ip4_addr;
- char *ptr; //for strtol function
+ char *err; //for strtol function
- static GRegex* aregex = NULL; //For IPv4 or IPv6 address
- static GRegex* pregex = NULL; //For Port
- static GRegex* tregex = NULL; //For Transport
-
- if (aregex == NULL)
- //First time will compile regex
- aregex = g_regex_new ("^.*address\\s*=*\\s*\\[?((?:\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|(?:[0-9a-f:]{,39}))", G_REGEX_CASELESS | G_REGEX_FIRSTLINE, 0, NULL);
-
- if (pregex == NULL)
- //First time will compile regex
- pregex = g_regex_new ("^.*port\\s*=*\\s*(\\d{1,5})", G_REGEX_CASELESS | G_REGEX_FIRSTLINE, 0, NULL);
-
- if (tregex == NULL)
- //First time will compile regex
- tregex = g_regex_new ("^.*transport\\s*=*\\s*(\\w{3,4})", G_REGEX_CASELESS | G_REGEX_FIRSTLINE, 0, NULL);
-
- /* curr_pos pointing to first char of address */
+ GMatchInfo *match_info;
+ static GRegex *regex = NULL;
+ char *matched_ipaddress = NULL;
+ char *matched_port = NULL;
+ char *matched_transport = NULL;
/* Excample from one trace, unsure if it's generic...
* {address == 192.168.73.1, port == 5062, transport == Udp}
@@ -152,28 +140,41 @@ nettrace_parse_address(char* curr_pos, char* next_pos, gboolean is_src_addr, exp
* Address=198.142.204.199,Port=2123
*/
- char **addressMatches = g_regex_split(aregex, curr_pos, 0);
- char **portMatches = g_regex_split(pregex, curr_pos, 0);
- char **transportMatches = g_regex_split(tregex, curr_pos, 0);
+ if (regex == NULL) {
+ regex = g_regex_new (
+ "^.*address\\s*=*\\s*" //curr_pos will begin with address
+ "\\[?(?P<ipaddress>(?:" //store ipv4 or ipv6 address in named group "ipaddress"
+ "(?:\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})" //match an IPv4 address
+ "|" // or
+ "(?:[0-9a-f:]*)))\\]?" //match an IPv6 address.
+ "(?:.*port\\s*=*\\s*(?P<port>\\d{1,5}))?" //match a port store it in named group "port"
+ "(?:.*transport\\s*=*\\s*(?P<transport>\\w+))?", //match a transport store it in named group "transport"
+ G_REGEX_CASELESS | G_REGEX_FIRSTLINE, 0, NULL);
+ }
+ /* curr_pos pointing to first char of "address" */
- if (addressMatches[1] != NULL && addressMatches[2] != NULL) {
- (void) g_strlcpy(ip_addr_str, addressMatches[1], strlen(addressMatches[1])+1);
- }
- if (portMatches[1] != NULL && portMatches[2] != NULL) {
- port = (guint) strtol(portMatches[1], &ptr, 10);
- }
- if (transportMatches[1] != NULL && transportMatches[2] != NULL) {
- (void) g_strlcpy(transp_str, transportMatches[1], strlen(transportMatches[1])+1);
+ g_regex_match (regex, curr_pos, 0, &match_info);
+
+ if (g_match_info_matches (match_info)) {
+ matched_ipaddress = g_match_info_fetch_named(match_info, "ipaddress"); //will be empty string if no ipv4 or ipv6
+ matched_port = g_match_info_fetch_named(match_info, "port"); //will be empty string if port not in trace
+ matched_transport = g_match_info_fetch_named(match_info, "transport"); //will be empty string if transport not in trace
+ } else {
+ return next_pos;
}
- g_free(addressMatches);
- g_free(portMatches);
- g_free(transportMatches);
+ g_match_info_free(match_info);
- g_regex_unref(aregex);
- g_regex_unref(pregex);
- g_regex_unref(tregex);
+ if (matched_ipaddress != NULL && strlen(matched_ipaddress)) {
+ (void) g_strlcpy(ip_addr_str, matched_ipaddress, strlen(matched_ipaddress)+1);
+ }
+ if (matched_port != NULL && strlen(matched_port)) {
+ port = (guint) strtol(matched_port, &err, 10);
+ }
+ if (matched_transport != NULL && strlen(matched_transport)) {
+ (void) g_strlcpy(transp_str, matched_transport, strlen(matched_transport)+1);
+ }
if (ws_inet_pton6(ip_addr_str, &ip6_addr)) {
if (is_src_addr) {
@@ -348,7 +349,7 @@ nettrace_msg_to_packet(nettrace_3gpp_32_423_file_info_t *file_info, wtap_rec *re
curr_pos += CLEN(c_s_initiator);
next_pos = STRNSTR(curr_pos, c_e_initiator);
/* Find address */
- curr_pos = STRNSTR(curr_pos, c_address) - 1;
+ //curr_pos = STRNSTR(curr_pos, c_address) - 1; //Not needed due to regex
if (curr_pos != NULL) {
nettrace_parse_address(curr_pos, next_pos, TRUE/* SRC */, &exported_pdu_info);
}
@@ -363,7 +364,7 @@ nettrace_msg_to_packet(nettrace_3gpp_32_423_file_info_t *file_info, wtap_rec *re
curr_pos += CLEN(c_s_target);
next_pos = STRNSTR(curr_pos, c_e_target);
/* Find address */
- curr_pos = STRNSTR(curr_pos, c_address) - 1;
+ //curr_pos = STRNSTR(curr_pos, c_address) - 1; //Not needed due to regex
if (curr_pos != NULL) {
/* curr_pos set below */
nettrace_parse_address(curr_pos, next_pos, FALSE/* DST */, &exported_pdu_info);