The branch, master has been updated via 60e45a2 s3/smbd: make copy chunk asynchronous via a849a12 vfs_default: move check for fsp->op validity via 0622811 s3/smbd: optimize copy-chunk by merging chunks if possible via 8bc94a9 s3/smbd: implement a serializing async copy-chunk loop via 6314dda s3/smbd: move cc_copy into fsctl_srv_copychunk_state via f8ef3a5 vfs_default: let copy_chunk_send use const from IDL via dc4bd3f s3/smbd: move copychunk ioctl limits to IDL via 0558715 tdb/tools: add documentation for the tdbbackup -n option via 26dbe68 s3-libsmb: support rename and replace for SMB1 via 057aa39 s3-libsmb: fail rename and replace inside cifs variant via 3154c4c s3-libsmb: cli_cifs_rename_send() via ae17989 libcli: introduce smbXcli_conn_support_passthrough() via 401be64 manpages: update smbclient manpage with rename -f option via 3ccb427 smbclient: add -f option to rename command via 200dbca s3: libsmb: add replace support to cli_rename() via a67802f s3: libsmb: add replace support to SMB2 rename via b224b20 lib: Avoid an includes.h via 2ad26a6 lib: Avoid an includes.h via 0865fea lib: Avoid an includes.h via aea4e4c lib: Avoid an includes.h via d13496f lib: Avoid an includes.h via d98c726 lib: Avoid an includes.h via 6e9d3b0 lib: Remove an unnecessary include via 7459289 lib: Remove unused winbind_get_groups and _get_sid_aliases from 4e734fc s3: Test for CVE-2017-2619 regression with "follow symlinks = no" - part 2
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 60e45a2d25401eaf9a15a86d19114670ccfde259 Author: Ralph Boehme <s...@samba.org> Date: Sun Mar 12 18:13:48 2017 +0100 s3/smbd: make copy chunk asynchronous Just use SMB_VFS_PREAD_SEND/RECV and SMB_VFS_PWRITE_SEND/RECV in a sensible loop. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Tue Mar 28 21:36:18 CEST 2017 on sn-devel-144 commit a849a124388ae511d1f7b3cdafb2fa52a395d284 Author: Ralph Boehme <s...@samba.org> Date: Sun Mar 12 17:23:09 2017 +0100 vfs_default: move check for fsp->op validity Move the check whether fsp->of is valid out of the copy loop in vfswrap_copy_chunk_send(). It's sufficient to check src_fsp->op and dest_fsp->op once before the copy loop. fsp->op can only be NULL for internal opens (cf file_new()), it's not expected to become NULL behind our backs. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 0622811faba117372e24854c09c3568ebdb6b2f9 Author: Ralph Boehme <s...@samba.org> Date: Tue Mar 21 18:34:22 2017 +0100 s3/smbd: optimize copy-chunk by merging chunks if possible Merge chunks with adjacent ranges. This results in fewer IO requests for the typical server-side file copy usecase: just one 16 MB copy instead of sixteen 1 MB. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 8bc94a9f9d54134489bf4c98ced8e60e2712ddf4 Author: Ralph Boehme <s...@samba.org> Date: Tue Mar 21 09:17:03 2017 +0100 s3/smbd: implement a serializing async copy-chunk loop Later commits will make the low level copy-chunk implementation async using a thread pool. That means the individual chunks may be scheduled and copied out-of-order at the low level. According to conversation with MS Dochelp, a server implementation must process individual chunks in order. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 6314dda7fe0a83a3e16fe59d87232782817daadc Author: Ralph Boehme <s...@samba.org> Date: Tue Mar 21 08:26:37 2017 +0100 s3/smbd: move cc_copy into fsctl_srv_copychunk_state No change, in behaviour, just preperational stuff to unroll the core copy loop. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit f8ef3a579b092d1647a38ea184659c2c675e6e83 Author: Ralph Boehme <s...@samba.org> Date: Sun Mar 12 17:18:39 2017 +0100 vfs_default: let copy_chunk_send use const from IDL This also increases the buffer size from 8 MB to the current value of COPYCHUNK_MAX_TOTAL_LEN which is 16 MB. For the typical case when vfswrap_copy_chunk_send is called from the SMB layer for an copy_chunk ioctl() the parameter "num" is guaranteed to be at most 1 MB though. It will only be larger for special callers like vfs_fruit for their special implementation of copyfile where num will be the size of a file to copy. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit dc4bd3f7515bef6f1cd6b51468d1b7642e763d6f Author: Ralph Boehme <s...@samba.org> Date: Wed Mar 8 15:07:06 2017 +0100 s3/smbd: move copychunk ioctl limits to IDL This will be needed in the next commit in vfs_default. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 0558715b5b125ffa7948f06451ea979c7045b20c Author: Björn Baumbach <b...@sernet.de> Date: Mon Mar 27 17:43:07 2017 +0200 tdb/tools: add documentation for the tdbbackup -n option Signed-off-by: Björn Baumbach <b...@sernet.de> Reviewed-by: Jeremy Allison <j...@samba.org commit 26dbe684dced5702ec89a20c44de2d4b737abbde Author: Uri Simchoni <u...@samba.org> Date: Sun Mar 26 12:02:09 2017 +0300 s3-libsmb: support rename and replace for SMB1 Add cli_smb1_rename_send() which renames a file via setting FileRenameInformation. Curretly this path is invoked only if replacing an existing file is requested. This is because as far as I can see, Windows uses CIFS rename for anything below SMB2. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 057aa39e6abea241a3785458460eaef8c30f8659 Author: Uri Simchoni <u...@samba.org> Date: Sun Mar 26 09:14:43 2017 +0300 s3-libsmb: fail rename and replace inside cifs variant Another refactoring step - fail request to rename and replace existing file from within the CIFS version, allowing the soon-to-be-added SMB version to succeed. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 3154c4cb701950d777766bbef1410182bb2569c4 Author: Uri Simchoni <u...@samba.org> Date: Sun Mar 26 08:54:42 2017 +0300 s3-libsmb: cli_cifs_rename_send() Pure refactoring - current rename is [MS-CIFS] - style rename. In later patch we'll introduce [MS-SMB] rename. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit ae17989de4b608981efb0342c233893cfae3b554 Author: Uri Simchoni <u...@samba.org> Date: Sun Mar 26 08:10:34 2017 +0300 libcli: introduce smbXcli_conn_support_passthrough() This routine queries the client connenction whether it supports query/set InfoLevels beyond 1000 (which, in Windows OS, is a pass-through mechanism to the file system). Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 401be6431c0821ee19ff08fbf5536fa870c9df66 Author: Uri Simchoni <u...@samba.org> Date: Tue Mar 21 23:56:35 2017 +0200 manpages: update smbclient manpage with rename -f option Document the -f option of the rename command. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 3ccb427ace78f828792f9c8f3cc1478ae38301b1 Author: Uri Simchoni <u...@samba.org> Date: Tue Mar 21 23:26:05 2017 +0200 smbclient: add -f option to rename command This option causes the rename to request that the destination file / directory be replaced if it exists. Supported only in SMB2 and higher protocol. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 200dbca238772b64e7c055d82d985045f92f6bcb Author: Uri Simchoni <u...@samba.org> Date: Tue Mar 21 23:13:07 2017 +0200 s3: libsmb: add replace support to cli_rename() Adds support for replacing the destination file at the higher-level cli_rename(). This is actually supported only by SMB2, and fails with invalid parameter with SMB1. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit a67802fad505738a10f3c73392db9e6235f13b62 Author: Uri Simchoni <u...@samba.org> Date: Tue Mar 21 23:02:48 2017 +0200 s3: libsmb: add replace support to SMB2 rename SMB2 rename operation supports replacing the destination file if it exists. Signed-off-by: Uri Simchoni <u...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b224b2033df9543e1b580885956a65161bd50db5 Author: Volker Lendecke <v...@samba.org> Date: Sun Jan 8 19:52:47 2017 +0000 lib: Avoid an includes.h Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 2ad26a63c9d155448efcdcf9db0ada9a267e12d8 Author: Volker Lendecke <v...@samba.org> Date: Sun Jan 8 19:52:47 2017 +0000 lib: Avoid an includes.h Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 0865fea4fcd8c540b59accdf24c27d09f580ae02 Author: Volker Lendecke <v...@samba.org> Date: Sun Jan 8 19:52:47 2017 +0000 lib: Avoid an includes.h Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit aea4e4cbd3a56f99c4d2ef628540cbb760b15bb3 Author: Volker Lendecke <v...@samba.org> Date: Sun Jan 8 19:52:47 2017 +0000 lib: Avoid an includes.h Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit d13496f3879cb7592f540e4aa1b0faf45c56f967 Author: Volker Lendecke <v...@samba.org> Date: Sun Jan 8 19:52:47 2017 +0000 lib: Avoid an includes.h Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit d98c7263e037b8e9c67b1267c5ac6811a07d930e Author: Volker Lendecke <v...@samba.org> Date: Sun Jan 8 19:52:47 2017 +0000 lib: Avoid an includes.h Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 6e9d3b05de473bd1bdef66dad8155d5233aa6d25 Author: Volker Lendecke <v...@samba.org> Date: Sun Jan 8 19:46:17 2017 +0000 lib: Remove an unnecessary include This comes in via samba_util.h already Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 745928955190284480bbd3fe9f5e5570086d36dc Author: Volker Lendecke <v...@samba.org> Date: Tue Jan 3 14:05:51 2017 +0000 lib: Remove unused winbind_get_groups and _get_sid_aliases Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: docs-xml/manpages/smbclient.1.xml | 7 +- lib/tdb/man/tdbbackup.8.xml | 8 + lib/util/charset/codepoints.c | 4 +- lib/util/charset/iconv.c | 8 +- lib/util/rbtree.c | 2 +- lib/util/rfc1738.c | 4 +- lib/util/util_pw.c | 3 +- lib/util/util_tdb.c | 6 +- libcli/smb/smbXcli_base.c | 17 ++ libcli/smb/smbXcli_base.h | 1 + librpc/idl/ioctl.idl | 4 + source3/client/client.c | 10 +- source3/include/includes.h | 1 - source3/lib/winbind_util.c | 83 ------- source3/lib/winbind_util.h | 10 - source3/libsmb/cli_smb2_fnum.c | 9 +- source3/libsmb/cli_smb2_fnum.h | 5 +- source3/libsmb/clifile.c | 150 +++++++++-- source3/libsmb/libsmb_dir.c | 10 +- source3/libsmb/proto.h | 14 +- source3/modules/vfs_default.c | 273 ++++++++++++++------- ...passdb-0.26.0.sigs => samba-passdb-0.27.0.sigs} | 2 - source3/smbd/smb2_ioctl_network_fs.c | 258 ++++++++++++------- source3/torture/nbio.c | 2 +- source3/torture/torture.c | 14 +- source3/wscript_build | 2 +- 26 files changed, 577 insertions(+), 330 deletions(-) copy source3/passdb/ABI/{samba-passdb-0.26.0.sigs => samba-passdb-0.27.0.sigs} (99%) Changeset truncated at 500 lines: diff --git a/docs-xml/manpages/smbclient.1.xml b/docs-xml/manpages/smbclient.1.xml index c8f4e40..059e14c 100644 --- a/docs-xml/manpages/smbclient.1.xml +++ b/docs-xml/manpages/smbclient.1.xml @@ -1000,10 +1000,13 @@ </varlistentry> <varlistentry> - <term>rename <old filename> <new filename></term> + <term>rename <old filename> <new filename> [-f]</term> <listitem><para>Rename files in the current working directory on the server from <replaceable>old filename</replaceable> to - <replaceable>new filename</replaceable>. </para></listitem> + <replaceable>new filename</replaceable>. The optional + -f switch is supported only by SMB2 protocol and beyond, + and allows for superseding the destination file, + if it exists.</para></listitem> </varlistentry> <varlistentry> diff --git a/lib/tdb/man/tdbbackup.8.xml b/lib/tdb/man/tdbbackup.8.xml index 740b3d5..a73fb56 100644 --- a/lib/tdb/man/tdbbackup.8.xml +++ b/lib/tdb/man/tdbbackup.8.xml @@ -23,6 +23,7 @@ <arg choice="opt">-s suffix</arg> <arg choice="opt">-v</arg> <arg choice="opt">-h</arg> + <arg choice="opt">-n hashsize</arg> <arg choice="opt">-l</arg> </cmdsynopsis> </refsynopsisdiv> @@ -71,6 +72,13 @@ </varlistentry> <varlistentry> + <term>-n hashsize</term> + <listitem><para> + The <command>-n</command> option sets the hash size for the new backup tdb. + </para></listitem> + </varlistentry> + + <varlistentry> <term>-l</term> <listitem><para> This options disables any locking, by passing TDB_NOLOCK diff --git a/lib/util/charset/codepoints.c b/lib/util/charset/codepoints.c index 2c9a9c4..cfb0b27 100644 --- a/lib/util/charset/codepoints.c +++ b/lib/util/charset/codepoints.c @@ -20,10 +20,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "includes.h" +#include "replace.h" #include "lib/util/charset/charset.h" #include "system/locale.h" #include "dynconfig/dynconfig.h" +#include "lib/util/debug.h" +#include "lib/util/byteorder.h" #ifdef strcasecmp #undef strcasecmp diff --git a/lib/util/charset/iconv.c b/lib/util/charset/iconv.c index e06fa2c..02c061c 100644 --- a/lib/util/charset/iconv.c +++ b/lib/util/charset/iconv.c @@ -18,11 +18,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "includes.h" -#include "../lib/util/dlinklist.h" +#include "replace.h" #include "system/iconv.h" #include "system/filesys.h" -#include "charset_proto.h" +#include "lib/util/byteorder.h" +#include "lib/util/dlinklist.h" +#include "lib/util/charset/charset.h" +#include "lib/util/charset/charset_proto.h" #ifdef strcasecmp #undef strcasecmp diff --git a/lib/util/rbtree.c b/lib/util/rbtree.c index f6868ca..b7add66 100644 --- a/lib/util/rbtree.c +++ b/lib/util/rbtree.c @@ -20,7 +20,7 @@ linux/lib/rbtree.c */ -#include "includes.h" +#include "replace.h" #include "rbtree.h" #define RB_RED 0 diff --git a/lib/util/rfc1738.c b/lib/util/rfc1738.c index c8f0472..b285ae9 100644 --- a/lib/util/rfc1738.c +++ b/lib/util/rfc1738.c @@ -48,8 +48,8 @@ * */ -#include "includes.h" - +#include "replace.h" +#include <talloc.h> #include "lib/util/samba_util.h" /* diff --git a/lib/util/util_pw.c b/lib/util/util_pw.c index dae3a69..8035de4 100644 --- a/lib/util/util_pw.c +++ b/lib/util/util_pw.c @@ -24,7 +24,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "includes.h" +#include "replace.h" +#include <talloc.h> #include "system/passwd.h" #include "lib/util/util_pw.h" diff --git a/lib/util/util_tdb.c b/lib/util/util_tdb.c index 9bf18dc..e3eefda 100644 --- a/lib/util/util_tdb.c +++ b/lib/util/util_tdb.c @@ -20,7 +20,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "includes.h" +#include "replace.h" +#include <talloc.h> +#include "libcli/util/ntstatus.h" +#include "lib/util/memory.h" +#include "lib/util/byteorder.h" #include "system/filesys.h" #include "../lib/tdb/include/tdb.h" #include "../lib/util/util_tdb.h" diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c index 9521fc6..1fcf11e 100644 --- a/libcli/smb/smbXcli_base.c +++ b/libcli/smb/smbXcli_base.c @@ -468,6 +468,23 @@ bool smbXcli_conn_use_unicode(struct smbXcli_conn *conn) return false; } +/* + * [MS-SMB] 2.2.2.3.5 - SMB1 support for passing through + * query/set commands to the file system + */ +bool smbXcli_conn_support_passthrough(struct smbXcli_conn *conn) +{ + if (conn->protocol >= PROTOCOL_SMB2_02) { + return true; + } + + if (conn->smb1.capabilities & CAP_W2K_SMBS) { + return true; + } + + return false; +} + void smbXcli_conn_set_sockopt(struct smbXcli_conn *conn, const char *options) { set_socket_options(conn->sock_fd, options); diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h index 84f4a6b..1abeb2b 100644 --- a/libcli/smb/smbXcli_base.h +++ b/libcli/smb/smbXcli_base.h @@ -47,6 +47,7 @@ bool smbXcli_conn_dfs_supported(struct smbXcli_conn *conn); enum protocol_types smbXcli_conn_protocol(struct smbXcli_conn *conn); bool smbXcli_conn_use_unicode(struct smbXcli_conn *conn); +bool smbXcli_conn_support_passthrough(struct smbXcli_conn *conn); void smbXcli_conn_set_sockopt(struct smbXcli_conn *conn, const char *options); const struct sockaddr_storage *smbXcli_conn_local_sockaddr(struct smbXcli_conn *conn); diff --git a/librpc/idl/ioctl.idl b/librpc/idl/ioctl.idl index eb2dc8a..f72f9d2 100644 --- a/librpc/idl/ioctl.idl +++ b/librpc/idl/ioctl.idl @@ -11,6 +11,10 @@ interface copychunk uint8 context[4]; } req_resume_key_rsp; + const uint32 COPYCHUNK_MAX_CHUNKS = 256; /* 2k8r2 & win8 = 256 */ + const uint32 COPYCHUNK_MAX_CHUNK_LEN = 1048576; /* 2k8r2 & win8 = 1048576 */ + const uint32 COPYCHUNK_MAX_TOTAL_LEN = 16777216; /* 2k8r2 & win8 = 16777216 */ + typedef struct { hyper source_off; hyper target_off; diff --git a/source3/client/client.c b/source3/client/client.c index 226eb27..d2ebea0 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -3833,10 +3833,11 @@ static int cmd_rename(void) char *targetsrc; char *targetdest; NTSTATUS status; + bool replace = false; if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL) || !next_token_talloc(ctx, &cmd_ptr,&buf2,NULL)) { - d_printf("rename <src> <dest>\n"); + d_printf("rename <src> <dest> [-f]\n"); return 1; } @@ -3856,6 +3857,11 @@ static int cmd_rename(void) return 1; } + if (next_token_talloc(ctx, &cmd_ptr, &buf, NULL) && + strcsequal(buf, "-f")) { + replace = true; + } + status = cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, &targetsrc); if (!NT_STATUS_IS_OK(status)) { @@ -3870,7 +3876,7 @@ static int cmd_rename(void) return 1; } - status = cli_rename(targetcli, targetsrc, targetdest); + status = cli_rename(targetcli, targetsrc, targetdest, replace); if (!NT_STATUS_IS_OK(status)) { d_printf("%s renaming files %s -> %s \n", nt_errstr(status), diff --git a/source3/include/includes.h b/source3/include/includes.h index a436427..e82bfad 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -303,7 +303,6 @@ typedef char fstring[FSTRING_LEN]; /* Lists, trees, caching, database... */ #include "../lib/util/samba_util.h" #include "../lib/util/util_net.h" -#include "../lib/util/memory.h" #include "../lib/util/attr.h" #include "../lib/util/tsort.h" #include "../lib/util/dlinklist.h" diff --git a/source3/lib/winbind_util.c b/source3/lib/winbind_util.c index 852929e..427831f 100644 --- a/source3/lib/winbind_util.c +++ b/source3/lib/winbind_util.c @@ -274,74 +274,6 @@ bool winbind_allocate_gid(gid_t *gid) return (ret == WBC_ERR_SUCCESS); } -bool winbind_get_groups(TALLOC_CTX * mem_ctx, const char *account, uint32_t *num_groups, gid_t **_groups) -{ - wbcErr ret; - uint32_t ngroups; - gid_t *group_list = NULL; - - ret = wbcGetGroups(account, &ngroups, &group_list); - if (ret != WBC_ERR_SUCCESS) - return false; - - *_groups = talloc_array(mem_ctx, gid_t, ngroups); - if (*_groups == NULL) { - wbcFreeMemory(group_list); - return false; - } - - memcpy(*_groups, group_list, ngroups* sizeof(gid_t)); - *num_groups = ngroups; - - wbcFreeMemory(group_list); - return true; -} - -bool winbind_get_sid_aliases(TALLOC_CTX *mem_ctx, - const struct dom_sid *dom_sid, - const struct dom_sid *members, - size_t num_members, - uint32_t **pp_alias_rids, - size_t *p_num_alias_rids) -{ - wbcErr ret; - struct wbcDomainSid domain_sid; - struct wbcDomainSid *sid_list = NULL; - size_t i; - uint32_t * rids; - uint32_t num_rids; - - memcpy(&domain_sid, dom_sid, sizeof(*dom_sid)); - - sid_list = talloc_array(mem_ctx, struct wbcDomainSid, num_members); - - for (i=0; i < num_members; i++) { - memcpy(&sid_list[i], &members[i], sizeof(sid_list[i])); - } - - ret = wbcGetSidAliases(&domain_sid, - sid_list, - num_members, - &rids, - &num_rids); - if (ret != WBC_ERR_SUCCESS) { - return false; - } - - *pp_alias_rids = talloc_array(mem_ctx, uint32_t, num_rids); - if (*pp_alias_rids == NULL) { - wbcFreeMemory(rids); - return false; - } - - memcpy(*pp_alias_rids, rids, sizeof(uint32_t) * num_rids); - - *p_num_alias_rids = num_rids; - wbcFreeMemory(rids); - - return true; -} - bool winbind_lookup_usersids(TALLOC_CTX *mem_ctx, const struct dom_sid *user_sid, uint32_t *p_num_sids, @@ -470,21 +402,6 @@ bool winbind_allocate_gid(gid_t *gid) return false; } -bool winbind_get_groups(TALLOC_CTX *mem_ctx, const char *account, uint32_t *num_groups, gid_t **_groups) -{ - return false; -} - -bool winbind_get_sid_aliases(TALLOC_CTX *mem_ctx, - const struct dom_sid *dom_sid, - const struct dom_sid *members, - size_t num_members, - uint32_t **pp_alias_rids, - size_t *p_num_alias_rids) -{ - return false; -} - bool winbind_lookup_usersids(TALLOC_CTX *mem_ctx, const struct dom_sid *user_sid, uint32_t *p_num_sids, diff --git a/source3/lib/winbind_util.h b/source3/lib/winbind_util.h index 2a90092..c2bf0e0 100644 --- a/source3/lib/winbind_util.h +++ b/source3/lib/winbind_util.h @@ -48,16 +48,6 @@ bool winbind_lookup_rids(TALLOC_CTX *mem_ctx, const char ***names, enum lsa_SidType **types); bool winbind_allocate_uid(uid_t *uid); bool winbind_allocate_gid(gid_t *gid); -bool winbind_get_groups(TALLOC_CTX *mem_ctx, - const char *account, - uint32_t *num_groups, - gid_t ** _groups); -bool winbind_get_sid_aliases(TALLOC_CTX *mem_ctx, - const struct dom_sid *dom_sid, - const struct dom_sid *members, - size_t num_members, - uint32_t **pp_alias_rids, - size_t *p_num_alias_rids); bool winbind_lookup_usersids(TALLOC_CTX *mem_ctx, const struct dom_sid *user_sid, uint32_t *p_num_sids, diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c index 848e077..351fccf 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -2010,8 +2010,9 @@ NTSTATUS cli_smb2_set_security_descriptor(struct cli_state *cli, ***************************************************************/ NTSTATUS cli_smb2_rename(struct cli_state *cli, - const char *fname_src, - const char *fname_dst) + const char *fname_src, + const char *fname_dst, + bool replace) { NTSTATUS status; DATA_BLOB inbuf = data_blob_null; @@ -2091,6 +2092,10 @@ NTSTATUS cli_smb2_rename(struct cli_state *cli, goto fail; } + if (replace) { + SCVAL(inbuf.data, 0, 1); + } + SIVAL(inbuf.data, 16, converted_size_bytes); memcpy(inbuf.data + 20, converted_str, converted_size_bytes); diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h index 12c42a2..43e0471 100644 --- a/source3/libsmb/cli_smb2_fnum.h +++ b/source3/libsmb/cli_smb2_fnum.h @@ -132,8 +132,9 @@ NTSTATUS cli_smb2_set_security_descriptor(struct cli_state *cli, uint32_t sec_info, const struct security_descriptor *sd); NTSTATUS cli_smb2_rename(struct cli_state *cli, - const char *fname_src, - const char *fname_dst); + const char *fname_src, + const char *fname_dst, + bool replace); NTSTATUS cli_smb2_set_ea_fnum(struct cli_state *cli, uint16_t fnum, const char *ea_name, diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index 6b32bf1..cc1d1e4 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -992,29 +992,146 @@ NTSTATUS cli_posix_chown(struct cli_state *cli, Rename a file. ****************************************************************************/ -static void cli_rename_done(struct tevent_req *subreq); +static struct tevent_req *cli_cifs_rename_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct cli_state *cli, + const char *fname_src, + const char *fname_dst, + bool replace); + +static struct tevent_req *cli_smb1_rename_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct cli_state *cli, + const char *fname_src, + const char *fname_dst, + bool replace); -struct cli_rename_state { +struct tevent_req *cli_rename_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct cli_state *cli, + const char *fname_src, + const char *fname_dst, + bool replace) +{ + if (replace && smbXcli_conn_support_passthrough(cli->conn)) { + return cli_smb1_rename_send(mem_ctx, ev, cli, fname_src, + fname_dst, replace); + } else { + return cli_cifs_rename_send(mem_ctx, ev, cli, fname_src, + fname_dst, replace); + } +} + +struct cli_smb1_rename_state { + uint8_t *data; +}; + +static void cli_smb1_rename_done(struct tevent_req *subreq); + +static struct tevent_req *cli_smb1_rename_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct cli_state *cli, + const char *fname_src, + const char *fname_dst, + bool replace) +{ + NTSTATUS status; + struct tevent_req *req = NULL, *subreq = NULL; + struct cli_smb1_rename_state *state = NULL; + smb_ucs2_t *converted_str = NULL; + size_t converted_size_bytes = 0; + + req = tevent_req_create(mem_ctx, &state, struct cli_smb1_rename_state); + if (req == NULL) { + return NULL; + } + + if (!push_ucs2_talloc(talloc_tos(), &converted_str, fname_dst, + &converted_size_bytes)) { + status = NT_STATUS_INVALID_PARAMETER; + goto fail; + } + + /* W2K8 insists the dest name is not null + terminated. Remove the last 2 zero bytes + and reduce the name length. */ + + if (converted_size_bytes < 2) { + status = NT_STATUS_INVALID_PARAMETER; + goto fail; + } + converted_size_bytes -= 2; + + state->data = + talloc_zero_array(state, uint8_t, 12 + converted_size_bytes); + if (state->data == NULL) { + status = NT_STATUS_NO_MEMORY; + goto fail; + } -- Samba Shared Repository