diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2018-08-31 23:00:44 +0200 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2018-09-03 04:05:13 +0000 |
commit | 65b342f7497825c2abc4e98c7fd9f4ff6d8ed45c (patch) | |
tree | 3746e1055e28476a4b8ba30df6996fcd16b636c1 | |
parent | 42ad60896da6655d89c4e220a36766f121cdb856 (diff) |
epan: Use g_base64_decode_inplace()
Replace ws_base64_decode_inplace() with g_base64_decode_inplace()
or g_base64_decode(), which was introduced in glib 2.12.
The only observed difference is a need for zero-terminate the buffer
after decoding.
Change-Id: Ia102d0d8e9bec575ffeddf448191a3f6de9fb1ed
Reviewed-on: https://code.wireshark.org/review/29382
Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r-- | debian/libwsutil0.symbols | 1 | ||||
-rw-r--r-- | epan/dissectors/packet-http.c | 18 | ||||
-rw-r--r-- | epan/dissectors/packet-smtp.c | 39 | ||||
-rw-r--r-- | epan/tvbuff_base64.c | 9 | ||||
-rw-r--r-- | epan/wslua/wslua_byte_array.c | 11 | ||||
-rw-r--r-- | ui/qt/show_packet_bytes_dialog.cpp | 6 | ||||
-rw-r--r-- | wsutil/CMakeLists.txt | 2 | ||||
-rw-r--r-- | wsutil/base64.c | 66 | ||||
-rw-r--r-- | wsutil/base64.h | 27 |
9 files changed, 51 insertions, 128 deletions
diff --git a/debian/libwsutil0.symbols b/debian/libwsutil0.symbols index cf9c98ffaf..69efd6eb58 100644 --- a/debian/libwsutil0.symbols +++ b/debian/libwsutil0.symbols @@ -160,7 +160,6 @@ libwsutil.so.0 libwsutil0 #MINVER# ws_ascii_strnatcasecmp@Base 1.99.1 ws_ascii_strnatcmp@Base 1.99.1 ws_base32_decode@Base 2.3.0 - ws_base64_decode_inplace@Base 1.12.0~rc1 ws_buffer_append@Base 1.99.0 ws_buffer_assure_space@Base 1.99.0 ws_buffer_free@Base 1.99.0 diff --git a/epan/dissectors/packet-http.c b/epan/dissectors/packet-http.c index 5f16071321..b481c86713 100644 --- a/epan/dissectors/packet-http.c +++ b/epan/dissectors/packet-http.c @@ -34,7 +34,6 @@ #include <epan/proto_data.h> #include <epan/export_object.h> -#include <wsutil/base64.h> #include "packet-http.h" #include "packet-tcp.h" #include "packet-ssl.h" @@ -3311,6 +3310,7 @@ check_auth_basic(proto_item *hdr_item, tvbuff_t *tvb, gchar *value) const char **header; size_t hdrlen; proto_tree *hdr_tree; + gsize len; for (header = &basic_headers[0]; *header != NULL; header++) { hdrlen = strlen(*header); @@ -3322,7 +3322,8 @@ check_auth_basic(proto_item *hdr_item, tvbuff_t *tvb, gchar *value) hdr_tree = NULL; value += hdrlen; - ws_base64_decode_inplace(value); + g_base64_decode_inplace(value, &len); + value[len] = 0; proto_tree_add_string(hdr_tree, hf_http_basic, tvb, 0, 0, value); @@ -3350,6 +3351,7 @@ check_auth_citrixbasic(proto_item *hdr_item, tvbuff_t *tvb, gchar *value, int of char *data_val; proto_item *hidden_item; proto_item *pi; + gsize len; for (header = &basic_headers[0]; *header != NULL; header++) { hdrlen = strlen(*header); @@ -3372,7 +3374,8 @@ check_auth_citrixbasic(proto_item *hdr_item, tvbuff_t *tvb, gchar *value, int of if ( ch_ptr != NULL ) { data_len = (int)(ch_ptr - value + 1); data_val = wmem_strndup(wmem_packet_scope(), value, data_len); - ws_base64_decode_inplace(data_val); + g_base64_decode_inplace(data_val, &len); + data_val[len] = 0; pi = proto_tree_add_string(hdr_tree, hf_http_citrix_user, tvb, offset , data_len - 1, data_val); PROTO_ITEM_SET_GENERATED(pi); @@ -3387,7 +3390,8 @@ check_auth_citrixbasic(proto_item *hdr_item, tvbuff_t *tvb, gchar *value, int of if ( ch_ptr != NULL ) { data_len = (int)(ch_ptr - value + 1); data_val = wmem_strndup(wmem_packet_scope(), value, data_len); - ws_base64_decode_inplace(data_val); + g_base64_decode_inplace(data_val, &len); + data_val[len] = 0; pi = proto_tree_add_string(hdr_tree, hf_http_citrix_domain, tvb, offset, data_len - 1, data_val); PROTO_ITEM_SET_GENERATED(pi); @@ -3402,7 +3406,8 @@ check_auth_citrixbasic(proto_item *hdr_item, tvbuff_t *tvb, gchar *value, int of if ( ch_ptr != NULL ) { data_len = (int)(ch_ptr - value + 1); data_val = wmem_strndup(wmem_packet_scope(), value, data_len); - ws_base64_decode_inplace(data_val); + g_base64_decode_inplace(data_val, &len); + data_val[len] = 0; pi = proto_tree_add_string(hdr_tree, hf_http_citrix_passwd, tvb, offset, data_len - 1, data_val); PROTO_ITEM_SET_GENERATED(pi); @@ -3417,7 +3422,8 @@ check_auth_citrixbasic(proto_item *hdr_item, tvbuff_t *tvb, gchar *value, int of if ( ch_ptr != NULL ) { data_len = (int)(ch_ptr - value + 1); data_val = wmem_strndup(wmem_packet_scope(), value, data_len); - ws_base64_decode_inplace(data_val); + g_base64_decode_inplace(data_val, &len); + data_val[len] = 0; pi = proto_tree_add_string(hdr_tree, hf_http_citrix_session, tvb, offset, data_len - 1, data_val); PROTO_ITEM_SET_GENERATED(pi); diff --git a/epan/dissectors/packet-smtp.c b/epan/dissectors/packet-smtp.c index 104b705464..c45f86c3d0 100644 --- a/epan/dissectors/packet-smtp.c +++ b/epan/dissectors/packet-smtp.c @@ -24,7 +24,6 @@ #include <epan/reassemble.h> #include <epan/proto_data.h> -#include <wsutil/base64.h> #include <wsutil/str_util.h> #include "packet-ssl.h" #include "packet-ssl-utils.h" @@ -310,10 +309,13 @@ decode_plain_auth(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint length_pass; guint8 *decrypt = NULL; proto_item *ti; + gsize len; decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, a_offset, a_linelen, ENC_ASCII); if (smtp_auth_parameter_decoding_enabled) { - returncode = (gint)ws_base64_decode_inplace(decrypt); + g_base64_decode_inplace(decrypt, &len); + decrypt[len] = 0; + returncode = (gint)len; if (returncode) { length_user1 = (gint)strlen(decrypt); if (returncode >= (length_user1 + 1)) { @@ -364,7 +366,7 @@ dissect_smtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ fragment_head *frag_msg = NULL; tvbuff_t *next_tvb; guint8 *decrypt = NULL; - size_t decrypt_len = 0; + gsize decrypt_len = 0; guint8 *base64_string = NULL; guint8 line_code[3]; @@ -555,7 +557,9 @@ dissect_smtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ ((session_state->last_auth_frame == 0) || (pinfo->num <= session_state->last_auth_frame))) { decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset, linelen, ENC_ASCII); if ((smtp_auth_parameter_decoding_enabled) && - ((decrypt_len = ws_base64_decode_inplace(decrypt)) > 0)) { + (g_base64_decode_inplace(decrypt, &decrypt_len)) && + (decrypt_len > 0)) { + decrypt[decrypt_len] = 0; line = decrypt; linelen = (int)decrypt_len; } else { @@ -819,7 +823,9 @@ dissect_smtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset, linelen, ENC_ASCII); decrypt_len = linelen; if (smtp_auth_parameter_decoding_enabled) { - if ((decrypt_len = ws_base64_decode_inplace(decrypt)) == 0) { + g_base64_decode_inplace(decrypt, &decrypt_len); + decrypt[decrypt_len] = 0; + if (decrypt_len == 0) { /* Go back to the original string */ decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset, linelen, ENC_ASCII); decrypt_len = linelen; @@ -835,7 +841,9 @@ dissect_smtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset, linelen, ENC_ASCII); decrypt_len = linelen; if (smtp_auth_parameter_decoding_enabled) { - if ((decrypt_len = ws_base64_decode_inplace(decrypt)) == 0) { + g_base64_decode_inplace(decrypt, &decrypt_len); + decrypt[decrypt_len] = 0; + if (decrypt_len == 0) { /* Go back to the original string */ decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset, linelen, ENC_ASCII); decrypt_len = linelen; @@ -849,7 +857,9 @@ dissect_smtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset, linelen, ENC_ASCII); decrypt_len = linelen; if (smtp_auth_parameter_decoding_enabled) { - if ((decrypt_len = ws_base64_decode_inplace(decrypt)) == 0) { + g_base64_decode_inplace(decrypt, &decrypt_len); + decrypt[decrypt_len] = 0; + if (decrypt_len == 0) { /* Go back to the original string */ decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset, linelen, ENC_ASCII); decrypt_len = linelen; @@ -896,7 +906,9 @@ dissect_smtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset + 11, linelen - 11, ENC_ASCII); decrypt_len = linelen - 11; if (smtp_auth_parameter_decoding_enabled) { - if ((decrypt_len = ws_base64_decode_inplace(decrypt)) == 0) { + g_base64_decode_inplace(decrypt, &decrypt_len); + decrypt[decrypt_len] = 0; + if (decrypt_len == 0) { /* Go back to the original string */ decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset + 11, linelen - 11, ENC_ASCII); decrypt_len = linelen - 11; @@ -916,7 +928,9 @@ dissect_smtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset + 10, linelen - 10, ENC_ASCII); decrypt_len = linelen - 10; if (smtp_auth_parameter_decoding_enabled) { - if ((decrypt_len = ws_base64_decode_inplace(decrypt)) == 0) { + g_base64_decode_inplace(decrypt, &decrypt_len); + decrypt[decrypt_len] = 0; + if (decrypt_len == 0) { /* Go back to the original string */ decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset + 10, linelen - 10, ENC_ASCII); decrypt_len = linelen - 10; @@ -1099,7 +1113,8 @@ dissect_smtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ if (linelen >= 4) { if ((smtp_auth_parameter_decoding_enabled) && (code == 334)) { decrypt = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 4, linelen - 4, ENC_ASCII); - if ((decrypt_len = ws_base64_decode_inplace(decrypt)) > 0) { + if ((g_base64_decode_inplace(decrypt, &decrypt_len)) && decrypt_len > 0) { + decrypt[decrypt_len] = 0; if (g_ascii_strncasecmp(decrypt, "NTLMSSP", 7) == 0) { base64_string = tvb_get_string_enc(wmem_packet_scope(), tvb, loffset + 4, linelen - 4, ENC_ASCII); col_append_fstr(pinfo->cinfo, COL_INFO, "%d ", code); @@ -1288,8 +1303,8 @@ proto_register_smtp(void) &smtp_data_desegment); prefs_register_bool_preference(smtp_module, "decryption", - "Decode base-64-encoded AUTH parameters", - "Whether the SMTP dissector should decode base-64-encoded AUTH parameters", + "Decode Base64 encoded AUTH parameters", + "Whether the SMTP dissector should decode Base64 encoded AUTH parameters", &smtp_auth_parameter_decoding_enabled); } diff --git a/epan/tvbuff_base64.c b/epan/tvbuff_base64.c index 53d50fc94f..2c39c704e0 100644 --- a/epan/tvbuff_base64.c +++ b/epan/tvbuff_base64.c @@ -13,17 +13,16 @@ #include <glib.h> #include <epan/tvbuff.h> -#include <wsutil/base64.h> tvbuff_t * base64_to_tvb(tvbuff_t *parent, const char *base64) { tvbuff_t *tvb; - char *data = g_strdup(base64); - gint len; + char *data; + gsize len; - len = (gint) ws_base64_decode_inplace(data); - tvb = tvb_new_child_real_data(parent, (const guint8 *)data, len, len); + data = g_base64_decode(base64, &len); + tvb = tvb_new_child_real_data(parent, (const guint8 *)data, (gint)len, (gint)len); tvb_set_free_cb(tvb, g_free); diff --git a/epan/wslua/wslua_byte_array.c b/epan/wslua/wslua_byte_array.c index c0ca4fae84..bb8bb3911b 100644 --- a/epan/wslua/wslua_byte_array.c +++ b/epan/wslua/wslua_byte_array.c @@ -18,7 +18,6 @@ #include "config.h" #include "wslua.h" -#include "wsutil/base64.h" /* WSLUA_CONTINUE_MODULE Tvb */ @@ -243,22 +242,22 @@ WSLUA_METHOD ByteArray_subset(lua_State* L) { } WSLUA_METHOD ByteArray_base64_decode(lua_State* L) { - /* Obtain a base64 decoded `ByteArray`. + /* Obtain a Base64 decoded `ByteArray`. @since 1.11.3 */ ByteArray ba = checkByteArray(L,1); ByteArray ba2; gchar *data; - size_t len; + gsize len; ba2 = g_byte_array_new(); - data = (gchar*)g_malloc (ba->len + 1); + data = (gchar*)g_malloc(ba->len + 1); memcpy(data, ba->data, ba->len); data[ba->len] = '\0'; - len = ws_base64_decode_inplace(data); - g_byte_array_append(ba2,data,(int)len); + g_base64_decode_inplace(data, &len); + g_byte_array_append(ba2, data, (int)len); g_free(data); pushByteArray(L,ba2); diff --git a/ui/qt/show_packet_bytes_dialog.cpp b/ui/qt/show_packet_bytes_dialog.cpp index 5b94528f7a..48f7bd5ac5 100644 --- a/ui/qt/show_packet_bytes_dialog.cpp +++ b/ui/qt/show_packet_bytes_dialog.cpp @@ -16,7 +16,6 @@ #include "epan/charsets.h" -#include "wsutil/base64.h" #include "wsutil/utf8_entities.h" #include <QAction> @@ -487,6 +486,7 @@ void ShowPacketBytesDialog::updateFieldBytes(bool initialization) int start = finfo_->start + start_; int length = end_ - start_; const guint8 *bytes; + gsize new_length; if (!finfo_->ds_tvb) return; @@ -502,8 +502,8 @@ void ShowPacketBytesDialog::updateFieldBytes(bool initialization) { bytes = tvb_get_ptr(finfo_->ds_tvb, start, -1); field_bytes_ = QByteArray((const char *)bytes, length); - size_t len = ws_base64_decode_inplace(field_bytes_.data()); - field_bytes_.resize((int)len); + g_base64_decode_inplace(field_bytes_.data(), &new_length); + field_bytes_.resize((int)new_length); break; } diff --git a/wsutil/CMakeLists.txt b/wsutil/CMakeLists.txt index 2877dad534..488905c0bf 100644 --- a/wsutil/CMakeLists.txt +++ b/wsutil/CMakeLists.txt @@ -15,7 +15,6 @@ add_definitions(-DEXTCAP_DIR=\"${CMAKE_INSTALL_PREFIX}/${EXTCAP_INSTALL_LIBDIR}\ set(WSUTIL_PUBLIC_HEADERS adler32.h base32.h - base64.h bits_count_ones.h bits_ctz.h bitswap.h @@ -77,7 +76,6 @@ set(WSUTIL_PUBLIC_HEADERS set(WSUTIL_COMMON_FILES adler32.c base32.c - base64.c bitswap.c buffer.c clopts_common.c diff --git a/wsutil/base64.c b/wsutil/base64.c deleted file mode 100644 index 951d20b5b0..0000000000 --- a/wsutil/base64.c +++ /dev/null @@ -1,66 +0,0 @@ -/* base64.c - * Base-64 conversion - * - * Wireshark - Network traffic analyzer - * By Gerald Combs <gerald@wireshark.org> - * Copyright 1998 Gerald Combs - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -#include "config.h" - -#include <string.h> -#include "base64.h" - -/* Decode a base64 string in-place - simple and slow algorithm. - Return length of result. Taken from rproxy/librsync/base64.c by - Andrew Tridgell. */ - -size_t ws_base64_decode_inplace(char *s) -{ - static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\r\n"; - int bit_offset, byte_offset, idx, i; - unsigned char *d = (unsigned char *)s; - char *p; - int cr_idx; - - /* we will allow CR and LF - but ignore them */ - cr_idx = (int)(strchr(b64, '\r') - b64); - - i = 0; - - while (*s && (p = strchr(b64, *s))) { - idx = (int)(p - b64); - if (idx < cr_idx) { - byte_offset = (i * 6) / 8; - bit_offset = (i * 6) % 8; - d[byte_offset] &= ~((1 << (8 - bit_offset)) - 1); - if (bit_offset < 3) { - d[byte_offset] |= (idx << (2 - bit_offset)); - } else { - d[byte_offset] |= (idx >> (bit_offset - 2)); - d[byte_offset + 1] = 0; - d[byte_offset + 1] |= (idx << (8 - (bit_offset - 2))) & 0xFF; - } - i++; - } - s++; - } - - d[i*3/4] = 0; - return i*3/4; -} - -/* - * Editor modelines - http://www.wireshark.org/tools/modelines.html - * - * Local variables: - * c-basic-offset: 8 - * tab-width: 8 - * indent-tabs-mode: t - * End: - * - * vi: set shiftwidth=8 tabstop=8 noexpandtab: - * :indentSize=8:tabSize=8:noTabs=false: - */ diff --git a/wsutil/base64.h b/wsutil/base64.h deleted file mode 100644 index 07b5d118d3..0000000000 --- a/wsutil/base64.h +++ /dev/null @@ -1,27 +0,0 @@ -/* base64.h - * Base-64 conversion - * - * Wireshark - Network traffic analyzer - * By Gerald Combs <gerald@wireshark.org> - * Copyright 1998 Gerald Combs - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ -#ifndef __BASE64_H__ -#define __BASE64_H__ - -#include "ws_symbol_export.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* In-place decoding of a base64 string. Resulting string is NULL terminated */ -WS_DLL_PUBLIC -size_t ws_base64_decode_inplace(char *s); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __BASE64_H__ */ |