diff options
author | Guy Harris <guy@alum.mit.edu> | 2011-11-16 03:13:02 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2011-11-16 03:13:02 +0000 |
commit | 741432d483bed382d7199dced14d754abfc3fd8c (patch) | |
tree | 0f4fee6555991f7698ce70ab8e9ad89bc0f1c541 /gtk | |
parent | c73c44cf4b5073f6bfa497bf83e40838029a3714 (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.c | 52 |
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 */ |