From cbfbaef4cbfcb8f5caa2f4c10a5eb7b18b0ed15d Mon Sep 17 00:00:00 2001 From: Michael Catanzaro Date: Tue, 26 Sep 2023 19:25:41 -0500 Subject: [PATCH] printoperation: add some assertions Let's assert that we schedule the idle callback exactly once. These assertions are not perfect because if the callback executes before we schedule it, then the assertion itself would be a use-after-free, since I'm using the PrinterFinder to track whether the callback that frees it has been scheduled. But in practice when using loupe's print dialog, I was noticing the callback scheduled twice before it was executed. The assertion would have caught this problem. --- gtk/print/gtkprintoperation-unix.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/gtk/print/gtkprintoperation-unix.c b/gtk/print/gtkprintoperation-unix.c index 4d592eeb6c..ab69e1970b 100644 --- a/gtk/print/gtkprintoperation-unix.c +++ b/gtk/print/gtkprintoperation-unix.c @@ -1056,6 +1056,7 @@ gtk_print_run_page_setup_dialog_async (GtkWindow *parent, struct _PrinterFinder { gboolean found_printer; + gboolean scheduled_callback; GFunc func; gpointer data; char *printer_name; @@ -1088,6 +1089,14 @@ find_printer_idle (gpointer data) return G_SOURCE_REMOVE; } +static void +schedule_finder_callback (PrinterFinder *finder) +{ + g_assert (!finder->scheduled_callback); + g_idle_add (find_printer_idle, finder); + finder->scheduled_callback = TRUE; +} + static void printer_added_cb (GtkPrintBackend *backend, GtkPrinter *printer, @@ -1120,7 +1129,7 @@ printer_added_cb (GtkPrintBackend *backend, } if (finder->found_printer) - g_idle_add (find_printer_idle, finder); + schedule_finder_callback (finder); } static void @@ -1139,7 +1148,7 @@ printer_list_done_cb (GtkPrintBackend *backend, * above, then we're finished. */ if (finder->backends == NULL && !finder->found_printer) - g_idle_add (find_printer_idle, finder); + schedule_finder_callback (finder); } static void @@ -1229,7 +1238,7 @@ find_printer (const char *printer, if (finder->backends == NULL) { - g_idle_add (find_printer_idle, finder); + schedule_finder_callback (finder); return; } -- 2.30.2