diff options
Diffstat (limited to 'ui')
-rw-r--r-- | ui/Makefile.am | 2 | ||||
-rw-r--r-- | ui/gtk/file_import_dlg.c | 7 | ||||
-rw-r--r-- | ui/qt/import_text_dialog.cpp | 8 | ||||
-rw-r--r-- | ui/text_import.c | 20 | ||||
-rw-r--r-- | ui/text_import.h | 2 | ||||
-rw-r--r-- | ui/text_import_scanner.l | 42 |
6 files changed, 71 insertions, 10 deletions
diff --git a/ui/Makefile.am b/ui/Makefile.am index 61446b5cd7..a1185688bf 100644 --- a/ui/Makefile.am +++ b/ui/Makefile.am @@ -28,6 +28,8 @@ AM_CPPFLAGS = $(INCLUDEDIRS) $(WS_CPPFLAGS) -DDOC_DIR=\"$(docdir)\" \ noinst_LIBRARIES = libui.a libui_dirty.a +BUILT_SOURCES = $(GENERATED_HEADER_FILES) + CLEANFILES = \ doxygen-ui.tag \ libui.a \ diff --git a/ui/gtk/file_import_dlg.c b/ui/gtk/file_import_dlg.c index 83a16fb893..e901b7bd07 100644 --- a/ui/gtk/file_import_dlg.c +++ b/ui/gtk/file_import_dlg.c @@ -517,7 +517,12 @@ file_import_open(text_import_info_t *info) goto end; } - text_import(info); + err = text_import(info); + if (err != 0) { + failure_alert_box("Can't initialize scanner: %s", g_strerror(err)); + fclose(info->import_text_file); + goto end; + } if (fclose(info->import_text_file)) { read_failure_alert_box(info->import_text_filename, errno); diff --git a/ui/qt/import_text_dialog.cpp b/ui/qt/import_text_dialog.cpp index 02479472ca..11b0218fb8 100644 --- a/ui/qt/import_text_dialog.cpp +++ b/ui/qt/import_text_dialog.cpp @@ -140,7 +140,13 @@ void ImportTextDialog::convertTextFile() { return; } - text_import(&import_info_); + err = text_import(&import_info_); + if (err != 0) { + failure_alert_box("Can't initialize scanner: %s", g_strerror(err)); + fclose(import_info_.import_text_file); + setResult(QDialog::Rejected); + return; + } if (fclose(import_info_.import_text_file)) { diff --git a/ui/text_import.c b/ui/text_import.c index 9928ddbc1f..45fddbdde2 100644 --- a/ui/text_import.c +++ b/ui/text_import.c @@ -126,6 +126,7 @@ #include "text_import.h" #include "text_import_scanner.h" +#include "text_import_scanner_lex.h" /*--- Options --------------------------------------------------------------------*/ @@ -902,9 +903,12 @@ parse_token (token_t token, char *str) /*---------------------------------------------------------------------- * Import a text file. */ -void +int text_import(text_import_info_t *info) { + yyscan_t scanner; + int ret; + packet_buf = (guint8 *)g_malloc(sizeof(HDR_ETHERNET) + sizeof(HDR_IP) + sizeof(HDR_SCTP) + sizeof(HDR_DATA_CHUNK) + IMPORT_MAX_PACKET); @@ -1014,11 +1018,21 @@ text_import(text_import_info_t *info) max_offset = info->max_frame_length; - text_importin = info->import_text_file; + if (text_import_lex_init(&scanner) != 0) { + ret = errno; + g_free(packet_buf); + return ret; + } + + text_import_set_in(info->import_text_file, scanner); - text_importlex(); + text_import_lex(scanner); + + text_import_lex_destroy(scanner); g_free(packet_buf); + + return 0; } /* diff --git a/ui/text_import.h b/ui/text_import.h index e430205fda..f6612d61dc 100644 --- a/ui/text_import.h +++ b/ui/text_import.h @@ -86,7 +86,7 @@ typedef struct guint max_frame_length; } text_import_info_t; -void text_import(text_import_info_t *info); +int text_import(text_import_info_t *info); #ifdef __cplusplus } diff --git a/ui/text_import_scanner.l b/ui/text_import_scanner.l index 9af93643e4..740a38ea22 100644 --- a/ui/text_import_scanner.l +++ b/ui/text_import_scanner.l @@ -1,9 +1,19 @@ /* -*-mode: flex-*- */ /* + * We want a reentrant scanner. + */ +%option reentrant + +/* + * We don't use input, so don't generate code for it. + */ +%option noinput + +/* * We don't use unput, so don't generate code for it. */ -%option nounput noinput +%option nounput /* * We don't read interactively from the terminal. @@ -16,10 +26,23 @@ %option noyywrap /* - * Prefix scanner routines with "text_import" rather than "yy", so this scanner + * Prefix scanner routines with "text_import_" rather than "yy", so this scanner * can coexist with other scanners. */ -%option prefix="text_import" +%option prefix="text_import_" + +/* + * We have to override the memory allocators so that we don't get + * "unused argument" warnings from the yyscanner argument (which + * we don't use, as we have a global memory allocator). + * + * We provide, as macros, our own versions of the routines generated by Flex, + * which just call malloc()/realloc()/free() (as the Flex versions do), + * discarding the extra argument. + */ +%option noyyalloc +%option noyyrealloc +%option noyyfree %{ @@ -57,7 +80,6 @@ #include <stdlib.h> #include "text_import_scanner.h" -#include "text_import_scanner_lex.h" /* * Flex (v 2.5.35) uses this symbol to "exclude" unistd.h @@ -70,6 +92,18 @@ # pragma warning (disable:4018) #endif +/* + * Sleazy hack to suppress compiler warnings in yy_fatal_error(). + */ +#define YY_EXIT_FAILURE ((void)yyscanner, 2) + +/* + * Macros for the allocators, to discard the extra argument. + */ +#define text_import_alloc(size, yyscanner) (void *)malloc(size) +#define text_import_realloc(ptr, size, yyscanner) (void *)realloc((char *)(ptr), (size)) +#define text_import_free(ptr, yyscanner) free((char *)ptr) + %} hexdigit [0-9A-Fa-f] |