From: Volker Lendecke Date: Fri, 5 Jul 2024 15:58:55 +0000 (+0200) Subject: smbd: Report FIFOs as NFS style reparse points X-Git-Tag: tdb-1.4.11~144 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=57b6a8539f570195b1b33e2757e4c93bd9666359;p=thirdparty%2Fsamba.git smbd: Report FIFOs as NFS style reparse points Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/selftest/knownfail.d/reparse b/selftest/knownfail.d/reparse index 03e158ad6be..11d094aa5c6 100644 --- a/selftest/knownfail.d/reparse +++ b/selftest/knownfail.d/reparse @@ -1,3 +1,2 @@ ^samba.tests.reparsepoints.samba.tests.reparsepoints.ReparsePoints.test_create_reparse_directory ^samba.tests.reparsepoints.samba.tests.reparsepoints.ReparsePoints.test_create_reparse_nonempty_directory -^samba.tests.reparsepoints.samba.tests.reparsepoints.ReparsePoints.test_fifo_reparse diff --git a/source3/modules/util_reparse.c b/source3/modules/util_reparse.c index 5c7ae670d0b..b375cfa112a 100644 --- a/source3/modules/util_reparse.c +++ b/source3/modules/util_reparse.c @@ -73,6 +73,42 @@ fail: return status; } +static NTSTATUS fsctl_get_reparse_point_fifo(struct files_struct *fsp, + 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_SPECFILE_FIFO, + }; + uint8_t *out_data = NULL; + ssize_t out_len; + + out_len = reparse_data_buffer_marshall(&reparse_data, NULL, 0); + if (out_len == -1) { + return NT_STATUS_INSUFFICIENT_RESOURCES; + } + if (max_out_len < out_len) { + return NT_STATUS_BUFFER_TOO_SMALL; + } + + out_data = talloc_array(ctx, uint8_t, out_len); + if (out_data == NULL) { + return NT_STATUS_NO_MEMORY; + } + + reparse_data_buffer_marshall(&reparse_data, + out_data, + out_len); + + *_out_data = out_data; + *_out_len = out_len; + + return NT_STATUS_OK; +} + NTSTATUS fsctl_get_reparse_point(struct files_struct *fsp, TALLOC_CTX *mem_ctx, uint32_t *_reparse_tag, @@ -99,6 +135,11 @@ NTSTATUS fsctl_get_reparse_point(struct files_struct *fsp, status = fsctl_get_reparse_point_reg( fsp, mem_ctx, &out_data, max_out_len, &out_len); break; + case S_IFIFO: + DBG_DEBUG("%s is a fifo\n", fsp_str_dbg(fsp)); + status = fsctl_get_reparse_point_fifo( + fsp, mem_ctx, &out_data, max_out_len, &out_len); + break; default: break; }