diff options
author | David King <dking@redhat.com> | 2021-05-20 13:47:46 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gmail.com> | 2021-06-18 14:28:05 +0000 |
commit | 3cab01728bc9035ebcc1f67c3b4ef8d884ed1c1f (patch) | |
tree | 2fc0e43b1522ccde73c9fa73a3931b33d91acb78 /giscanner | |
parent | 4dcc1b3536d0e9f12d510b8489771e72a9ca7282 (diff) | |
download | gobject-introspection-3cab01728bc9035ebcc1f67c3b4ef8d884ed1c1f.tar.gz |
giscanner: Improve error handling while parsing macros
Check for errors during g_file_open_tmp() and fdopen(). Make sure to
free tmp_name and error as needed.
Found with Coverity.
https://bugzilla.redhat.com/show_bug.cgi?id=1938731
Diffstat (limited to 'giscanner')
-rw-r--r-- | giscanner/scannerparser.y | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/giscanner/scannerparser.y b/giscanner/scannerparser.y index 269a7bd3..b304a298 100644 --- a/giscanner/scannerparser.y +++ b/giscanner/scannerparser.y @@ -1677,11 +1677,36 @@ gi_source_scanner_parse_macros (GISourceScanner *scanner, GList *filenames) { GError *error = NULL; char *tmp_name = NULL; - FILE *fmacros = - fdopen (g_file_open_tmp ("gen-introspect-XXXXXX.h", &tmp_name, &error), - "w+"); + gint tmp_fd; + FILE *fmacros; GList *l; + tmp_fd = g_file_open_tmp ("gen-introspect-XXXXXX.h", &tmp_name, &error); + + if (tmp_fd == -1) + { + gchar *filename = g_file_get_path (scanner->current_file); + gchar *error_msg = g_strdup_printf ("%s: failed to create temporary file '%s' while parsing macros: %s", filename, tmp_name, error->message); + g_ptr_array_add (scanner->errors, error_msg); + g_free (filename); + g_error_free (error); + return; + } + + fmacros = fdopen (tmp_fd, "w+"); + + if (!fmacros) + { + gchar *filename = g_file_get_path (scanner->current_file); + gchar *error_msg = g_strdup_printf ("%s: failed to open temporary file '%s' while parsing macros", filename, tmp_name); + g_ptr_array_add (scanner->errors, error_msg); + g_free (filename); + close (tmp_fd); + g_unlink (tmp_name); + g_free (tmp_name); + return; + } + for (l = filenames; l != NULL; l = l->next) { FILE *f = fopen (l->data, "r"); @@ -1821,6 +1846,7 @@ gi_source_scanner_parse_macros (GISourceScanner *scanner, GList *filenames) parse_file (scanner, fmacros); fclose (fmacros); g_unlink (tmp_name); + g_free (tmp_name); } gboolean |