[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Mon Sep 25 18:08:01 UTC 2023
The branch, master has been updated
via 9c316623e5f libsmb: Extend cli_mknod to create NFS reparse points
via af5756df6c5 libsmb: Remove reparse_symlink.c
via e5d724ca883 libsmb: Use reparse_data_buffer_marshall() in py_reparse_put()
via 1f21be8286b libsmb: Use reparse_data_buffer_marshall() in cli_symlink_send()
via d19a28fdb4d libsmb: Factor out cli_create_reparse_point() from cli_symlink()
via 41274da949e libsmb: Use reparse_data_buffer_marshall() in py_reparse_symlink_put()
via ddc1f56cf1a libsmb: Add reparse_data_buffer_marshall()
via 815ff26db28 smbclient: Add mkfifo command
via 88258e17738 libsmb: Add sync cli_mknod() for smbclient3's use
from e58805fe7f7 s3:tests: Check if test_smbclient_kerberos.sh was successful
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 9c316623e5f3cde9dc88cef5992843d233e139c0
Author: Volker Lendecke <vl at samba.org>
Date: Thu Sep 21 16:56:55 2023 -0700
libsmb: Extend cli_mknod to create NFS reparse points
Tested smbclient mkfifo manually against W2k22, the Windows NFS server
reports this as FIFO.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Mon Sep 25 18:08:01 UTC 2023 on atb-devel-224
commit af5756df6c51537e4adf36ca524d4ca671a191ee
Author: Volker Lendecke <vl at samba.org>
Date: Thu Sep 21 07:40:43 2023 -0700
libsmb: Remove reparse_symlink.c
Makes reparse_buffer_marshall static to reparse.c
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit e5d724ca88338798dcc22062585473a20506f1fc
Author: Volker Lendecke <vl at samba.org>
Date: Thu Sep 21 07:33:15 2023 -0700
libsmb: Use reparse_data_buffer_marshall() in py_reparse_put()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 1f21be8286ba8459604a603490b2d9d60188765c
Author: Volker Lendecke <vl at samba.org>
Date: Thu Sep 21 07:23:41 2023 -0700
libsmb: Use reparse_data_buffer_marshall() in cli_symlink_send()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit d19a28fdb4d05f8ac001d1a00415feb72df56c10
Author: Volker Lendecke <vl at samba.org>
Date: Wed Sep 20 16:54:40 2023 -0700
libsmb: Factor out cli_create_reparse_point() from cli_symlink()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 41274da949ee07464d7a95a386d2f084ec8e796a
Author: Volker Lendecke <vl at samba.org>
Date: Thu Sep 21 06:45:49 2023 -0700
libsmb: Use reparse_data_buffer_marshall() in py_reparse_symlink_put()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit ddc1f56cf1a6e7b9f2e07b72fbe842c3de3122a4
Author: Volker Lendecke <vl at samba.org>
Date: Thu Sep 21 04:27:34 2023 -0700
libsmb: Add reparse_data_buffer_marshall()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 815ff26db28d755683af4c61005ad2de44e1b409
Author: Volker Lendecke <vl at samba.org>
Date: Wed Jul 5 09:25:14 2023 +0200
smbclient: Add mkfifo command
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 88258e17738d742634d12150e1c951cceb458ff5
Author: Volker Lendecke <vl at samba.org>
Date: Wed Jul 5 09:06:58 2023 +0200
libsmb: Add sync cli_mknod() for smbclient3's use
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
-----------------------------------------------------------------------
Summary of changes:
libcli/smb/py_reparse_symlink.c | 62 +++++++-----
libcli/smb/reparse.c | 218 ++++++++++++++++++++++++++++++++++++++++
libcli/smb/reparse.h | 4 +
libcli/smb/reparse_symlink.c | 167 ------------------------------
libcli/smb/reparse_symlink.h | 47 ---------
libcli/smb/wscript | 1 -
source3/client/client.c | 59 +++++++++++
source3/libsmb/clifile.c | 91 ++++++++++++++++-
source3/libsmb/clisymlink.c | 203 +++++++++++++++++++++++++------------
source3/libsmb/proto.h | 9 ++
source3/libsmb/pylibsmb.c | 1 -
11 files changed, 554 insertions(+), 308 deletions(-)
delete mode 100644 libcli/smb/reparse_symlink.c
delete mode 100644 libcli/smb/reparse_symlink.h
Changeset truncated at 500 lines:
diff --git a/libcli/smb/py_reparse_symlink.c b/libcli/smb/py_reparse_symlink.c
index 7aecc4fd38a..93e5cf8f049 100644
--- a/libcli/smb/py_reparse_symlink.c
+++ b/libcli/smb/py_reparse_symlink.c
@@ -22,7 +22,7 @@
#include "python/py3compat.h"
#include "libcli/util/pyerrors.h"
#include "reparse.h"
-#include "reparse_symlink.h"
+#include "lib/util/iov_buf.h"
#include "smb_constants.h"
static PyObject *py_reparse_put(PyObject *module, PyObject *args)
@@ -31,10 +31,10 @@ static PyObject *py_reparse_put(PyObject *module, PyObject *args)
Py_ssize_t reparse_len;
unsigned long long tag = 0;
unsigned reserved = 0;
- struct iovec iov;
uint8_t *buf = NULL;
ssize_t buflen;
PyObject *result = NULL;
+ struct reparse_data_buffer reparse_buf = {};
bool ok;
ok = PyArg_ParseTuple(
@@ -47,11 +47,13 @@ static PyObject *py_reparse_put(PyObject *module, PyObject *args)
if (!ok) {
return NULL;
}
- iov = (struct iovec) {
- .iov_base = reparse, .iov_len = reparse_len,
- };
- buflen = reparse_buffer_marshall(tag, reserved, &iov, 1, NULL, 0);
+ reparse_buf.tag = tag;
+ reparse_buf.parsed.raw.data = (uint8_t *)reparse;
+ reparse_buf.parsed.raw.length = reparse_len;
+ reparse_buf.parsed.raw.reserved = reserved;
+
+ buflen = reparse_data_buffer_marshall(&reparse_buf, NULL, 0);
if (buflen == -1) {
errno = EINVAL;
PyErr_SetFromErrno(PyExc_RuntimeError);
@@ -62,7 +64,7 @@ static PyObject *py_reparse_put(PyObject *module, PyObject *args)
PyErr_NoMemory();
return NULL;
}
- reparse_buffer_marshall(tag, reserved, &iov, 1, buf, buflen);
+ reparse_data_buffer_marshall(&reparse_buf, buf, buflen);
result = PyBytes_FromStringAndSize((char *)buf, buflen);
TALLOC_FREE(buf);
@@ -71,35 +73,47 @@ static PyObject *py_reparse_put(PyObject *module, PyObject *args)
static PyObject *py_reparse_symlink_put(PyObject *module, PyObject *args)
{
- char *substitute = NULL;
- char *printname = NULL;
int unparsed = 0;
int flags = 0;
- uint8_t *buf = NULL;
- size_t buflen;
+ struct reparse_data_buffer reparse = {
+ .tag = IO_REPARSE_TAG_SYMLINK,
+ };
+ struct symlink_reparse_struct *lnk = &reparse.parsed.lnk;
+ uint8_t stackbuf[1024];
+ uint8_t *buf = stackbuf;
+ ssize_t buflen = sizeof(stackbuf);
PyObject *result = NULL;
bool ok;
- ok = PyArg_ParseTuple(
- args,
- "ssii:symlink_put",
- &substitute,
- &printname,
- &unparsed,
- &flags);
+ ok = PyArg_ParseTuple(args,
+ "ssii:symlink_put",
+ &lnk->substitute_name,
+ &lnk->print_name,
+ &unparsed,
+ &flags);
if (!ok) {
return NULL;
}
+ lnk->unparsed_path_length = unparsed;
+ lnk->flags = flags;
- ok = symlink_reparse_buffer_marshall(
- substitute, printname, unparsed, flags, NULL, &buf, &buflen);
- if (!ok) {
+ buflen = reparse_data_buffer_marshall(&reparse, buf, buflen);
+
+ if ((buflen > 0) && ((size_t)buflen > sizeof(stackbuf))) {
+ buf = malloc(buflen);
+ buflen = reparse_data_buffer_marshall(&reparse, buf, buflen);
+ }
+
+ if (buflen == -1) {
PyErr_NoMemory();
- return false;
+ } else {
+ result = PyBytes_FromStringAndSize((char *)buf, buflen);
+ }
+
+ if (buf != stackbuf) {
+ free(buf);
}
- result = PyBytes_FromStringAndSize((char *)buf, buflen);
- TALLOC_FREE(buf);
return result;
}
diff --git a/libcli/smb/reparse.c b/libcli/smb/reparse.c
index 1c4ad444bfc..1a6feff17e1 100644
--- a/libcli/smb/reparse.c
+++ b/libcli/smb/reparse.c
@@ -17,10 +17,12 @@
#include "replace.h"
#include "libcli/smb/reparse.h"
+#include "lib/util/iov_buf.h"
#include "libcli/smb/smb_constants.h"
#include "libcli/util/error.h"
#include "lib/util/debug.h"
#include "lib/util/bytearray.h"
+#include "lib/util/talloc_stack.h"
#include "lib/util/charset/charset.h"
#include "smb_util.h"
@@ -346,3 +348,219 @@ char *reparse_data_buffer_str(TALLOC_CTX *mem_ctx,
}
return s;
}
+
+static ssize_t reparse_buffer_marshall(uint32_t reparse_tag,
+ uint16_t reserved,
+ const struct iovec *iov,
+ int iovlen,
+ uint8_t *buf,
+ size_t buflen)
+{
+ ssize_t reparse_data_length = iov_buflen(iov, iovlen);
+ size_t needed;
+
+ if (reparse_data_length == -1) {
+ return -1;
+ }
+ if (reparse_data_length > UINT16_MAX) {
+ return -1;
+ }
+
+ needed = reparse_data_length + 8;
+ if (needed < reparse_data_length) {
+ return -1;
+ }
+
+ if (buflen >= needed) {
+ PUSH_LE_U32(buf, 0, reparse_tag);
+ PUSH_LE_U16(buf, 4, reparse_data_length);
+ PUSH_LE_U16(buf, 6, reserved);
+ iov_buf(iov, iovlen, buf + 8, buflen - 8);
+ }
+
+ return needed;
+}
+
+static ssize_t
+reparse_data_buffer_marshall_syml(const struct symlink_reparse_struct *src,
+ uint8_t *buf,
+ size_t buflen)
+{
+ uint8_t sbuf[12];
+ struct iovec iov[3];
+ uint8_t *subst_utf16 = NULL;
+ uint8_t *print_utf16 = NULL;
+ size_t subst_len = 0;
+ size_t print_len = 0;
+ ssize_t ret = -1;
+ bool ok;
+
+ if (src->substitute_name == NULL) {
+ return -1;
+ }
+ if (src->print_name == NULL) {
+ return -1;
+ }
+
+ iov[0] = (struct iovec){
+ .iov_base = sbuf,
+ .iov_len = sizeof(sbuf),
+ };
+
+ ok = convert_string_talloc(talloc_tos(),
+ CH_UNIX,
+ CH_UTF16,
+ src->substitute_name,
+ strlen(src->substitute_name),
+ &subst_utf16,
+ &subst_len);
+ if (!ok) {
+ goto fail;
+ }
+ if (subst_len > UINT16_MAX) {
+ goto fail;
+ }
+ iov[1] = (struct iovec){
+ .iov_base = subst_utf16,
+ .iov_len = subst_len,
+ };
+
+ ok = convert_string_talloc(talloc_tos(),
+ CH_UNIX,
+ CH_UTF16,
+ src->print_name,
+ strlen(src->print_name),
+ &print_utf16,
+ &print_len);
+ if (!ok) {
+ goto fail;
+ }
+ if (print_len > UINT16_MAX) {
+ goto fail;
+ }
+ iov[2] = (struct iovec){
+ .iov_base = print_utf16,
+ .iov_len = print_len,
+ };
+
+ PUSH_LE_U16(sbuf, 0, 0); /* SubstituteNameOffset */
+ PUSH_LE_U16(sbuf, 2, subst_len); /* SubstituteNameLength */
+ PUSH_LE_U16(sbuf, 4, subst_len); /* PrintNameOffset */
+ PUSH_LE_U16(sbuf, 6, print_len); /* PrintNameLength */
+ PUSH_LE_U32(sbuf, 8, src->flags); /* Flags */
+
+ ret = reparse_buffer_marshall(IO_REPARSE_TAG_SYMLINK,
+ src->unparsed_path_length,
+ iov,
+ ARRAY_SIZE(iov),
+ buf,
+ buflen);
+
+fail:
+ TALLOC_FREE(subst_utf16);
+ TALLOC_FREE(print_utf16);
+ return ret;
+}
+
+static ssize_t
+reparse_data_buffer_marshall_nfs(const struct nfs_reparse_data_buffer *src,
+ uint8_t *buf,
+ size_t buflen)
+{
+ uint8_t typebuf[8];
+ uint8_t devbuf[8];
+ struct iovec iov[2] = {};
+ size_t iovlen;
+ uint8_t *lnk_utf16 = NULL;
+ size_t lnk_len = 0;
+ ssize_t ret;
+
+ PUSH_LE_U64(typebuf, 0, src->type);
+ iov[0] = (struct iovec){
+ .iov_base = typebuf,
+ .iov_len = sizeof(typebuf),
+ };
+ iovlen = 1;
+
+ switch (src->type) {
+ case NFS_SPECFILE_LNK: {
+ bool ok = convert_string_talloc(talloc_tos(),
+ CH_UNIX,
+ CH_UTF16,
+ src->data.lnk_target,
+ strlen(src->data.lnk_target),
+ &lnk_utf16,
+ &lnk_len);
+ if (!ok) {
+ return -1;
+ }
+ iov[1] = (struct iovec){
+ .iov_base = lnk_utf16,
+ .iov_len = lnk_len,
+ };
+ iovlen = 2;
+ break;
+ }
+ case NFS_SPECFILE_CHR:
+ FALL_THROUGH;
+ case NFS_SPECFILE_BLK:
+ PUSH_LE_U32(devbuf, 0, src->data.dev.major);
+ PUSH_LE_U32(devbuf, 4, src->data.dev.minor);
+ iov[1] = (struct iovec){
+ .iov_base = devbuf,
+ .iov_len = sizeof(devbuf),
+ };
+ iovlen = 2;
+ break;
+ default:
+ break;
+ /* Nothing to do for NFS_SPECFILE_FIFO and _SOCK */
+ }
+
+ ret = reparse_buffer_marshall(IO_REPARSE_TAG_NFS,
+ 0,
+ iov,
+ iovlen,
+ buf,
+ buflen);
+ TALLOC_FREE(lnk_utf16);
+ return ret;
+}
+
+ssize_t reparse_data_buffer_marshall(const struct reparse_data_buffer *src,
+ uint8_t *buf,
+ size_t buflen)
+{
+ ssize_t ret = -1;
+
+ switch (src->tag) {
+ case IO_REPARSE_TAG_SYMLINK:
+
+ ret = reparse_data_buffer_marshall_syml(&src->parsed.lnk,
+ buf,
+ buflen);
+ break;
+
+ case IO_REPARSE_TAG_NFS:
+
+ ret = reparse_data_buffer_marshall_nfs(&src->parsed.nfs,
+ buf,
+ buflen);
+ break;
+
+ default: {
+ struct iovec iov = {
+ .iov_base = src->parsed.raw.data,
+ .iov_len = src->parsed.raw.length,
+ };
+ ret = reparse_buffer_marshall(src->tag,
+ src->parsed.raw.reserved,
+ &iov,
+ 1,
+ buf,
+ buflen);
+ }
+ }
+
+ return ret;
+}
diff --git a/libcli/smb/reparse.h b/libcli/smb/reparse.h
index aeeaf116eba..1e593272a66 100644
--- a/libcli/smb/reparse.h
+++ b/libcli/smb/reparse.h
@@ -70,4 +70,8 @@ NTSTATUS reparse_data_buffer_parse(TALLOC_CTX *mem_ctx,
char *reparse_data_buffer_str(TALLOC_CTX *mem_ctx,
const struct reparse_data_buffer *dst);
+ssize_t reparse_data_buffer_marshall(const struct reparse_data_buffer *src,
+ uint8_t *buf,
+ size_t buflen);
+
#endif
diff --git a/libcli/smb/reparse_symlink.c b/libcli/smb/reparse_symlink.c
deleted file mode 100644
index b99cca261d7..00000000000
--- a/libcli/smb/reparse_symlink.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Unix SMB/CIFS implementation.
- *
- * Implementation of
- * http://msdn.microsoft.com/en-us/library/cc232006%28v=PROT.13%29.aspx
- *
- * Copyright (C) Volker Lendecke 2011
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "replace.h"
-#include "reparse_symlink.h"
-#include "lib/util/charset/charset.h"
-#include "lib/util/bytearray.h"
-#include "libcli/smb/smb_constants.h"
-#include "libcli/smb/smb_util.h"
-#include "lib/util/debug.h"
-
-ssize_t reparse_buffer_marshall(
- uint32_t reparse_tag,
- uint16_t reserved,
- const struct iovec *iov,
- int iovlen,
- uint8_t *buf,
- size_t buflen)
-{
- ssize_t reparse_data_length = iov_buflen(iov, iovlen);
- size_t needed;
-
- if (reparse_data_length == -1) {
- return -1;
- }
- if (reparse_data_length > UINT16_MAX) {
- return -1;
- }
-
- needed = reparse_data_length + 8;
- if (needed < reparse_data_length) {
- return -1;
- }
-
- if (buflen >= needed) {
- PUSH_LE_U32(buf, 0, reparse_tag);
- PUSH_LE_U16(buf, 4, reparse_data_length);
- PUSH_LE_U16(buf, 6, reserved);
- iov_buf(iov, iovlen, buf+8, buflen-8);
- }
-
- return needed;
-}
-
-bool symlink_reparse_buffer_marshall(
- const char *substitute,
- const char *printname,
- uint16_t unparsed_path_length,
- uint32_t flags,
- TALLOC_CTX *mem_ctx,
- uint8_t **pdst,
- size_t *pdstlen)
-{
- uint8_t sbuf[12];
- struct iovec iov[3];
- uint8_t *dst = NULL;
- ssize_t dst_len;
- uint8_t *subst_utf16 = NULL;
- uint8_t *print_utf16 = NULL;
- size_t subst_len = 0;
- size_t print_len = 0;
- bool ret = false;
- bool ok;
-
- if (substitute == NULL) {
- return false;
- }
- if (printname == NULL) {
- printname = substitute;
- }
-
- iov[0] = (struct iovec) { .iov_base = sbuf, .iov_len = sizeof(sbuf), };
-
- ok = convert_string_talloc(
- mem_ctx,
- CH_UNIX,
- CH_UTF16,
- substitute,
- strlen(substitute),
- &subst_utf16,
- &subst_len);
- if (!ok) {
- goto fail;
- }
- if (subst_len > UINT16_MAX) {
- goto fail;
- }
- iov[1] = (struct iovec) {
- .iov_base = subst_utf16, .iov_len = subst_len,
- };
-
- ok = convert_string_talloc(
- mem_ctx,
- CH_UNIX,
- CH_UTF16,
- printname,
- strlen(printname),
- &print_utf16,
- &print_len);
- if (!ok) {
- goto fail;
- }
- if (print_len > UINT16_MAX) {
- goto fail;
- }
- iov[2] = (struct iovec) {
- .iov_base = print_utf16, .iov_len = print_len,
- };
--
Samba Shared Repository
More information about the samba-cvs
mailing list