aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2011-11-16 03:13:02 +0000
committerGuy Harris <guy@alum.mit.edu>2011-11-16 03:13:02 +0000
commit741432d483bed382d7199dced14d754abfc3fd8c (patch)
tree0f4fee6555991f7698ce70ab8e9ad89bc0f1c541 /gtk
parentc73c44cf4b5073f6bfa497bf83e40838029a3714 (diff)
Handle ctime() and localtime() returning NULL and localtime() on Windows
blowing up when handed a bad value. svn path=/trunk/; revision=39878
Diffstat (limited to 'gtk')
-rw-r--r--gtk/summary_dlg.c52
1 files changed, 30 insertions, 22 deletions
diff --git a/gtk/summary_dlg.c b/gtk/summary_dlg.c
index 6af42dc69c..df74339ef4 100644
--- a/gtk/summary_dlg.c
+++ b/gtk/summary_dlg.c
@@ -100,6 +100,34 @@ add_string_to_list(GtkWidget *list, gchar *title, gchar *captured, gchar *displa
simple_list_append(list, 0, title, 1, captured, 2, displayed, 3, marked, -1);
}
+static void
+time_to_string(char *string_buff, gulong string_buff_size, time_t ti_time)
+{
+ struct tm *ti_tm;
+
+#ifdef _MSC_VER
+ /* calling localtime() on MSVC 2005 with huge values causes it to crash */
+ /* XXX - find the exact value that still does work */
+ /* XXX - using _USE_32BIT_TIME_T might be another way to circumvent this problem */
+ if (ti_time > 2000000000) {
+ ti_tm = NULL;
+ } else
+#endif
+ ti_tm = localtime(&ti_time);
+ if (ti_tm == NULL) {
+ g_snprintf(string_buff, string_buff_size, "Not representable");
+ return;
+ }
+ g_snprintf(string_buff, string_buff_size,
+ "%04d-%02d-%02d %02d:%02d:%02d",
+ ti_tm->tm_year + 1900,
+ ti_tm->tm_mon + 1,
+ ti_tm->tm_mday,
+ ti_tm->tm_hour,
+ ti_tm->tm_min,
+ ti_tm->tm_sec);
+}
+
void
summary_open_cb(GtkWidget *w _U_, gpointer d _U_)
{
@@ -132,8 +160,6 @@ summary_open_cb(GtkWidget *w _U_, gpointer d _U_)
gchar *str_dup;
gchar *str_work;
- time_t ti_time;
- struct tm *ti_tm;
unsigned int elapsed_time;
iface_options iface;
unsigned int i;
@@ -193,29 +219,11 @@ summary_open_cb(GtkWidget *w _U_, gpointer d _U_)
add_string_to_table(table, &row, "Time", "");
/* start time */
- ti_time = (time_t)summary.start_time;
- ti_tm = localtime(&ti_time);
- g_snprintf(string_buff, SUM_STR_MAX,
- "%04d-%02d-%02d %02d:%02d:%02d",
- ti_tm->tm_year + 1900,
- ti_tm->tm_mon + 1,
- ti_tm->tm_mday,
- ti_tm->tm_hour,
- ti_tm->tm_min,
- ti_tm->tm_sec);
+ time_to_string(string_buff, SUM_STR_MAX, (time_t)summary.start_time);
add_string_to_table(table, &row, "First packet:", string_buff);
/* stop time */
- ti_time = (time_t)summary.stop_time;
- ti_tm = localtime(&ti_time);
- g_snprintf(string_buff, SUM_STR_MAX,
- "%04d-%02d-%02d %02d:%02d:%02d",
- ti_tm->tm_year + 1900,
- ti_tm->tm_mon + 1,
- ti_tm->tm_mday,
- ti_tm->tm_hour,
- ti_tm->tm_min,
- ti_tm->tm_sec);
+ time_to_string(string_buff, SUM_STR_MAX, (time_t)summary.stop_time);
add_string_to_table(table, &row, "Last packet:", string_buff);
/* elapsed seconds */