diff --git a/samba-4.8.2-fix_smbspool_cmdline.patch b/samba-4.8.2-fix_smbspool_cmdline.patch new file mode 100644 index 0000000..e04abd2 --- /dev/null +++ b/samba-4.8.2-fix_smbspool_cmdline.patch @@ -0,0 +1,228 @@ +From ae206fe3027873138d36240b3be8bc582ab0aac6 Mon Sep 17 00:00:00 2001 +From: Andreas Schneider +Date: Fri, 5 Jan 2018 10:50:57 +0100 +Subject: [PATCH 1/2] smbspool: Improve URI handling code + +This also checks that the URI given via the environment variables +starts with smb:// + +Signed-off-by: Andreas Schneider +Reviewed-by: Alexander Bokovoy +Reviewed-by: David Disseldorp +(cherry picked from commit a6eac8f64989235e7a297c14e349d98a3fc70e47) +--- + source3/client/smbspool.c | 29 ++++++++++++++++++----------- + 1 file changed, 18 insertions(+), 11 deletions(-) + +diff --git a/source3/client/smbspool.c b/source3/client/smbspool.c +index 3b732c99234..ff32baea204 100644 +--- a/source3/client/smbspool.c ++++ b/source3/client/smbspool.c +@@ -100,6 +100,8 @@ main(int argc, /* I - Number of command-line arguments */ + const char *dev_uri; + const char *config_file = NULL; + TALLOC_CTX *frame = talloc_stackframe(); ++ int cmp; ++ int len; + + null_str[0] = '\0'; + +@@ -155,20 +157,25 @@ main(int argc, /* I - Number of command-line arguments */ + } + + /* +- * Find the URI... +- */ +- ++ * Find the URI ... ++ */ + dev_uri = getenv("DEVICE_URI"); +- if (dev_uri) { +- strncpy(uri, dev_uri, sizeof(uri) - 1); +- } else if (strncmp(argv[1], "smb://", 6) == 0) { +- strncpy(uri, argv[1], sizeof(uri) - 1); +- } else { +- fputs("ERROR: No device URI found in DEVICE_URI environment variable or arg1 !\n", stderr); +- goto done; ++ if (dev_uri == NULL || strlen(dev_uri) == 0) { ++ dev_uri = argv[1]; + } + +- uri[sizeof(uri) - 1] = '\0'; ++ cmp = strncmp(dev_uri, "smb://", 6); ++ if (cmp != 0) { ++ fprintf(stderr, ++ "ERROR: No valid device URI has been specified\n"); ++ goto done; ++ } ++ len = snprintf(uri, sizeof(uri), "%s", dev_uri); ++ if (len >= sizeof(uri)) { ++ fprintf(stderr, ++ "ERROR: The URI is too long.\n"); ++ goto done; ++ } + + /* + * Extract the destination from the URI... +-- +2.16.3 + + +From c19801fa6551c601ec3e7f5a983f2bc1a9bc6597 Mon Sep 17 00:00:00 2001 +From: Andreas Schneider +Date: Thu, 3 May 2018 10:17:12 +0200 +Subject: [PATCH 2/2] s3:smbspool: Fix cmdline argument handling + +BUG: https://bugzilla.samba.org/show_bug.cgi?id=13417 + +Signed-off-by: Andreas Schneider +Reviewed-by: Alexander Bokovoy +(cherry picked from commit a753ccfd946aaad320977ae8c5f483f73077c3f8) +--- + source3/client/smbspool.c | 61 ++++++++++++++++++++++++----------- + source3/script/tests/test_smbspool.sh | 30 +++++++++++++++++ + 2 files changed, 72 insertions(+), 19 deletions(-) + +diff --git a/source3/client/smbspool.c b/source3/client/smbspool.c +index ff32baea204..d6e944d547c 100644 +--- a/source3/client/smbspool.c ++++ b/source3/client/smbspool.c +@@ -100,6 +100,9 @@ main(int argc, /* I - Number of command-line arguments */ + const char *dev_uri; + const char *config_file = NULL; + TALLOC_CTX *frame = talloc_stackframe(); ++ bool device_uri_cmdline = false; ++ const char *print_file = NULL; ++ const char *print_copies = NULL; + int cmp; + int len; + +@@ -119,7 +122,12 @@ main(int argc, /* I - Number of command-line arguments */ + goto done; + } + +- if (argc < 7 || argc > 8) { ++ /* ++ * We need at least 5 options if the DEVICE_URI is passed via an env ++ * variable and printing data comes via stdin. ++ * We don't accept more than 7 options in total, including optional. ++ */ ++ if (argc < 5 || argc > 8) { + fprintf(stderr, + "Usage: %s [DEVICE_URI] job-id user title copies options [file]\n" + " The DEVICE_URI environment variable can also contain the\n" +@@ -131,37 +139,52 @@ main(int argc, /* I - Number of command-line arguments */ + } + + /* +- * If we have 7 arguments, print the file named on the command-line. +- * Otherwise, print data from stdin... +- */ +- ++ * If we have 6 arguments find out if we have the device_uri from the ++ * command line or the print data ++ */ + if (argc == 7) { +- /* +- * Print from Copy stdin to a temporary file... +- */ ++ cmp = strncmp(argv[1], "smb://", 6); ++ if (cmp == 0) { ++ device_uri_cmdline = true; ++ } else { ++ print_copies = argv[4]; ++ print_file = argv[6]; ++ } ++ } else if (argc == 8) { ++ device_uri_cmdline = true; ++ print_copies = argv[5]; ++ print_file = argv[7]; ++ } + +- fp = stdin; +- copies = 1; +- } else if ((fp = fopen(argv[7], "rb")) == NULL) { +- perror("ERROR: Unable to open print file"); +- goto done; +- } else { +- char *p = argv[5]; ++ if (print_file != NULL) { + char *endp; + +- copies = strtol(p, &endp, 10); +- if (p == endp) { ++ fp = fopen(print_file, "rb"); ++ if (fp == NULL) { ++ perror("ERROR: Unable to open print file"); ++ goto done; ++ } ++ ++ copies = strtol(print_copies, &endp, 10); ++ if (print_copies == endp) { + perror("ERROR: Unable to determine number of copies"); + goto done; + } ++ } else { ++ fp = stdin; ++ copies = 1; + } + + /* + * Find the URI ... + */ +- dev_uri = getenv("DEVICE_URI"); +- if (dev_uri == NULL || strlen(dev_uri) == 0) { ++ if (device_uri_cmdline) { + dev_uri = argv[1]; ++ } else { ++ dev_uri = getenv("DEVICE_URI"); ++ if (dev_uri == NULL || strlen(dev_uri) == 0) { ++ dev_uri = ""; ++ } + } + + cmp = strncmp(dev_uri, "smb://", 6); +diff --git a/source3/script/tests/test_smbspool.sh b/source3/script/tests/test_smbspool.sh +index 8f9426f87ba..899b34d0e40 100755 +--- a/source3/script/tests/test_smbspool.sh ++++ b/source3/script/tests/test_smbspool.sh +@@ -135,6 +135,36 @@ testit "smbspool print example.ps" \ + $samba_smbspool smb://$USERNAME:$PASSWORD@$SERVER_IP/print1 200 $USERNAME "Testprint" 1 "options" $SRCDIR/testdata/printing/example.ps || \ + failed=$(expr $failed + 1) + ++testit "vlp verify example.ps" \ ++ test_vlp_verify \ ++ || failed=$(expr $failed + 1) ++ ++testit "smbspool print example.ps via stdin" \ ++ $samba_smbspool smb://$USERNAME:$PASSWORD@$SERVER_IP/print1 200 $USERNAME "Testprint" 1 "options" < $SRCDIR/testdata/printing/example.ps || \ ++ failed=$(expr $failed + 1) ++ ++testit "vlp verify example.ps" \ ++ test_vlp_verify \ ++ || failed=$(expr $failed + 1) ++ ++DEVICE_URI="smb://$USERNAME:$PASSWORD@$SERVER_IP/print1" ++export DEVICE_URI ++testit "smbspool print DEVICE_URI example.ps" \ ++ $samba_smbspool 200 $USERNAME "Testprint" 1 "options" $SRCDIR/testdata/printing/example.ps || \ ++ failed=$(expr $failed + 1) ++unset DEVICE_URI ++ ++testit "vlp verify example.ps" \ ++ test_vlp_verify \ ++ || failed=$(expr $failed + 1) ++ ++DEVICE_URI="smb://$USERNAME:$PASSWORD@$SERVER_IP/print1" ++export DEVICE_URI ++testit "smbspool print DEVICE_URI example.ps via stdin" \ ++ $samba_smbspool 200 $USERNAME "Testprint" 1 "options" < $SRCDIR/testdata/printing/example.ps || \ ++ failed=$(expr $failed + 1) ++unset DEVICE_URI ++ + testit "vlp verify example.ps" \ + test_vlp_verify \ + || failed=$(expr $failed + 1) +-- +2.16.3 + diff --git a/samba.spec b/samba.spec index 75148ca..0171503 100644 --- a/samba.spec +++ b/samba.spec @@ -122,6 +122,8 @@ Source14: samba.pamd Source200: README.dc Source201: README.downgrade +Patch0: samba-4.8.2-fix_smbspool_cmdline.patch + Requires(pre): /usr/sbin/groupadd Requires(post): systemd Requires(preun): systemd @@ -3551,6 +3553,9 @@ fi %endif # with_clustering_support %changelog +* Wed May 09 2018 Andreas Schneider - 4.8.1-1 +- resolves: #1574177 - Fix smbspool command line argument handling + * Thu Apr 26 2018 Guenther Deschner - 4.8.1-0 - Update to Samba 4.8.1