From 1fa7668ee827e0ccac4e15c257d73bf5de2ed701 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 2 May 2024 16:34:43 +0200 Subject: [PATCH] smbd: Use reparse_buffer_check() in fsctl_set_reparse_point() check_reparse_data_buffer() was duplicated code Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- libcli/smb/reparse.c | 10 +++++----- libcli/smb/reparse.h | 5 +++++ source3/modules/util_reparse.c | 42 +++++++++++++++--------------------------- 3 files changed, 25 insertions(+), 32 deletions(-) diff --git a/libcli/smb/reparse.c b/libcli/smb/reparse.c index ab0cf39e8a9..08071ca85d7 100644 --- a/libcli/smb/reparse.c +++ b/libcli/smb/reparse.c @@ -26,11 +26,11 @@ #include "lib/util/charset/charset.h" #include "smb_util.h" -static NTSTATUS reparse_buffer_check(const uint8_t *in_data, - size_t in_len, - uint32_t *reparse_tag, - const uint8_t **_reparse_data, - size_t *_reparse_data_length) +NTSTATUS reparse_buffer_check(const uint8_t *in_data, + size_t in_len, + uint32_t *reparse_tag, + const uint8_t **_reparse_data, + size_t *_reparse_data_length) { uint16_t reparse_data_length; diff --git a/libcli/smb/reparse.h b/libcli/smb/reparse.h index 23274bf3852..e4410d974e4 100644 --- a/libcli/smb/reparse.h +++ b/libcli/smb/reparse.h @@ -63,6 +63,11 @@ struct reparse_data_buffer { } parsed; }; +NTSTATUS reparse_buffer_check(const uint8_t *in_data, + size_t in_len, + uint32_t *reparse_tag, + const uint8_t **_reparse_data, + size_t *_reparse_data_length); NTSTATUS reparse_data_buffer_parse(TALLOC_CTX *mem_ctx, struct reparse_data_buffer *dst, const uint8_t *buf, diff --git a/source3/modules/util_reparse.c b/source3/modules/util_reparse.c index 8c5bf66edf0..1e61dcf67e4 100644 --- a/source3/modules/util_reparse.c +++ b/source3/modules/util_reparse.c @@ -20,6 +20,7 @@ #include "includes.h" #include "util_reparse.h" +#include "libcli/smb/reparse.h" NTSTATUS fsctl_get_reparse_point(struct files_struct *fsp, TALLOC_CTX *mem_ctx, @@ -32,46 +33,33 @@ NTSTATUS fsctl_get_reparse_point(struct files_struct *fsp, return NT_STATUS_NOT_A_REPARSE_POINT; } -static NTSTATUS check_reparse_data_buffer( - const uint8_t *in_data, size_t in_len) -{ - uint16_t reparse_data_length; - - if (in_len == 0) { - DBG_DEBUG("in_len=0\n"); - return NT_STATUS_INVALID_BUFFER_SIZE; - } - if (in_len < 8) { - DBG_DEBUG("in_len=%zu\n", in_len); - return NT_STATUS_IO_REPARSE_DATA_INVALID; - } - - reparse_data_length = PULL_LE_U16(in_data, 4); - - if (reparse_data_length != (in_len - 8)) { - DBG_DEBUG("in_len=%zu, reparse_data_length=%"PRIu16"\n", - in_len, - reparse_data_length); - return NT_STATUS_IO_REPARSE_DATA_INVALID; - } - - return NT_STATUS_OK; -} - NTSTATUS fsctl_set_reparse_point(struct files_struct *fsp, TALLOC_CTX *mem_ctx, const uint8_t *in_data, uint32_t in_len) { + uint32_t reparse_tag; + const uint8_t *reparse_data = NULL; + size_t reparse_data_length; NTSTATUS status; DBG_DEBUG("Called on %s\n", fsp_str_dbg(fsp)); - status = check_reparse_data_buffer(in_data, in_len); + status = reparse_buffer_check(in_data, + in_len, + &reparse_tag, + &reparse_data, + &reparse_data_length); if (!NT_STATUS_IS_OK(status)) { + DBG_DEBUG("check_reparse_data_buffer failed: %s\n", + nt_errstr(status)); return status; } + DBG_DEBUG("reparse tag=%" PRIX32 ", length=%zu\n", + reparse_tag, + reparse_data_length); + return NT_STATUS_NOT_A_REPARSE_POINT; } -- 2.11.4.GIT