summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid King <dking@redhat.com>2021-05-20 13:47:46 +0100
committerEmmanuele Bassi <ebassi@gmail.com>2021-06-18 14:28:05 +0000
commit3cab01728bc9035ebcc1f67c3b4ef8d884ed1c1f (patch)
tree2fc0e43b1522ccde73c9fa73a3931b33d91acb78
parent4dcc1b3536d0e9f12d510b8489771e72a9ca7282 (diff)
downloadgobject-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
-rw-r--r--giscanner/scannerparser.y32
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