summaryrefslogtreecommitdiff
path: root/beh-cve2023.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-01 14:12:05 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-01 14:12:05 +0000
commit4c3ea8a8d77795b50911837e21f52ca4beaca442 (patch)
treeaddbbe7d71aad22b8223abcedca6729e61558286 /beh-cve2023.patch
parent2a5d3f517196a968f9cca70f9e118478798f4c8d (diff)
automatic import of cups-filtersopeneuler24.03_LTSopeneuler23.09
Diffstat (limited to 'beh-cve2023.patch')
-rw-r--r--beh-cve2023.patch107
1 files changed, 107 insertions, 0 deletions
diff --git a/beh-cve2023.patch b/beh-cve2023.patch
new file mode 100644
index 0000000..6655f11
--- /dev/null
+++ b/beh-cve2023.patch
@@ -0,0 +1,107 @@
+diff --git a/backend/beh.c b/backend/beh.c
+index 225fd27..5e9cee0 100644
+--- a/backend/beh.c
++++ b/backend/beh.c
+@@ -22,6 +22,7 @@
+ #include "backend-private.h"
+ #include <cups/array.h>
+ #include <ctype.h>
++#include <sys/wait.h>
+
+ /*
+ * Local globals...
+@@ -213,10 +214,14 @@ call_backend(char *uri, /* I - URI of final destination */
+ char **argv, /* I - Command-line arguments */
+ char *filename) { /* I - File name of input data */
+ const char *cups_serverbin; /* Location of programs */
++ char *backend_argv[8]; // Arguments for called CUPS backend
+ char scheme[1024], /* Scheme from URI */
+ *ptr, /* Pointer into scheme */
+- cmdline[65536]; /* Backend command line */
+- int retval;
++ backend_path[2048]; // Backend path
++ int pid,
++ wait_pid,
++ wait_status,
++ retval = 0;
+
+ /*
+ * Build the backend command line...
+@@ -235,16 +240,19 @@ call_backend(char *uri, /* I - URI of final destination */
+ fprintf(stderr,
+ "ERROR: beh: Direct output into a file not supported.\n");
+ exit (CUPS_BACKEND_FAILED);
+- } else
+- snprintf(cmdline, sizeof(cmdline),
+- "%s/backend/%s '%s' '%s' '%s' '%s' '%s' %s",
+- cups_serverbin, scheme, argv[1], argv[2], argv[3],
+- /* Apply number of copies only if beh was called with a
+- file name and not with the print data in stdin, as
+- backends should handle copies only if they are called
+- with a file name */
+- (argc == 6 ? "1" : argv[4]),
+- argv[5], filename);
++ }
++
++ backend_argv[0] = uri;
++ backend_argv[1] = argv[1];
++ backend_argv[2] = argv[2];
++ backend_argv[3] = argv[3];
++ backend_argv[4] = (argc == 6 ? "1" : argv[4]);
++ backend_argv[5] = argv[5];
++ backend_argv[6] = filename;
++ backend_argv[7] = NULL;
++
++ snprintf(backend_path, sizeof(backend_path),
++ "%s/backend/%s", cups_serverbin, scheme);
+
+ /*
+ * Overwrite the device URI and run the actual backend...
+@@ -253,17 +261,41 @@ call_backend(char *uri, /* I - URI of final destination */
+ setenv("DEVICE_URI", uri, 1);
+
+ fprintf(stderr,
+- "DEBUG: beh: Executing backend command line \"%s\"...\n",
+- cmdline);
++ "DEBUG: beh: Executing backend command line \"%s '%s' '%s' '%s' '%s' '%s'%s%s\"...\n",
++ backend_path, backend_argv[1], backend_argv[2], backend_argv[3],
++ backend_argv[4], backend_argv[5],
++ (backend_argv[6] && backend_argv[6][0] ? " " : ""),
++ (backend_argv[6] && backend_argv[6][0] ? backend_argv[6] : ""));
+ fprintf(stderr,
+ "DEBUG: beh: Using device URI: %s\n",
+ uri);
+
+- retval = system(cmdline) >> 8;
++ if ((pid = fork()) == 0)
++ {
++ retval = execv(backend_path, backend_argv);
++
++ if (retval == -1)
++ fprintf(stderr, "ERROR: Unable to execute backend: %s\n",
++ strerror(errno));
++ exit (CUPS_BACKEND_FAILED);
++ }
++ else if (pid < 0)
++ {
++ fprintf(stderr, "ERROR: Unable to fork for backend\n");
++ return (CUPS_BACKEND_FAILED);
++ }
++
++ while ((wait_pid = wait(&wait_status)) < 0 && errno == EINTR);
+
+- if (retval == -1)
+- fprintf(stderr, "ERROR: Unable to execute backend command line: %s\n",
+- strerror(errno));
++ if (wait_pid >= 0 && wait_status)
++ {
++ if (WIFEXITED(wait_status))
++ retval = WEXITSTATUS(wait_status);
++ else if (WTERMSIG(wait_status) != SIGTERM)
++ retval = WTERMSIG(wait_status);
++ else
++ retval = 0;
++ }
+
+ return (retval);
+ }