[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Mon Jun 6 17:43:02 UTC 2022


The branch, master has been updated
       via  7ba732bac12 s3:smbd implement volume serial number parameter
       via  5f1f3b0f063 docs-xml: add new parameter volume serial number
       via  470d4a3b61b s3:smbd factor out volume serial number generation
       via  5e796523643 s3:smbd add missing VolumeCreationTime to FileFsVolumeInformation
       via  5f0b65654c7 s3:include fix typo
      from  b7810f03ffe selftests: Convert "net ads dns async" test to python

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 7ba732bac12319492da7cf8bafc268014a80360d
Author: Christian Ambach <ambi at samba.org>
Date:   Tue May 31 21:13:25 2022 +0200

    s3:smbd implement volume serial number parameter
    
    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 at samba.org>
    Reviewed=by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Mon Jun  6 17:42:37 UTC 2022 on sn-devel-184

commit 5f1f3b0f06327753ee939158c5ef826cc9514249
Author: Christian Ambach <ambi at samba.org>
Date:   Wed May 18 22:07:17 2022 +0200

    docs-xml: add new parameter volume serial number
    
    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 at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 470d4a3b61bc6924edcfc1453b01d7d6a8a6abdb
Author: Christian Ambach <ambi at samba.org>
Date:   Wed Apr 27 19:27:15 2022 +0200

    s3:smbd factor out volume serial number generation
    
    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 at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 5e7965236435cc27bbcb9637133d4a73de7e57fd
Author: Christian Ambach <ambi at samba.org>
Date:   Sat May 7 20:37:34 2022 +0200

    s3:smbd add missing VolumeCreationTime to FileFsVolumeInformation
    
    Signed-off-by: Christian Ambach <ambi at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 5f0b65654c7af41f7d9241d8e04927f29db3147b
Author: Christian Ambach <ambi at samba.org>
Date:   Sat May 7 20:35:43 2022 +0200

    s3:include fix typo
    
    Signed-off-by: Christian Ambach <ambi at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/smbdotconf/misc/volumeserialnumber.xml   | 14 ++++++++
 lib/param/loadparm.c                              |  1 +
 selftest/target/Samba3.pm                         |  7 ++++
 source3/include/trans2.h                          |  2 +-
 source3/param/loadparm.c                          |  1 +
 source3/script/tests/test_volume_serial_number.sh | 37 +++++++++++++++++++++
 source3/selftest/tests.py                         |  3 ++
 source3/smbd/smb2_trans2.c                        | 39 +++++++++++++++++------
 8 files changed, 94 insertions(+), 10 deletions(-)
 create mode 100644 docs-xml/smbdotconf/misc/volumeserialnumber.xml
 create mode 100755 source3/script/tests/test_volume_serial_number.sh


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/misc/volumeserialnumber.xml b/docs-xml/smbdotconf/misc/volumeserialnumber.xml
new file mode 100644
index 00000000000..41cf2c2785e
--- /dev/null
+++ b/docs-xml/smbdotconf/misc/volumeserialnumber.xml
@@ -0,0 +1,14 @@
+<samba:parameter name="volume serial number"
+                 context="S"
+                 type="integer"
+                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+<description>
+	<para>This allows to override the volume serial number
+	(a 32bit value) reported for a share.</para>
+	<para>The special value <emphasis>-1</emphasis> (default) stands for
+	a unique number that is calculated for each share.</para>
+</description>
+
+<value type="default">-1</value>
+<value type="example">0xabcdefgh</value>
+</samba:parameter>
diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
index ab73fbdda3d..599c4b00966 100644
--- a/lib/param/loadparm.c
+++ b/lib/param/loadparm.c
@@ -2529,6 +2529,7 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
 	lp_ctx->sDefault->aio_write_size = 1;
 	lp_ctx->sDefault->smbd_search_ask_sharemode = true;
 	lp_ctx->sDefault->smbd_getinfo_ask_sharemode = true;
+	lp_ctx->sDefault->volume_serial_number = -1;
 
 	DEBUG(3, ("Initialising global parameters\n"));
 
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index 4a86a77bb95..042fe10470f 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -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/include/trans2.h b/source3/include/trans2.h
index ff230171424..dfc59800846 100644
--- a/source3/include/trans2.h
+++ b/source3/include/trans2.h
@@ -413,7 +413,7 @@ Byte offset   Type     name                description
 #define SMB2_FILE_ALL_INFORMATION			(FSCC_FILE_ALL_INFORMATION + SMB2_INFO_SPECIAL)
 #define SMB2_FILE_POSIX_INFORMATION_INTERNAL		(SMB2_FILE_POSIX_INFORMATION + SMB2_INFO_SPECIAL)
 
-/* NT passthough levels for qfsinfo. */
+/* NT passthrough levels for qfsinfo. */
 
 #define SMB_FS_VOLUME_INFORMATION			(FSCC_FS_VOLUME_INFORMATION + NT_PASSTHROUGH_OFFSET)
 #define SMB_FS_LABEL_INFORMATION			(FSCC_FS_LABEL_INFORMATION + NT_PASSTHROUGH_OFFSET)
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index 1b7b0b06484..2b6e0bb248c 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -256,6 +256,7 @@ static const struct loadparm_service _sDefault =
 	.smbd_getinfo_ask_sharemode = true,
 	.spotlight_backend = SPOTLIGHT_BACKEND_NOINDEX,
 	.honor_change_notify_privilege = false,
+	.volume_serial_number = -1,
 	.dummy = ""
 };
 
diff --git a/source3/script/tests/test_volume_serial_number.sh b/source3/script/tests/test_volume_serial_number.sh
new file mode 100755
index 00000000000..b156d7087e6
--- /dev/null
+++ b/source3/script/tests/test_volume_serial_number.sh
@@ -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"
diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py
index 5502e498124..ff149aade4e 100755
--- a/source3/selftest/tests.py
+++ b/source3/selftest/tests.py
@@ -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'])
diff --git a/source3/smbd/smb2_trans2.c b/source3/smbd/smb2_trans2.c
index ba54c5ada6e..77bcfe33e13 100644
--- a/source3/smbd/smb2_trans2.c
+++ b/source3/smbd/smb2_trans2.c
@@ -59,6 +59,10 @@ static char *store_file_unix_basic_info2(connection_struct *conn,
 				files_struct *fsp,
 				const SMB_STRUCT_STAT *psbuf);
 
+static uint32_t generate_volume_serial_number(
+				const struct loadparm_substitution *lp_sub,
+				int snum);
+
 /****************************************************************************
  Check if an open file handle is a symlink.
 ****************************************************************************/
@@ -2121,6 +2125,7 @@ NTSTATUS smbd_do_qfsinfo(struct smbXsrv_connection *xconn,
 	SMB_STRUCT_STAT st;
 	NTSTATUS status = NT_STATUS_OK;
 	uint64_t df_ret;
+	uint32_t serial;
 
 	if (fname == NULL || fname->base_name == NULL) {
 		filename = ".";
@@ -2219,7 +2224,8 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_ex_dev, (u
 			 * Add volume serial number - hash of a combination of
 			 * the called hostname and the service name.
 			 */
-			SIVAL(pdata,0,str_checksum(lp_servicename(talloc_tos(), lp_sub, snum)) ^ (str_checksum(get_local_machine_name())<<16) );
+			serial = generate_volume_serial_number(lp_sub, snum);
+			SIVAL(pdata,0,serial);
 			/*
 			 * Win2k3 and previous mess this up by sending a name length
 			 * one byte short. I believe only older clients (OS/2 Win9x) use
@@ -2236,9 +2242,10 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_ex_dev, (u
 			}
 			SCVAL(pdata,l2_vol_cch,len);
 			data_len = l2_vol_szVolLabel + len;
-			DEBUG(5,("smbd_do_qfsinfo : time = %x, namelen = %u, name = %s\n",
+			DEBUG(5,("smbd_do_qfsinfo : time = %x, namelen = %u, "
+				 "name = %s serial = 0x%04"PRIx32"\n",
 				 (unsigned)convert_timespec_to_time_t(st.st_ex_ctime),
-				 (unsigned)len, vname));
+				 (unsigned)len, vname, serial));
 			break;
 
 		case SMB_QUERY_FS_ATTRIBUTE_INFO:
@@ -2296,13 +2303,14 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_ex_dev, (u
 
 		case SMB_QUERY_FS_VOLUME_INFO:      
 		case SMB_FS_VOLUME_INFORMATION:
-
+			put_long_date_full_timespec(TIMESTAMP_SET_NT_OR_BETTER,
+						    pdata, &st.st_ex_btime);
 			/* 
 			 * Add volume serial number - hash of a combination of
 			 * the called hostname and the service name.
 			 */
-			SIVAL(pdata,8,str_checksum(lp_servicename(talloc_tos(), lp_sub, snum)) ^
-				(str_checksum(get_local_machine_name())<<16));
+			serial = generate_volume_serial_number(lp_sub, snum);
+			SIVAL(pdata,8,serial);
 
 			/* Max label len is 32 characters. */
 			status = srvstr_push(pdata, flags2, pdata+18, vname,
@@ -2314,9 +2322,12 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)st.st_ex_dev, (u
 			SIVAL(pdata,12,len);
 			data_len = 18+len;
 
-			DEBUG(5,("smbd_do_qfsinfo : SMB_QUERY_FS_VOLUME_INFO namelen = %d, vol=%s serv=%s\n",
-				(int)strlen(vname),vname,
-				lp_servicename(talloc_tos(), lp_sub, snum)));
+			DEBUG(5,("smbd_do_qfsinfo : SMB_QUERY_FS_VOLUME_INFO "
+				 "namelen = %d, vol=%s serv=%s "
+				 "serial=0x%04"PRIx32"\n",
+				 (int)strlen(vname),vname,
+				 lp_servicename(talloc_tos(), lp_sub, snum),
+				 serial));
 			if (max_data_bytes >= 24 && data_len > max_data_bytes) {
 				/* the client only requested a portion of the
 				   volume label */
@@ -6956,3 +6967,13 @@ NTSTATUS smbd_do_setfilepathinfo(connection_struct *conn,
 	*ret_data_size = data_return_size;
 	return NT_STATUS_OK;
 }
+
+static uint32_t generate_volume_serial_number(
+			const struct loadparm_substitution *lp_sub,
+			int 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);
+}


-- 
Samba Shared Repository



More information about the samba-cvs mailing list