]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: Report FIFOs as NFS style reparse points
authorVolker Lendecke <vl@samba.org>
Fri, 5 Jul 2024 15:58:55 +0000 (17:58 +0200)
committerJeremy Allison <jra@samba.org>
Fri, 12 Jul 2024 20:35:34 +0000 (20:35 +0000)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
selftest/knownfail.d/reparse
source3/modules/util_reparse.c

index 03e158ad6bed5792c18747b74859dfe3566ee57f..11d094aa5c698580b2c4be996fbc38800cd8ef66 100644 (file)
@@ -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
index 5c7ae670d0bfa7c8380e39272829775b6cb08d8b..b375cfa112af7122e5dab66d91d6b37794509ea3 100644 (file)
@@ -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;
        }