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 <a...@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 <a...@samba.org> Reviewed=by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Mon Jun 6 17:42:37 UTC 2022 on sn-devel-184 commit 5f1f3b0f06327753ee939158c5ef826cc9514249 Author: Christian Ambach <a...@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 <a...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 470d4a3b61bc6924edcfc1453b01d7d6a8a6abdb Author: Christian Ambach <a...@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 <a...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 5e7965236435cc27bbcb9637133d4a73de7e57fd Author: Christian Ambach <a...@samba.org> Date: Sat May 7 20:37:34 2022 +0200 s3:smbd add missing VolumeCreationTime to FileFsVolumeInformation Signed-off-by: Christian Ambach <a...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 5f0b65654c7af41f7d9241d8e04927f29db3147b Author: Christian Ambach <a...@samba.org> Date: Sat May 7 20:35:43 2022 +0200 s3:include fix typo Signed-off-by: Christian Ambach <a...@samba.org> Reviewed-by: Jeremy Allison <j...@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