column-utils: Check for UTF-8 truncation
Functions that copy into a fixed sized buffer, like vnsprintf and g_strlcat can truncate UTF-8 strings in the middle of a character. Check for that with vnsprintf, and replace some g_strlcat calls in the column utils with ws_label_strcpy. Fix #18554
This commit is contained in:
parent
ea9af624cd
commit
4851b4ceb5
|
@ -471,7 +471,7 @@ col_append_frame_number(packet_info *pinfo, const gint col, const gchar *fmt_str
|
||||||
static void
|
static void
|
||||||
col_do_append_fstr(column_info *cinfo, const int el, const char *separator, const char *format, va_list ap)
|
col_do_append_fstr(column_info *cinfo, const int el, const char *separator, const char *format, va_list ap)
|
||||||
{
|
{
|
||||||
size_t len, max_len, sep_len;
|
size_t len, max_len, sep_len, pos;
|
||||||
int i;
|
int i;
|
||||||
col_item_t* col_item;
|
col_item_t* col_item;
|
||||||
char tmp[COL_BUF_MAX_LEN];
|
char tmp[COL_BUF_MAX_LEN];
|
||||||
|
@ -505,8 +505,11 @@ col_do_append_fstr(column_info *cinfo, const int el, const char *separator, cons
|
||||||
va_list ap2;
|
va_list ap2;
|
||||||
|
|
||||||
va_copy(ap2, ap);
|
va_copy(ap2, ap);
|
||||||
vsnprintf(tmp, sizeof(tmp), format, ap2);
|
pos = vsnprintf(tmp, sizeof(tmp), format, ap2);
|
||||||
va_end(ap2);
|
va_end(ap2);
|
||||||
|
if (pos >= max_len) {
|
||||||
|
ws_utf8_truncate(tmp, max_len - 1);
|
||||||
|
}
|
||||||
WS_UTF_8_CHECK(tmp, -1);
|
WS_UTF_8_CHECK(tmp, -1);
|
||||||
ws_label_strcpy(col_item->col_buf, max_len, len, tmp, 0);
|
ws_label_strcpy(col_item->col_buf, max_len, len, tmp, 0);
|
||||||
}
|
}
|
||||||
|
@ -556,7 +559,7 @@ col_prepend_fstr(column_info *cinfo, const gint el, const gchar *format, ...)
|
||||||
int i;
|
int i;
|
||||||
char orig_buf[COL_BUF_MAX_LEN];
|
char orig_buf[COL_BUF_MAX_LEN];
|
||||||
const char *orig;
|
const char *orig;
|
||||||
int max_len;
|
size_t max_len, pos;
|
||||||
col_item_t* col_item;
|
col_item_t* col_item;
|
||||||
char tmp[COL_BUF_MAX_LEN];
|
char tmp[COL_BUF_MAX_LEN];
|
||||||
|
|
||||||
|
@ -579,10 +582,13 @@ col_prepend_fstr(column_info *cinfo, const gint el, const gchar *format, ...)
|
||||||
orig = orig_buf;
|
orig = orig_buf;
|
||||||
}
|
}
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
vsnprintf(tmp, sizeof(tmp), format, ap);
|
pos = vsnprintf(tmp, sizeof(tmp), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
if (pos >= max_len) {
|
||||||
|
ws_utf8_truncate(tmp, max_len - 1);
|
||||||
|
}
|
||||||
WS_UTF_8_CHECK(tmp, -1);
|
WS_UTF_8_CHECK(tmp, -1);
|
||||||
ws_label_strcpy(col_item->col_buf, max_len, 0, tmp, 0);
|
pos = ws_label_strcpy(col_item->col_buf, max_len, 0, tmp, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Move the fence, unless it's at the beginning of the string.
|
* Move the fence, unless it's at the beginning of the string.
|
||||||
|
@ -590,7 +596,10 @@ col_prepend_fstr(column_info *cinfo, const gint el, const gchar *format, ...)
|
||||||
if (col_item->col_fence > 0)
|
if (col_item->col_fence > 0)
|
||||||
col_item->col_fence += (int) strlen(col_item->col_buf);
|
col_item->col_fence += (int) strlen(col_item->col_buf);
|
||||||
|
|
||||||
(void) g_strlcat(col_item->col_buf, orig, max_len);
|
/*
|
||||||
|
* Append the original data.
|
||||||
|
*/
|
||||||
|
ws_label_strcpy(col_item->col_buf, max_len, pos, orig, 0);
|
||||||
col_item->col_data = col_item->col_buf;
|
col_item->col_data = col_item->col_buf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -602,7 +611,7 @@ col_prepend_fence_fstr(column_info *cinfo, const gint el, const gchar *format, .
|
||||||
int i;
|
int i;
|
||||||
char orig_buf[COL_BUF_MAX_LEN];
|
char orig_buf[COL_BUF_MAX_LEN];
|
||||||
const char *orig;
|
const char *orig;
|
||||||
int max_len;
|
size_t max_len, pos;
|
||||||
col_item_t* col_item;
|
col_item_t* col_item;
|
||||||
char tmp[COL_BUF_MAX_LEN];
|
char tmp[COL_BUF_MAX_LEN];
|
||||||
|
|
||||||
|
@ -625,10 +634,13 @@ col_prepend_fence_fstr(column_info *cinfo, const gint el, const gchar *format, .
|
||||||
orig = orig_buf;
|
orig = orig_buf;
|
||||||
}
|
}
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
vsnprintf(tmp, sizeof(tmp), format, ap);
|
pos = vsnprintf(tmp, sizeof(tmp), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
if (pos >= max_len) {
|
||||||
|
ws_utf8_truncate(tmp, max_len - 1);
|
||||||
|
}
|
||||||
WS_UTF_8_CHECK(tmp, -1);
|
WS_UTF_8_CHECK(tmp, -1);
|
||||||
ws_label_strcpy(col_item->col_buf, max_len, 0, tmp, 0);
|
pos = ws_label_strcpy(col_item->col_buf, max_len, 0, tmp, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Move the fence if it exists, else create a new fence at the
|
* Move the fence if it exists, else create a new fence at the
|
||||||
|
@ -639,7 +651,10 @@ col_prepend_fence_fstr(column_info *cinfo, const gint el, const gchar *format, .
|
||||||
} else {
|
} else {
|
||||||
col_item->col_fence = (int) strlen(col_item->col_buf);
|
col_item->col_fence = (int) strlen(col_item->col_buf);
|
||||||
}
|
}
|
||||||
(void) g_strlcat(col_item->col_buf, orig, max_len);
|
/*
|
||||||
|
* Append the original data.
|
||||||
|
*/
|
||||||
|
ws_label_strcpy(col_item->col_buf, max_len, pos, orig, 0);
|
||||||
col_item->col_data = col_item->col_buf;
|
col_item->col_data = col_item->col_buf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -779,7 +794,7 @@ void
|
||||||
col_add_fstr(column_info *cinfo, const gint el, const gchar *format, ...)
|
col_add_fstr(column_info *cinfo, const gint el, const gchar *format, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
int i;
|
int i, pos;
|
||||||
int max_len;
|
int max_len;
|
||||||
col_item_t* col_item;
|
col_item_t* col_item;
|
||||||
char tmp[COL_BUF_MAX_LEN];
|
char tmp[COL_BUF_MAX_LEN];
|
||||||
|
@ -808,8 +823,11 @@ col_add_fstr(column_info *cinfo, const gint el, const gchar *format, ...)
|
||||||
col_item->col_data = col_item->col_buf;
|
col_item->col_data = col_item->col_buf;
|
||||||
}
|
}
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
vsnprintf(tmp, sizeof(tmp), format, ap);
|
pos = vsnprintf(tmp, sizeof(tmp), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
if (pos >= max_len) {
|
||||||
|
ws_utf8_truncate(tmp, max_len - 1);
|
||||||
|
}
|
||||||
WS_UTF_8_CHECK(tmp, -1);
|
WS_UTF_8_CHECK(tmp, -1);
|
||||||
ws_label_strcpy(col_item->col_buf, max_len, col_item->col_fence, tmp, 0);
|
ws_label_strcpy(col_item->col_buf, max_len, col_item->col_fence, tmp, 0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue