diff --git a/gtk/gtksizegroup.c b/gtk/gtksizegroup.c
index 5926b52..00b35a1 100644
--- a/gtk/gtksizegroup.c
+++ b/gtk/gtksizegroup.c
@@ -616,10 +616,15 @@ do_size_request (GtkWidget *widget)
   if (GTK_WIDGET_REQUEST_NEEDED (widget))
     {
       gtk_widget_ensure_style (widget);      
-      GTK_PRIVATE_UNSET_FLAG (widget, GTK_REQUEST_NEEDED);
+      /* unset GTK_REQUEST_NEEDED *after* the ::size-request emission, because
+       * a handler could validly call gtk_widget_set_size_request() which in
+       * turn may call gtk_widget_queue_resize unless GTK_REQUEST_NEEDED
+       * remained set.
+       */
       g_signal_emit_by_name (widget,
 			     "size-request",
 			     &widget->requisition);
+      GTK_PRIVATE_UNSET_FLAG (widget, GTK_REQUEST_NEEDED);
     }
 }
 
