Blame SOURCES/0001-Fix-stuck-multi-file-jobs-Issue-5359-Issue-5413.patch

1d75c0
diff --git a/backend/socket.c b/backend/socket.c
1d75c0
index 675061dd9..68379e95b 100644
1d75c0
--- a/backend/socket.c
1d75c0
+++ b/backend/socket.c
1d75c0
@@ -397,8 +397,10 @@ main(int  argc,				/* I - Number of command-line arguments (6 or 7) */
1d75c0
       lseek(print_fd, 0, SEEK_SET);
1d75c0
     }
1d75c0
 
1d75c0
-    tbytes = backendRunLoop(print_fd, device_fd, snmp_fd, &(addrlist->addr), 1,
1d75c0
-                            0, backendNetworkSideCB);
1d75c0
+    if ((bytes = backendRunLoop(print_fd, device_fd, snmp_fd, &(addrlist->addr), 1, 0, backendNetworkSideCB)) < 0)
1d75c0
+      tbytes = -1;
1d75c0
+    else
1d75c0
+      tbytes = bytes;
1d75c0
 
1d75c0
     if (print_fd != 0 && tbytes >= 0)
1d75c0
       _cupsLangPrintFilter(stderr, "INFO", _("Print file sent."));
1d75c0
@@ -406,7 +408,7 @@ main(int  argc,				/* I - Number of command-line arguments (6 or 7) */
1d75c0
 
1d75c0
   fputs("STATE: +cups-waiting-for-job-completed\n", stderr);
1d75c0
 
1d75c0
-  if (waiteof)
1d75c0
+  if (waiteof && tbytes >= 0)
1d75c0
   {
1d75c0
    /*
1d75c0
     * Shutdown the socket and wait for the other end to finish...
1d75c0
@@ -443,7 +445,7 @@ main(int  argc,				/* I - Number of command-line arguments (6 or 7) */
1d75c0
   if (print_fd != 0)
1d75c0
     close(print_fd);
1d75c0
 
1d75c0
-  return (CUPS_BACKEND_OK);
1d75c0
+  return (tbytes >= 0 ? CUPS_BACKEND_OK : CUPS_BACKEND_FAILED);
1d75c0
 }
1d75c0
 
1d75c0
 
1d75c0
diff --git a/scheduler/main.c b/scheduler/main.c
1d75c0
index 4b3914ade..472b9946d 100644
1d75c0
--- a/scheduler/main.c
1d75c0
+++ b/scheduler/main.c
1d75c0
@@ -1472,9 +1472,16 @@ process_children(void)
1d75c0
               (!job->filters[i] && WIFEXITED(old_status)))
1d75c0
           {				/* Backend and filter didn't crash */
1d75c0
 	    if (job->filters[i])
1d75c0
+	    {
1d75c0
 	      job->status = status;	/* Filter failed */
1d75c0
+	    }
1d75c0
 	    else
1d75c0
+	    {
1d75c0
 	      job->status = -status;	/* Backend failed */
1d75c0
+
1d75c0
+	      if (job->current_file < job->num_files)
1d75c0
+	        cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_FORCE, "Canceling multi-file job due to backend failure.");
1d75c0
+	    }
1d75c0
           }
1d75c0
 
1d75c0
 	  if (job->state_value == IPP_JOB_PROCESSING &&