diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2017-11-30 09:31:43 +0100 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2017-11-30 12:17:48 +0000 |
commit | a6d0ffca86662357893c2ba6986964cb341a73d1 (patch) | |
tree | 53efb9c4cb560b58180eefa9e7ca028d07828f3b /epan/dissectors/asn1/rrc | |
parent | 6a00fa767fec78020203e1f53062c6a2e5a117c6 (diff) |
RRC: reset strbuf pointer after its use
While we are at it, let's add a partial dissection of
PLMN-IdentityWithOptionalMCC-r6 IE.
Bug: 14248
Change-Id: I20b76bc74c248914db21629f8ce77799fccb1612
Reviewed-on: https://code.wireshark.org/review/24661
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/asn1/rrc')
-rw-r--r-- | epan/dissectors/asn1/rrc/rrc.cnf | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/epan/dissectors/asn1/rrc/rrc.cnf b/epan/dissectors/asn1/rrc/rrc.cnf index 213c2bd0aa..4837a7c887 100644 --- a/epan/dissectors/asn1/rrc/rrc.cnf +++ b/epan/dissectors/asn1/rrc/rrc.cnf @@ -780,21 +780,21 @@ HandoverFromUTRANCommand-GSM-r6-IEs/gsm-message/single-GSM-Message single-GSM-Me tvbuff_t* mcc_mnc_tvb; /* Reset the digits string in the private data struct */ - /* Maximal length: 6 = 3 digits MCC + 3 digits MNC + trailing '\0'*/ + /* Maximal length: 7 = 3 digits MCC + 3 digits MNC + trailing '\0' */ mcc_mnc_strbuf = wmem_strbuf_sized_new(actx->pinfo->pool,7,7); private_data_set_digits_strbuf(actx, mcc_mnc_strbuf); /* Reset parsing failure flag*/ private_data_set_digits_strbuf_parsing_failed_flag(actx, FALSE); %(DEFAULT_BODY)s + private_data_set_digits_strbuf(actx, NULL); /* Check for parsing errors */ if(private_data_get_digits_strbuf_parsing_failed_flag(actx)) { return offset; } - /* Extracing the string collected in the strbuf */ + /* Extracting the string collected in the strbuf */ string_len = (guint32)wmem_strbuf_get_len(mcc_mnc_strbuf); - mcc_mnc_string = wmem_strdup(actx->pinfo->pool, wmem_strbuf_get_str(mcc_mnc_strbuf)); - wmem_strbuf_truncate(mcc_mnc_strbuf, 0); + mcc_mnc_string = wmem_strbuf_finalize(mcc_mnc_strbuf); /* Creating TVB from extracted string*/ mcc_mnc_tvb = tvb_new_child_real_data(tvb, (guint8*)mcc_mnc_string, string_len, string_len); @@ -803,6 +803,40 @@ HandoverFromUTRANCommand-GSM-r6-IEs/gsm-message/single-GSM-Message single-GSM-Me /* Calling E.212 */ dissect_e212_mcc_mnc_in_utf8_address(mcc_mnc_tvb, actx->pinfo, tree, 0); +#.FN_BODY PLMN-IdentityWithOptionalMCC-r6 + wmem_strbuf_t* mcc_mnc_strbuf; + guint32 string_len; + gchar* mcc_mnc_string; + tvbuff_t* mcc_mnc_tvb; + + /* Reset the digits string in the private data struct */ + /* Maximal length: 7 = 3 digits MCC + 3 digits MNC + trailing '\0' */ + mcc_mnc_strbuf = wmem_strbuf_sized_new(actx->pinfo->pool,7,7); + private_data_set_digits_strbuf(actx, mcc_mnc_strbuf); + /* Reset parsing failure flag*/ + private_data_set_digits_strbuf_parsing_failed_flag(actx, FALSE); +%(DEFAULT_BODY)s + private_data_set_digits_strbuf(actx, NULL); + /* Check for parsing errors */ + if(private_data_get_digits_strbuf_parsing_failed_flag(actx)) { + return offset; + } + + /* Extracting the string collected in the strbuf */ + string_len = (guint32)wmem_strbuf_get_len(mcc_mnc_strbuf); + if (string_len >= 5) { + /* optional MCC was present, we can call E.212 dissector */ + /* if not present, we could apply the algorithm in 25.331 chapter 8.1.1.5 */ + mcc_mnc_string = wmem_strbuf_finalize(mcc_mnc_strbuf); + + /* Creating TVB from extracted string*/ + mcc_mnc_tvb = tvb_new_child_real_data(tvb, (guint8*)mcc_mnc_string, string_len, string_len); + add_new_data_source(actx->pinfo, mcc_mnc_tvb, "MCC-MNC"); + + /* Calling E.212 */ + dissect_e212_mcc_mnc_in_utf8_address(mcc_mnc_tvb, actx->pinfo, tree, 0); + } + #.FN_BODY IMSI-GSM-MAP wmem_strbuf_t* imsi_strbuf; guint32 string_len; @@ -815,15 +849,15 @@ HandoverFromUTRANCommand-GSM-r6-IEs/gsm-message/single-GSM-Message single-GSM-Me /* Reset parsing failure flag*/ private_data_set_digits_strbuf_parsing_failed_flag(actx, FALSE); %(DEFAULT_BODY)s + private_data_set_digits_strbuf(actx, NULL); /* Check for parsing errors */ if(private_data_get_digits_strbuf_parsing_failed_flag(actx)) { return offset; } - /* Extracing the string collected in the strbuf */ + /* Extracting the string collected in the strbuf */ string_len = (guint32)wmem_strbuf_get_len(imsi_strbuf); - imsi_string = wmem_strdup(actx->pinfo->pool, wmem_strbuf_get_str(imsi_strbuf)); - wmem_strbuf_truncate(imsi_strbuf, 0); + imsi_string = wmem_strbuf_finalize(imsi_strbuf); /* Creating TVB from extracted string*/ imsi_tvb = tvb_new_child_real_data(tvb, (guint8*)imsi_string, string_len, string_len); |