]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libsmb: Move symlink_reparse_buffer_parse() to reparse.c
authorVolker Lendecke <vl@samba.org>
Tue, 1 Aug 2023 13:57:50 +0000 (15:57 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 10 Aug 2023 13:40:31 +0000 (13:40 +0000)
The goal of this is to eventually remove reparse_symlink.c once we
have marshalling routines for symlinks in reparse.c

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
libcli/smb/py_reparse_symlink.c
libcli/smb/reparse.c
libcli/smb/reparse.h
libcli/smb/reparse_symlink.c
libcli/smb/reparse_symlink.h
source3/libsmb/clisymlink.c
source3/libsmb/pylibsmb.c
source3/smbd/dir.c
source3/smbd/filename.c
source3/smbd/files.c

index 44f6e4850cdba09a00e1dbe0e6bbf41f618b8069..7aecc4fd38a2075b3dd5d261669e9c770c425b86 100644 (file)
@@ -22,6 +22,7 @@
 #include "python/py3compat.h"
 #include "libcli/util/pyerrors.h"
 #include "reparse.h"
+#include "reparse_symlink.h"
 #include "smb_constants.h"
 
 static PyObject *py_reparse_put(PyObject *module, PyObject *args)
index e38154f26a63a8b2b402bdc10b1a01c88e681ee5..61b893123a4c26e8c073881007bbc63c84e894c4 100644 (file)
@@ -22,6 +22,7 @@
 #include "lib/util/debug.h"
 #include "lib/util/bytearray.h"
 #include "lib/util/charset/charset.h"
+#include "smb_util.h"
 
 static NTSTATUS reparse_buffer_check(const uint8_t *in_data,
                                     size_t in_len,
@@ -112,6 +113,100 @@ static int nfs_reparse_buffer_parse(TALLOC_CTX *mem_ctx,
        return 0;
 }
 
+static int symlink_reparse_buffer_parse(TALLOC_CTX *mem_ctx,
+                                       struct symlink_reparse_struct *dst,
+                                       const uint8_t *src,
+                                       size_t srclen)
+{
+       uint16_t reparse_data_length;
+       uint16_t substitute_name_offset, substitute_name_length;
+       uint16_t print_name_offset, print_name_length;
+       bool ok;
+
+       if (srclen < 20) {
+               DBG_DEBUG("srclen = %zu, expected >= 20\n", srclen);
+               return EINVAL;
+       }
+       if (PULL_LE_U32(src, 0) != IO_REPARSE_TAG_SYMLINK) {
+               DBG_DEBUG("Got ReparseTag %8.8x, expected %8.8x\n",
+                         PULL_LE_U32(src, 0),
+                         IO_REPARSE_TAG_SYMLINK);
+               return EINVAL;
+       }
+
+       reparse_data_length     = PULL_LE_U16(src, 4);
+       substitute_name_offset  = PULL_LE_U16(src, 8);
+       substitute_name_length  = PULL_LE_U16(src, 10);
+       print_name_offset       = PULL_LE_U16(src, 12);
+       print_name_length       = PULL_LE_U16(src, 14);
+
+       if (reparse_data_length < 12) {
+               DBG_DEBUG("reparse_data_length = %"PRIu16", expected >= 12\n",
+                         reparse_data_length);
+               return EINVAL;
+       }
+       if (smb_buffer_oob(srclen - 8, reparse_data_length, 0)) {
+               DBG_DEBUG("reparse_data_length (%"PRIu16") too large for "
+                          "src_len (%zu)\n",
+                         reparse_data_length,
+                         srclen);
+               return EINVAL;
+       }
+       if (smb_buffer_oob(reparse_data_length - 12, substitute_name_offset,
+                          substitute_name_length)) {
+               DBG_DEBUG("substitute_name (%"PRIu16"/%"PRIu16") does not fit "
+                         "in reparse_data_length (%"PRIu16")\n",
+                         substitute_name_offset,
+                         substitute_name_length,
+                         reparse_data_length - 12);
+               return EINVAL;
+       }
+       if (smb_buffer_oob(reparse_data_length - 12, print_name_offset,
+                          print_name_length)) {
+               DBG_DEBUG("print_name (%"PRIu16"/%"PRIu16") does not fit in "
+                         "reparse_data_length (%"PRIu16")\n",
+                         print_name_offset,
+                         print_name_length,
+                         reparse_data_length - 12);
+               return EINVAL;
+       }
+
+       *dst = (struct symlink_reparse_struct) {
+               .unparsed_path_length = PULL_LE_U16(src, 6),
+               .flags = PULL_LE_U32(src, 16),
+       };
+
+       ok = convert_string_talloc(mem_ctx,
+                                  CH_UTF16,
+                                  CH_UNIX,
+                                  src + 20 + substitute_name_offset,
+                                  substitute_name_length,
+                                  &dst->substitute_name,
+                                  NULL);
+       if (!ok) {
+               int ret = errno;
+               DBG_DEBUG("convert_string_talloc for substitute_name "
+                         "failed\n");
+               return ret;
+       }
+
+       ok = convert_string_talloc(mem_ctx,
+                                  CH_UTF16,
+                                  CH_UNIX,
+                                  src + 20 + print_name_offset,
+                                  print_name_length,
+                                  &dst->print_name,
+                                  NULL);
+       if (!ok) {
+               int ret = errno;
+               DBG_DEBUG("convert_string_talloc for print_name failed\n");
+               TALLOC_FREE(dst->substitute_name);
+               return ret;
+       }
+
+       return 0;
+}
+
 NTSTATUS reparse_data_buffer_parse(TALLOC_CTX *mem_ctx,
                                   struct reparse_data_buffer *dst,
                                   const uint8_t *buf,
index 3327ef55338e27ba1088e3d026c0cbf08da8bc11..aeeaf116ebaa5b2dc4bea152c44d2f8c9193d544 100644 (file)
 
 #include <talloc.h>
 #include "replace.h"
-#include "libcli/smb/reparse_symlink.h"
 #include "libcli/util/ntstatus.h"
 
+struct symlink_reparse_struct {
+       uint16_t unparsed_path_length; /* reserved for the reparse point */
+       char *substitute_name;
+       char *print_name;
+       uint32_t flags;
+};
+
 struct nfs_reparse_data_buffer {
        uint64_t type;
 
index 6f8b7c9b430a9db8a8e496308d5540263b120744..b99cca261d73350dd8a9be521420736f14f705dd 100644 (file)
@@ -165,97 +165,3 @@ fail:
        TALLOC_FREE(print_utf16);
        return ret;
 }
-
-int symlink_reparse_buffer_parse(TALLOC_CTX *mem_ctx,
-                                struct symlink_reparse_struct *dst,
-                                const uint8_t *src,
-                                size_t srclen)
-{
-       uint16_t reparse_data_length;
-       uint16_t substitute_name_offset, substitute_name_length;
-       uint16_t print_name_offset, print_name_length;
-       bool ok;
-
-       if (srclen < 20) {
-               DBG_DEBUG("srclen = %zu, expected >= 20\n", srclen);
-               return EINVAL;
-       }
-       if (PULL_LE_U32(src, 0) != IO_REPARSE_TAG_SYMLINK) {
-               DBG_DEBUG("Got ReparseTag %8.8x, expected %8.8x\n",
-                         PULL_LE_U32(src, 0),
-                         IO_REPARSE_TAG_SYMLINK);
-               return EINVAL;
-       }
-
-       reparse_data_length     = PULL_LE_U16(src, 4);
-       substitute_name_offset  = PULL_LE_U16(src, 8);
-       substitute_name_length  = PULL_LE_U16(src, 10);
-       print_name_offset       = PULL_LE_U16(src, 12);
-       print_name_length       = PULL_LE_U16(src, 14);
-
-       if (reparse_data_length < 12) {
-               DBG_DEBUG("reparse_data_length = %"PRIu16", expected >= 12\n",
-                         reparse_data_length);
-               return EINVAL;
-       }
-       if (smb_buffer_oob(srclen - 8, reparse_data_length, 0)) {
-               DBG_DEBUG("reparse_data_length (%"PRIu16") too large for "
-                          "src_len (%zu)\n",
-                         reparse_data_length,
-                         srclen);
-               return EINVAL;
-       }
-       if (smb_buffer_oob(reparse_data_length - 12, substitute_name_offset,
-                          substitute_name_length)) {
-               DBG_DEBUG("substitute_name (%"PRIu16"/%"PRIu16") does not fit "
-                         "in reparse_data_length (%"PRIu16")\n",
-                         substitute_name_offset,
-                         substitute_name_length,
-                         reparse_data_length - 12);
-               return EINVAL;
-       }
-       if (smb_buffer_oob(reparse_data_length - 12, print_name_offset,
-                          print_name_length)) {
-               DBG_DEBUG("print_name (%"PRIu16"/%"PRIu16") does not fit in "
-                         "reparse_data_length (%"PRIu16")\n",
-                         print_name_offset,
-                         print_name_length,
-                         reparse_data_length - 12);
-               return EINVAL;
-       }
-
-       *dst = (struct symlink_reparse_struct) {
-               .unparsed_path_length = PULL_LE_U16(src, 6),
-               .flags = PULL_LE_U32(src, 16),
-       };
-
-       ok = convert_string_talloc(mem_ctx,
-                                  CH_UTF16,
-                                  CH_UNIX,
-                                  src + 20 + substitute_name_offset,
-                                  substitute_name_length,
-                                  &dst->substitute_name,
-                                  NULL);
-       if (!ok) {
-               int ret = errno;
-               DBG_DEBUG("convert_string_talloc for substitute_name "
-                         "failed\n");
-               return ret;
-       }
-
-       ok = convert_string_talloc(mem_ctx,
-                                  CH_UTF16,
-                                  CH_UNIX,
-                                  src + 20 + print_name_offset,
-                                  print_name_length,
-                                  &dst->print_name,
-                                  NULL);
-       if (!ok) {
-               int ret = errno;
-               DBG_DEBUG("convert_string_talloc for print_name failed\n");
-               TALLOC_FREE(dst->substitute_name);
-               return ret;
-       }
-
-       return 0;
-}
index 0718f34395dce8254b5e8d246f3025f7668de413..322bf73474846283e316948bf81feef54dbb700d 100644 (file)
 #include <talloc.h>
 #include "lib/util/iov_buf.h"
 
-struct symlink_reparse_struct {
-       uint16_t unparsed_path_length; /* reserved for the reparse point */
-       char *substitute_name;
-       char *print_name;
-       uint32_t flags;
-};
-
 ssize_t reparse_buffer_marshall(
        uint32_t reparse_tag,
        uint16_t reserved,
@@ -50,9 +43,5 @@ bool symlink_reparse_buffer_marshall(
        TALLOC_CTX *mem_ctx,
        uint8_t **pdst,
        size_t *pdstlen);
-int symlink_reparse_buffer_parse(TALLOC_CTX *mem_ctx,
-                                struct symlink_reparse_struct *dst,
-                                const uint8_t *src,
-                                size_t srclen);
 
 #endif
index af99cba210189007ec3442a62c180ac3b0ca8527..8e7932cd113e3fdd4ca23933c73bf3cfa2f60759 100644 (file)
@@ -28,6 +28,7 @@
 #include "libcli/security/security.h"
 #include "../libcli/smb/smbXcli_base.h"
 #include "libcli/smb/reparse.h"
+#include "libcli/smb/reparse_symlink.h"
 
 struct cli_symlink_state {
        struct tevent_context *ev;
index 6199f7b32dc33743d536b4ea794674680ab51820..faef47de49d572196121319e728ff8cb4b600ce7 100644 (file)
@@ -51,6 +51,7 @@ c = libsmb.Conn("127.0.0.1",
 #include "python/modules.h"
 #include "libcli/smb/smbXcli_base.h"
 #include "libcli/smb/smb2_negotiate_context.h"
+#include "libcli/smb/reparse.h"
 #include "libcli/smb/reparse_symlink.h"
 #include "libsmb/libsmb.h"
 #include "libcli/security/security.h"
index 59fbe54850136962891dbbdfe9bfaa2e8e604b5a..2fc364a42fd8a99024a8a2178af0ac8ae31f88c6 100644 (file)
@@ -28,7 +28,7 @@
 #include "../lib/util/memcache.h"
 #include "../librpc/gen_ndr/open_files.h"
 #include "lib/util/string_wrappers.h"
-#include "libcli/smb/reparse_symlink.h"
+#include "libcli/smb/reparse.h"
 
 /*
    This module implements directory related functions for Samba.
index 9bd3ee77547a0169f4b8ad0f94b1cbafb48825c5..dcd08a06947fc0c84887c262f2865529f560367d 100644 (file)
@@ -30,7 +30,7 @@
 #include "smbd/smbd.h"
 #include "smbd/globals.h"
 #include "lib/util/memcache.h"
-#include "libcli/smb/reparse_symlink.h"
+#include "libcli/smb/reparse.h"
 
 uint32_t ucf_flags_from_smb_request(struct smb_request *req)
 {
index 46f988d8d8ce1fe6e704116bbe61c73cd873bc23..d19cbcc0dda48e1210fb4da4388a2b7a1de4bb3b 100644 (file)
@@ -25,7 +25,7 @@
 #include "util_tdb.h"
 #include "lib/util/bitmap.h"
 #include "lib/util/strv.h"
-#include "libcli/smb/reparse_symlink.h"
+#include "libcli/smb/reparse.h"
 
 #define FILE_HANDLE_OFFSET 0x1000