diff -ur gtk+-3.2.2/modules/printbackends/cups.orig/gtkcupsutils.c gtk+-3.2.2/modules/printbackends/cups/gtkcupsutils.c
--- gtk+-3.2.2/modules/printbackends/cups.orig/gtkcupsutils.c	2011-11-07 19:47:37.000000000 +0100
+++ gtk+-3.2.2/modules/printbackends/cups/gtkcupsutils.c	2011-11-23 11:50:56.413671604 +0100
@@ -265,6 +265,10 @@
       else if (request->type == GTK_CUPS_GET)
         get_states[request->state] (request);
 
+      if (gtk_cups_result_is_error (request->result)) {
+          request->state = GTK_CUPS_REQUEST_DONE;
+      }
+
       if (request->attempts > _GTK_CUPS_MAX_ATTEMPTS &&
           request->state != GTK_CUPS_REQUEST_DONE)
         {
@@ -918,8 +922,8 @@
  * The callback sets cups_password to NULL to signal that the 
  * password has been used.
  */
-static char *cups_password;
-static char *cups_username;
+static char *cups_password = NULL;
+static char *cups_username = NULL;
 
 static const char *
 passwordCB (const char *prompt)
@@ -955,6 +959,7 @@
 
       if (request->password_state == GTK_CUPS_PASSWORD_APPLIED)
         {
+          request->poll_state = GTK_CUPS_HTTP_IDLE;
           request->password_state = GTK_CUPS_PASSWORD_NOT_VALID;
           request->state = GTK_CUPS_POST_AUTH;
           request->need_password = TRUE;
@@ -972,7 +976,6 @@
         {
           if (request->password_state == GTK_CUPS_PASSWORD_NONE)
             {
-              cups_password = g_strdup ("");
               cups_username = request->username;
               cupsSetPasswordCB (passwordCB);
 
@@ -984,6 +987,7 @@
                   /* move to AUTH state to let the backend 
                    * ask for a password
                    */ 
+                  request->poll_state = GTK_CUPS_HTTP_IDLE;
                   request->state = GTK_CUPS_POST_AUTH;
                   request->need_password = TRUE;
 
@@ -1247,6 +1287,7 @@
 
       if (request->password_state == GTK_CUPS_PASSWORD_APPLIED)
         {
+          request->poll_state = GTK_CUPS_HTTP_IDLE;
           request->password_state = GTK_CUPS_PASSWORD_NOT_VALID;
           request->state = GTK_CUPS_GET_AUTH;
           request->need_password = TRUE;
@@ -1264,7 +1311,6 @@
         {
           if (request->password_state == GTK_CUPS_PASSWORD_NONE)
             {
-              cups_password = g_strdup ("");
               cups_username = request->username;
               cupsSetPasswordCB (passwordCB);
 
@@ -1284,6 +1331,7 @@
                   /* move to AUTH state to let the backend
                    * ask for a password
                    */
+                  request->poll_state = GTK_CUPS_HTTP_IDLE;
                   request->state = GTK_CUPS_GET_AUTH;
                   request->need_password = TRUE;
 
@@ -1324,7 +1385,7 @@
           return;
         }
 
-      request->state = GTK_CUPS_GET_SEND;
+      request->state = GTK_CUPS_GET_CONNECT;
       request->last_status = HTTP_CONTINUE;
 
      return;
