]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:smbd implement volume serial number parameter
authorChristian Ambach <ambi@samba.org>
Tue, 31 May 2022 19:13:25 +0000 (21:13 +0200)
committerJeremy Allison <jra@samba.org>
Mon, 6 Jun 2022 17:42:37 +0000 (17:42 +0000)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14765
RN: add new smb.conf parameter "volume serial number" to allow overriding
the generated default value

Signed-off-by: Christian Ambach <ambi@samba.org>
Reviewed=by: Jeremy Allison <jra@samba.org>

Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Mon Jun  6 17:42:37 UTC 2022 on sn-devel-184

selftest/target/Samba3.pm
source3/script/tests/test_volume_serial_number.sh [new file with mode: 0755]
source3/selftest/tests.py
source3/smbd/smb2_trans2.c

index 4a86a77bb95ae0412e2be687c590f8a652277825..042fe10470f517b05b0dccc5b2ef31943ac87fa2 100755 (executable)
@@ -1783,6 +1783,9 @@ sub setup_fileserver
        push(@dirs, "$delete_unwrite_sharedir/delete_veto_yes");
        push(@dirs, "$delete_unwrite_sharedir/delete_veto_no");
 
+       my $volume_serial_number_sharedir="$share_dir/volume_serial_number";
+       push(@dirs, $volume_serial_number_sharedir);
+
        my $ip4 = Samba::get_ipv4_addr("FILESERVER");
        my $fileserver_options = "
        kernel change notify = yes
@@ -1928,6 +1931,10 @@ sub setup_fileserver
        virusfilter:infected file action = rename
        virusfilter:scan on close = yes
 
+[volumeserialnumber]
+       path = $volume_serial_number_sharedir
+       volume serial number = 0xdeadbeef
+
 [homes]
        comment = Home directories
        browseable = No
diff --git a/source3/script/tests/test_volume_serial_number.sh b/source3/script/tests/test_volume_serial_number.sh
new file mode 100755 (executable)
index 0000000..b156d70
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# This verifies setting the volume serial number parameter for a share works.
+#
+
+if [ $# -lt 5 ]; then
+    echo "Usage: $0 SERVER_IP USERNAME PASSWORD SHARENAME SMBCLIENT"
+    exit 1
+fi
+
+SERVER_IP="$1"
+USERNAME="$2"
+PASSWORD="$3"
+SHARENAME="$4"
+SMBCLIENT="$5"
+
+SMBCLIENT="$VALGRIND ${SMBCLIENT}"
+failed=0
+
+incdir=$(dirname "$0")/../../../testprogs/blackbox
+. "$incdir/subunit.sh"
+
+test_serial_number() {
+
+    output=$($SMBCLIENT "//$SERVER_IP/$SHARENAME" -U "$USERNAME%$PASSWORD" -c "volume") || return 1
+    echo "smbclient volume on $SHARENAME returned: \"$output\""
+
+    expected="0xdeadbeef"
+    echo "$output" | grep $expected || {
+        echo "Expected output containing \"$expected\", got: \"$output\""
+        return 1
+    }
+}
+
+testit "volume serial number for share $SHARENAME" test_serial_number || failed=$((failed+1))
+
+exit "$failed"
index 5502e4981248e3bd7760ae6f5d85d49dfd409315..ff149aade4e9093229dc987fcad3678256e855f4 100755 (executable)
@@ -574,6 +574,9 @@ for env in ["fileserver"]:
     plantestsuite("samba3.blackbox.timestamps", env,
                   [os.path.join(samba3srcdir, "script/tests/test_timestamps.sh"),
                    '$SERVER_IP', '$USERNAME', '$PASSWORD', '$LOCAL_PATH', smbclient3])
+    plantestsuite("samba3.blackbox.volumeserialnumber", env,
+                  [os.path.join(samba3srcdir, "script/tests/test_volume_serial_number.sh"),
+                   '$SERVER_IP', '$USERNAME', '$PASSWORD', 'volumeserialnumber', smbclient3])
     plantestsuite("samba3.blackbox.smb1_system_security", env + "_smb1_done",
                   [os.path.join(samba3srcdir, "script/tests/test_smb1_system_security.sh"),
                    '$SERVER', '$SERVER_IP', '$USERNAME', '$PASSWORD', smbtorture3, net, 'tmp'])
index 633309f00765b0d77084c1c1fcabe554f33ed51a..77bcfe33e13ec56f77af9f71efa3554b2280e8eb 100644 (file)
@@ -6972,6 +6972,8 @@ static uint32_t generate_volume_serial_number(
                        const struct loadparm_substitution *lp_sub,
                        int snum)
 {
-       return str_checksum(lp_servicename(talloc_tos(), lp_sub, snum)) ^
+       int serial = lp_volume_serial_number(snum);
+       return serial != -1 ? serial:
+               str_checksum(lp_servicename(talloc_tos(), lp_sub, snum)) ^
                (str_checksum(get_local_machine_name())<<16);
 }