Stop using atof/strtod (fixes column sorting of float types)

atof is locale-dependent. In locales such as Swedish, German and Dutch,
the dot is a thousand separator, resulting in wrong conversions for
floats.

While at it, make the mate dissector also be independent of locale.
Blacklist atof in checkAPIs. Lemon is still using strtod, but that is
not our problem for now.

Bug: 11297
Bug: 8964
Change-Id: I6fe3e45eb1d6d95d41aa4f3af1f81a6204a60c63
Reviewed-on: https://code.wireshark.org/review/9116
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Peter Wu 2015-06-25 02:05:30 +02:00 committed by Anders Broman
parent fe6ece9689
commit 3f5d183a44
6 changed files with 9 additions and 8 deletions

View File

@ -278,7 +278,7 @@ double asn1_get_real(const guint8 *real_ptr, gint len) {
}
} else { /* decimal encoding */
buf = g_strndup(p, len);
val = atof(buf);
val = g_ascii_strtod(buf, NULL);
g_free(buf);
}

View File

@ -2139,7 +2139,7 @@ dissect_catapult_dct2000(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
displayed as a custom column... */
proto_tree_add_double(dct2000_tree, hf_catapult_dct2000_timestamp, tvb,
offset, timestamp_length,
atof(timestamp_string));
g_ascii_strtod(timestamp_string, NULL));
}
offset += timestamp_length;

View File

@ -602,11 +602,11 @@ pdu_name(A) ::= NAME(B). {
time_value(A) ::= FLOATING(B). {
A = (float) strtod(B,NULL);
A = (float) g_ascii_strtod(B,NULL);
}
time_value(A) ::= INTEGER(B). {
A = (float) strtod(B,NULL);
A = (float) g_ascii_strtod(B,NULL);
}
/************* GOG

View File

@ -109,6 +109,7 @@ my %APIs = (
'isupper',
'isxdigit',
'tolower',
'atof',
'strtod',
'strcasecmp',
'strncasecmp',

View File

@ -182,12 +182,12 @@ hostlist_sort_column(GtkTreeModel *model,
gtk_tree_model_get(model, b, data_column, &text2, -1);
if (text1) {
loc1 = atof(text1);
loc1 = g_ascii_strtod(text1, NULL);
g_free(text1);
}
if (text2) {
loc2 = atof(text2);
loc2 = g_ascii_strtod(text2, NULL);
g_free(text2);
}
CMP_INT(loc1, loc2);

View File

@ -943,8 +943,8 @@ packet_list_compare_custom(gint sort_id, gint text_sort_id, PacketListRecord *a,
(hfi->type == FT_RELATIVE_TIME)))
{
/* Attempt to convert to numbers */
double num_a = atof(a->col_text[text_sort_id]);
double num_b = atof(b->col_text[text_sort_id]);
double num_a = g_ascii_strtod(a->col_text[text_sort_id], NULL);
double num_b = g_ascii_strtod(b->col_text[text_sort_id], NULL);
if (num_a < num_b)
return -1;