From: Volker Lendecke Date: Mon, 8 Jul 2024 09:23:14 +0000 (+0200) Subject: smbd: Show blk and chr devices as nfs reparse points X-Git-Tag: tdb-1.4.11~138 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bbe2c82f620e692272f6292ff86b4a2167e0d6c4;p=thirdparty%2Fsamba.git smbd: Show blk and chr devices as nfs reparse points Can't test these in selftest, we can't create devices and I don't want us to depend on /dev to exist. Tested manually on a system where /dev/null exists: Try "help" to get a list of possible commands. smb: \> allinfo null altname: null create_time: Fri Jun 21 02:45:59 PM 2024 CEST access_time: Fri Jun 21 02:45:59 PM 2024 CEST write_time: Fri Jun 21 02:45:59 PM 2024 CEST change_time: Fri Jun 21 02:45:59 PM 2024 CEST attributes: (480) stream: [::$DATA], 0 bytes 0x80000014 (IO_REPARSE_TAG_NFS) 0x524843 (NFS_SPECFILE_CHR) 1/3 smb: \> Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Fri Jul 12 21:36:16 UTC 2024 on atb-devel-224 --- diff --git a/source3/modules/util_reparse.c b/source3/modules/util_reparse.c index 9a2ae531e7f..2694410be4f 100644 --- a/source3/modules/util_reparse.c +++ b/source3/modules/util_reparse.c @@ -135,6 +135,25 @@ static NTSTATUS fsctl_get_reparse_point_sock(struct files_struct *fsp, fsp, &reparse_data, ctx, _out_data, max_out_len, _out_len); } +static NTSTATUS fsctl_get_reparse_point_dev(struct files_struct *fsp, + uint64_t nfs_type, + dev_t rdev, + TALLOC_CTX *ctx, + uint8_t **_out_data, + uint32_t max_out_len, + uint32_t *_out_len) +{ + struct reparse_data_buffer reparse_data = { + .tag = IO_REPARSE_TAG_NFS, + .parsed.nfs.type = nfs_type, + .parsed.nfs.data.dev.major = unix_dev_major(rdev), + .parsed.nfs.data.dev.minor = unix_dev_minor(rdev), + }; + + return fsctl_get_reparse_point_int( + fsp, &reparse_data, ctx, _out_data, max_out_len, _out_len); +} + NTSTATUS fsctl_get_reparse_point(struct files_struct *fsp, TALLOC_CTX *mem_ctx, uint32_t *_reparse_tag, @@ -171,6 +190,28 @@ NTSTATUS fsctl_get_reparse_point(struct files_struct *fsp, status = fsctl_get_reparse_point_sock( fsp, mem_ctx, &out_data, max_out_len, &out_len); break; + case S_IFBLK: + DBG_DEBUG("%s is a block device\n", fsp_str_dbg(fsp)); + status = fsctl_get_reparse_point_dev( + fsp, + NFS_SPECFILE_BLK, + fsp->fsp_name->st.st_ex_rdev, + mem_ctx, + &out_data, + max_out_len, + &out_len); + break; + case S_IFCHR: + DBG_DEBUG("%s is a character device\n", fsp_str_dbg(fsp)); + status = fsctl_get_reparse_point_dev( + fsp, + NFS_SPECFILE_CHR, + fsp->fsp_name->st.st_ex_rdev, + mem_ctx, + &out_data, + max_out_len, + &out_len); + break; default: break; } diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index 4ceb618e360..c5eeb68f2c6 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -719,6 +719,8 @@ uint32_t fdos_mode(struct files_struct *fsp) break; case S_IFIFO: case S_IFSOCK: + case S_IFBLK: + case S_IFCHR: return FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_REPARSE_POINT; break; default: