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.
This commit is contained in:
Michael Catanzaro
2023-09-26 19:25:41 -05:00
parent dfbafdf047
commit 653c10e8b6

View File

@@ -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;
}