Merge branch 'gmodule-invalid-la-file' into 'main'

gmodule: Improve error handling for invalid .la files

See merge request GNOME/glib!2796
This commit is contained in:
Marco Trevisan 2022-07-06 13:00:09 +00:00
commit 45028d7d3e
2 changed files with 43 additions and 4 deletions

View File

@ -366,7 +366,7 @@ parse_libtool_archive (const gchar* libtool_name)
if (fd < 0)
{
gchar *display_libtool_name = g_filename_display_name (libtool_name);
g_module_set_error_unduped (g_strdup_printf ("failed to open libtool archive \"%s\"", display_libtool_name));
g_module_set_error_unduped (g_strdup_printf ("failed to open libtool archive %s", display_libtool_name));
g_free (display_libtool_name);
return NULL;
}
@ -392,7 +392,7 @@ parse_libtool_archive (const gchar* libtool_name)
G_TOKEN_IDENTIFIER : G_TOKEN_STRING))
{
gchar *display_libtool_name = g_filename_display_name (libtool_name);
g_module_set_error_unduped (g_strdup_printf ("unable to parse libtool archive \"%s\"", display_libtool_name));
g_module_set_error_unduped (g_strdup_printf ("unable to parse libtool archive %s", display_libtool_name));
g_free (display_libtool_name);
g_free (lt_dlname);
@ -429,12 +429,22 @@ parse_libtool_archive (const gchar* libtool_name)
g_free (dir);
}
g_clear_pointer (&scanner, g_scanner_destroy);
close (g_steal_fd (&fd));
if (lt_libdir == NULL || lt_dlname == NULL)
{
gchar *display_libtool_name = g_filename_display_name (libtool_name);
g_module_set_error_unduped (g_strdup_printf ("unable to parse libtool archive %s", display_libtool_name));
g_free (display_libtool_name);
return NULL;
}
name = g_strconcat (lt_libdir, G_DIR_SEPARATOR_S, lt_dlname, NULL);
g_free (lt_dlname);
g_free (lt_libdir);
g_scanner_destroy (scanner);
close (fd);
return name;
}

View File

@ -25,6 +25,7 @@
*/
#include <gmodule.h>
#include <glib/gstdio.h>
#ifdef _MSC_VER
# define MODULE_FILENAME_PREFIX ""
@ -205,12 +206,40 @@ test_module_basics (void)
g_module_close (module_self);
}
static void
test_module_invalid_libtool_archive (void)
{
int la_fd;
gchar *la_filename = NULL;
GModule *module = NULL;
GError *local_error = NULL;
g_test_summary ("Test that opening an invalid .la file fails");
/* Create an empty temporary file ending in `.la` */
la_fd = g_file_open_tmp ("gmodule-invalid-XXXXXX.la", &la_filename, &local_error);
g_assert_no_error (local_error);
g_assert_true (g_str_has_suffix (la_filename, ".la"));
g_close (la_fd, NULL);
/* Try loading it */
module = g_module_open_full (la_filename, 0, &local_error);
g_assert_error (local_error, G_MODULE_ERROR, G_MODULE_ERROR_FAILED);
g_assert_null (module);
g_clear_error (&local_error);
(void) g_unlink (la_filename);
g_free (la_filename);
}
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/module/basics", test_module_basics);
g_test_add_func ("/module/invalid-libtool-archive", test_module_invalid_libtool_archive);
return g_test_run ();
}