From f0abf62adcf4bda6dd7b36ce74695f8ac8ec79f6 Mon Sep 17 00:00:00 2001 From: Bryan Mason Date: Wed, 25 Sep 2019 18:49:56 -0700 Subject: [PATCH] s3:tests: Add smbspool test for CUPS-like "sanitized" Device URI in argv[0] Before calling a backend like smbspool, CUPS will set argv[0] to the "sanitized" Device URI (the Device URI with username/password information removed). These changes are intended to catch problems with smbspool that may be created by this behavior (like https://bugzilla.samba.org/show_bug.cgi?id=14128). source3/script/tests/smbspool_argv_wrapper.c: added to emulate CUPS-like behavior by setting argv[0] to the device URI before exec()ing smbspool. source3/script/tests/test_smbspool.sh: updated to use smbspool_argv_wrapper to test the CUPS-like behavior described above. Signed-off-by: Bryan Mason Reviewed-by: Andreas Schneider Reviewed-by: Alexander Bokovoy Autobuild-User(master): Andreas Schneider Autobuild-Date(master): Wed Oct 16 10:55:04 UTC 2019 on sn-devel-184 --- source3/script/tests/smbspool_argv_wrapper.c | 72 ++++++++++++++++++++ source3/script/tests/test_smbspool.sh | 23 +++++++ source3/wscript_build | 4 ++ 3 files changed, 99 insertions(+) create mode 100644 source3/script/tests/smbspool_argv_wrapper.c diff --git a/source3/script/tests/smbspool_argv_wrapper.c b/source3/script/tests/smbspool_argv_wrapper.c new file mode 100644 index 00000000000..7db788109d9 --- /dev/null +++ b/source3/script/tests/smbspool_argv_wrapper.c @@ -0,0 +1,72 @@ +/* + Wrapper for smbspool to test Device URI in argv[0] + + Copyright (C) Bryan Mason 2019 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include + +/* + * Before calling a backend like smbspool, CUPS will set argv[0] to + * the Device URI. This program wraps a program like smbspool and + * sets argv[0] to the device URI before exec()ing the acutal backend + * program. + */ + +int main(int argc, char *argv[], char *envp[]) +{ + char **new_argv; + char *exec_path; + int a; + int rv; +/* + * Expected parameters: + * + * smbspool_argv_wrapper smbspool uri job user title copies opts file(s) + * argv[0] 1 2 3 4 5 6 7 8 + * + */ + /* Allocate memory for the new arguments (exit on failure). */ + new_argv = calloc(argc, sizeof(char *)); + if (new_argv == 0) { + exit(ENOMEM); + } + + /* Save the path to the smbspool executable */ + exec_path = argv[1]; + + /* + * Shift the rest of the args so smbspool is called with: + * + * uri job user title copies opts file(s) + * argv[0] 1 2 3 4 5 6 + */ + + for (a = 2; a < argc-1; a++) { + new_argv[a-2] = argv[a]; + } + + /* Execute smbspool with new arguments */ + rv = execve(exec_path, new_argv, envp); + if (rv == -1) { + exit(errno); + } + + /* Avoid compiler error/warning */ + return 0; +} diff --git a/source3/script/tests/test_smbspool.sh b/source3/script/tests/test_smbspool.sh index f28c0909334..7ba03f01fc7 100755 --- a/source3/script/tests/test_smbspool.sh +++ b/source3/script/tests/test_smbspool.sh @@ -22,6 +22,7 @@ incdir=`dirname $0`/../../../testprogs/blackbox samba_bindir="$BINDIR" samba_vlp="$samba_bindir/vlp" samba_smbspool="$samba_bindir/smbspool" +samba_argv_wrapper="$samba_bindir/smbspool_argv_wrapper" samba_smbtorture3="$samba_bindir/smbtorture3" samba_smbspool_krb5="$samba_bindir/smbspool_krb5_wrapper" @@ -224,6 +225,28 @@ testit "smbspool print DEVICE_URI example.ps via stdin" \ 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 sanitized Device URI in argv0 example.ps" \ + $smbspool_argv_wrapper $samba_smbspool smb://$SERVER_IP/print1 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 sanitized Device URI in argv0 example.ps via stdin" \ + $smbspool_argv_wrapper $samba_smbspool smb://$SERVER_IP/print1 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) diff --git a/source3/wscript_build b/source3/wscript_build index 829636a77c5..94ea02ba61e 100644 --- a/source3/wscript_build +++ b/source3/wscript_build @@ -1151,6 +1151,10 @@ bld.SAMBA3_BINARY('smbspool_krb5_wrapper', install_path='${LIBEXECDIR}/samba', enabled=bld.CONFIG_SET('HAVE_CUPS')) +bld.SAMBA3_BINARY('smbspool_argv_wrapper', + source='script/tests/smbspool_argv_wrapper.c', + install=False) + bld.SAMBA3_BINARY('locktest2', source='torture/locktest2.c', deps=''' -- 2.47.3