[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Thu Jul 7 12:30:03 MDT 2011


The branch, master has been updated
       via  6db705d libcli: remove duplicate of #define NT_STATUS_NO_SUCH_JOB
       via  80c6541 s3-client: Remove use of cli_errstr()
       via  1142675 s3-libsmb: Remove use of cli_errstr()
       via  98e0f9d s3-torture: run_shortname_test: Remove uses of cli_errstr()
       via  684095b s3-torture: run_simple_posix_open_test: Remove uses of cli_errstr()
       via  840a1c7 s3-torture: use nt_errstr() for cli_unlink() error handling
       via  60873a9 s3-torture: introduce check_both_error()
       via  3cdf962 s3:libsmb: finally remove unused cli_state->outbuf
       via  0f00675 s3:libsmb: remove unused clistr_push_fn()
       via  30574a7 s3:libsmb: remove unused clistr_pull_fn()
       via  fc992e7 s3:torture/scanner: use trans2_bytes_push_str() in scan_nttrans()
       via  02171ee s3:torture/scanner: use trans2_bytes_push_str() in scan_trans2()
       via  072a27f s3:libsmb: use trans2_bytes_push_str() in cli_tcon_andx_create() for the plaintext password
       via  5b1ac1b s3:libsmb: use trans2_bytes_push_str() in cli_set_ea_path()
       via  cea9245 s3:libsmb: use trans2_bytes_push_str() in cli_dfs_get_referral()
       via  2453164 s3:libsmb: use a talloc_stackframe in cli_dfs_get_referral()
       via  b77becd s3:libsmb: use trans2_bytes_push_str/bytes() in cli_list_trans_*()
       via  d921200 s3:libsmb: use clistr_pull_talloc() for short_name in interpret_long_filename()
       via  af66c64 s3:libsmb: interpret_long_filename() short_name is always UNICODE
       via  eaeeb5c s3:libsmb: add trans2_bytes_push_bytes()
       via  ed99cad s3:libsmb: make trans2_bytes_push_str() non-static
       via  9a350ca s3:utils: avoid cli_nt_error()/cli_errstr() if we already have the status
      from  e595590 s3-printing: remove tdb migration invalid printer name checks

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6db705d6fcc5b58b205afed2a9140716c6323fae
Author: Björn Baumbach <bb at sernet.de>
Date:   Thu Jul 7 17:43:46 2011 +0200

    libcli: remove duplicate of #define NT_STATUS_NO_SUCH_JOB
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Autobuild-User: Stefan Metzmacher <metze at samba.org>
    Autobuild-Date: Thu Jul  7 20:29:13 CEST 2011 on sn-devel-104

commit 80c65416c17169e487ce17314bdc9975679ec331
Author: Björn Baumbach <bb at sernet.de>
Date:   Thu Jul 7 17:36:22 2011 +0200

    s3-client: Remove use of cli_errstr()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 11426758d71e59ffe9804d2ebb2f145b4ed398e1
Author: Björn Baumbach <bb at sernet.de>
Date:   Thu Jul 7 17:18:40 2011 +0200

    s3-libsmb: Remove use of cli_errstr()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 98e0f9d1edb77f07f2f733478e91d0410c020b2e
Author: Björn Baumbach <bb at sernet.de>
Date:   Thu Jul 7 16:56:05 2011 +0200

    s3-torture: run_shortname_test: Remove uses of cli_errstr()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 684095b0a2e24869b684cc12b92ed7847caf0021
Author: Björn Baumbach <bb at sernet.de>
Date:   Thu Jul 7 16:49:12 2011 +0200

    s3-torture: run_simple_posix_open_test: Remove uses of cli_errstr()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 840a1c7445377c24bfff04ffa619ea6b4aa83029
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 17:56:19 2011 +0200

    s3-torture: use nt_errstr() for cli_unlink() error handling
    
    Use nt_errstr() instead of cli_errstr() for error handling on
    cli_unlink() calls.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 60873a9e48115e5bfb3c58cccd078c49d43c56bc
Author: Björn Baumbach <bb at sernet.de>
Date:   Thu Jul 7 16:27:39 2011 +0200

    s3-torture: introduce check_both_error()
    
    Check if the server produced the expected dos or nt error code like
    check_error(), but without a cli_state struct.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 3cdf962d1ea2823e2a5200533685b3a627a00237
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 18:16:56 2011 +0200

    s3:libsmb: finally remove unused cli_state->outbuf
    
    metze

commit 0f006751ec22a13de898fbafcb6de5a8b8d5ec15
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 17:24:32 2011 +0200

    s3:libsmb: remove unused clistr_push_fn()
    
    metze

commit 30574a73d8073e1bb0a552fdf8444f17eeebec74
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jul 6 17:57:45 2011 +0200

    s3:libsmb: remove unused clistr_pull_fn()
    
    metze

commit fc992e7029a8cec00b91b50e79f90dea09efcab2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 15:38:02 2011 +0200

    s3:torture/scanner: use trans2_bytes_push_str() in scan_nttrans()
    
    metze

commit 02171ee0f06c2558adee82e929e8926123e0a13c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 15:38:02 2011 +0200

    s3:torture/scanner: use trans2_bytes_push_str() in scan_trans2()
    
    metze

commit 072a27fd9f0d6a34eb33543e14a708ff0567d0d1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 10:55:00 2011 +0200

    s3:libsmb: use trans2_bytes_push_str() in cli_tcon_andx_create() for the plaintext password
    
    This makes sure we push the string always in DOS charset.
    
    metze

commit 5b1ac1bcc3d0bd0af4d5b745e0e2e834aae34e54
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 10:16:38 2011 +0200

    s3:libsmb: use trans2_bytes_push_str() in cli_set_ea_path()
    
    metze

commit cea924590916c3c69245af56a2bb18743d299cbb
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jul 6 18:36:29 2011 +0200

    s3:libsmb: use trans2_bytes_push_str() in cli_dfs_get_referral()
    
    metze

commit 2453164317e350fd398858a84b6ef5e030faab1b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 08:58:25 2011 +0200

    s3:libsmb: use a talloc_stackframe in cli_dfs_get_referral()
    
    metze

commit b77becdb55da195da6932a289b8cdc7d2e1dd4dc
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jul 6 18:24:50 2011 +0200

    s3:libsmb: use trans2_bytes_push_str/bytes() in cli_list_trans_*()
    
    metze

commit d921200e75e90fbda2cf7ba7950ae71e09c50468
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jul 6 18:57:27 2011 +0200

    s3:libsmb: use clistr_pull_talloc() for short_name in interpret_long_filename()
    
    metze

commit af66c64e95183647bce39754089c591cbbdfbc50
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 14:46:40 2011 +0200

    s3:libsmb: interpret_long_filename() short_name is always UNICODE
    
    metze

commit eaeeb5ce0e7282cf0d4db3dd9f39848b0afcb1fa
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 10:02:36 2011 +0200

    s3:libsmb: add trans2_bytes_push_bytes()
    
    metze

commit ed99caded241925dbd8beee5bb57ba2d4a3b1c5e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Jul 6 18:23:52 2011 +0200

    s3:libsmb: make trans2_bytes_push_str() non-static
    
    We should use this and get rid of clistr_push().
    
    metze

commit 9a350ca3b6ddcebff67bad87210adf1be5f5a725
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 7 15:33:43 2011 +0200

    s3:utils: avoid cli_nt_error()/cli_errstr() if we already have the status
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 lib/util/string_wrappers.h     |   12 ----
 libcli/util/ntstatus.h         |    1 -
 source3/client/client.c        |    4 +-
 source3/include/client.h       |    3 +-
 source3/libsmb/cliconnect.c    |   29 ++++-----
 source3/libsmb/clidfs.c        |   21 ++++---
 source3/libsmb/clientgen.c     |    6 +--
 source3/libsmb/clifile.c       |   42 +++++++++---
 source3/libsmb/clilist.c       |   69 ++++++++++++---------
 source3/libsmb/clistr.c        |   38 ------------
 source3/libsmb/libsmb_server.c |   11 +++-
 source3/libsmb/proto.h         |   16 ++---
 source3/torture/masktest.c     |    3 +-
 source3/torture/scanner.c      |  132 +++++++++++++++++++++++++++++++---------
 source3/torture/torture.c      |  100 ++++++++++++++++++++++--------
 source3/utils/net_rpc.c        |    4 +-
 16 files changed, 292 insertions(+), 199 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/util/string_wrappers.h b/lib/util/string_wrappers.h
index 6f2d6e9..c39ff1f 100644
--- a/lib/util/string_wrappers.h
+++ b/lib/util/string_wrappers.h
@@ -73,16 +73,6 @@ size_t __unsafe_string_function_usage_here_size_t__(void);
     ? __unsafe_string_function_usage_here_size_t__() \
     : push_string_check_fn(dest, src, dest_len, flags))
 
-#define clistr_push(cli, dest, src, dest_len, flags) \
-    (CHECK_STRING_SIZE(dest, dest_len) \
-    ? __unsafe_string_function_usage_here_size_t__() \
-    : clistr_push_fn(cli, dest, src, dest_len, flags))
-
-#define clistr_pull(inbuf, dest, src, dest_len, srclen, flags) \
-    (CHECK_STRING_SIZE(dest, dest_len) \
-    ? __unsafe_string_function_usage_here_size_t__() \
-    : clistr_pull_fn(inbuf, dest, src, dest_len, srclen, flags))
-
 #define srvstr_push(base_ptr, smb_flags2, dest, src, dest_len, flags) \
     (CHECK_STRING_SIZE(dest, dest_len) \
     ? __unsafe_string_function_usage_here_size_t__() \
@@ -102,8 +92,6 @@ size_t __unsafe_string_function_usage_here_size_t__(void);
 #else
 
 #define push_string_check push_string_check_fn
-#define clistr_push clistr_push_fn
-#define clistr_pull clistr_pull_fn
 #define srvstr_push srvstr_push_fn
 #define checked_strlcpy strlcpy
 
diff --git a/libcli/util/ntstatus.h b/libcli/util/ntstatus.h
index 2018b40..1381bea 100644
--- a/libcli/util/ntstatus.h
+++ b/libcli/util/ntstatus.h
@@ -606,7 +606,6 @@ typedef uint32_t NTSTATUS;
 #define NT_STATUS_DOWNGRADE_DETECTED NT_STATUS(0xC0000000 | 0x0388)
 #define NT_STATUS_NO_S4U_PROT_SUPPORT NT_STATUS(0xC0000000 | 0x040A)
 #define NT_STATUS_CROSSREALM_DELEGATION_FAILURE NT_STATUS(0xC0000000 | 0x040B)
-#define NT_STATUS_NO_SUCH_JOB NT_STATUS(0xC0000000 | 0xEDE) /* scheduler */
 #define NT_STATUS_RPC_PROTSEQ_NOT_SUPPORTED NT_STATUS(0xC0000000 | 0x20004)
 #define NT_STATUS_RPC_UNSUPPORTED_NAME_SYNTAX NT_STATUS(0xC0000000 | 0x20026)
 #define NT_STATUS_RPC_UNKNOWN_IF NT_STATUS(0xC0000000 | 0x20012)
diff --git a/source3/client/client.c b/source3/client/client.c
index aa26d99..82dc8c4 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -917,8 +917,8 @@ NTSTATUS do_list(const char *mask,
 			}
 			TALLOC_FREE(targetpath);
 		} else {
-			d_printf("do_list: [%s] %s\n", mask, cli_errstr(cli));
-			ret_status = cli_nt_error(cli);
+			d_printf("do_list: [%s] %s\n", mask, nt_errstr(status));
+			ret_status = status;
 		}
 	}
 
diff --git a/source3/include/client.h b/source3/include/client.h
index a853e90..6486c76 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -95,7 +95,6 @@ struct cli_state {
 	int timeout; /* in milliseconds. */
 	size_t max_xmit;
 	size_t max_mux;
-	char *outbuf;
 	char *inbuf;
 	unsigned int bufsize;
 	int initialised;
@@ -152,7 +151,7 @@ struct file_info {
 	struct timespec atime_ts;
 	struct timespec ctime_ts;
 	char *name;
-	char short_name[13*3]; /* the *3 is to cope with multi-byte */
+	char *short_name;
 };
 
 #define CLI_FULL_CONNECTION_DONT_SPNEGO 0x0001
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index 62e3a35..8c74d2e 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -2231,7 +2231,7 @@ struct tevent_req *cli_tcon_andx_create(TALLOC_CTX *mem_ctx,
 		if((cli->sec_mode & (NEGOTIATE_SECURITY_USER_LEVEL
 				     |NEGOTIATE_SECURITY_CHALLENGE_RESPONSE))
 		   == 0) {
-			char *tmp_pass;
+			uint8_t *tmp_pass;
 
 			if (!lp_client_plaintext_auth() && (*pass)) {
 				DEBUG(1, ("Server requested plaintext "
@@ -2244,21 +2244,20 @@ struct tevent_req *cli_tcon_andx_create(TALLOC_CTX *mem_ctx,
 			 * Non-encrypted passwords - convert to DOS codepage
 			 * before using.
 			 */
-			tmp_pass = talloc_array(talloc_tos(), char, 128);
-			if (tmp_pass == NULL) {
-				tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+			tmp_pass = talloc_array(talloc_tos(), uint8, 0);
+			if (tevent_req_nomem(tmp_pass, req)) {
 				return tevent_req_post(req, ev);
 			}
-			passlen = clistr_push(cli,
-					tmp_pass,
-					pass,
-					talloc_get_size(tmp_pass),
-					STR_TERMINATE);
-			if (passlen == -1) {
-				tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+			tmp_pass = trans2_bytes_push_str(tmp_pass,
+							 false, /* always DOS */
+							 pass,
+							 passlen,
+							 NULL);
+			if (tevent_req_nomem(tmp_pass, req)) {
 				return tevent_req_post(req, ev);
 			}
-			pass = tmp_pass;
+			pass = (const char *)tmp_pass;
+			passlen = talloc_get_size(tmp_pass);
 		}
 	}
 
@@ -2701,13 +2700,9 @@ static void cli_negprot_done(struct tevent_req *subreq)
 		}
 
 		if (cli->capabilities & (CAP_LARGE_READX|CAP_LARGE_WRITEX)) {
-			SAFE_FREE(cli->outbuf);
 			SAFE_FREE(cli->inbuf);
-			cli->outbuf = (char *)SMB_MALLOC(CLI_SAMBA_MAX_LARGE_READX_SIZE+LARGE_WRITEX_HDR_SIZE+SAFETY_MARGIN);
 			cli->inbuf = (char *)SMB_MALLOC(CLI_SAMBA_MAX_LARGE_READX_SIZE+LARGE_WRITEX_HDR_SIZE+SAFETY_MARGIN);
-			if (!cli->outbuf || !cli->inbuf) {
-				tevent_req_nterror(req,
-						NT_STATUS_NO_MEMORY);
+			if (tevent_req_nomem(cli->inbuf, req)) {
 				return;
 			}
 			cli->bufsize = CLI_SAMBA_MAX_LARGE_READX_SIZE + LARGE_WRITEX_HDR_SIZE;
diff --git a/source3/libsmb/clidfs.c b/source3/libsmb/clidfs.c
index 2287812..a0d503a 100644
--- a/source3/libsmb/clidfs.c
+++ b/source3/libsmb/clidfs.c
@@ -614,30 +614,35 @@ NTSTATUS cli_dfs_get_referral(TALLOC_CTX *ctx,
 	uint8_t *rdata = NULL;
 	char *p;
 	char *endp;
-	size_t pathlen = 2*(strlen(path)+1);
 	smb_ucs2_t *path_ucs;
 	char *consumed_path = NULL;
 	uint16_t consumed_ucs;
 	uint16 num_referrals;
 	struct client_dfs_referral *referrals = NULL;
 	NTSTATUS status;
+	TALLOC_CTX *frame = talloc_stackframe();
 
 	*num_refs = 0;
 	*refs = NULL;
 
 	SSVAL(setup, 0, TRANSACT2_GET_DFS_REFERRAL);
 
-	param = SMB_MALLOC_ARRAY(uint8_t, 2+pathlen+2);
+	param = talloc_array(talloc_tos(), uint8_t, 2);
 	if (!param) {
 		status = NT_STATUS_NO_MEMORY;
 		goto out;
 	}
 	SSVAL(param, 0, 0x03);	/* max referral level */
-	p = (char *)(&param[2]);
 
-	path_ucs = (smb_ucs2_t *)p;
-	p += clistr_push(cli, p, path, pathlen, STR_TERMINATE);
-	param_len = PTR_DIFF(p, param);
+	param = trans2_bytes_push_str(param, cli_ucs2(cli),
+				      path, strlen(path)+1,
+				      NULL);
+	if (!param) {
+		status = NT_STATUS_NO_MEMORY;
+		goto out;
+	}
+	param_len = talloc_get_size(param);
+	path_ucs = (smb_ucs2_t *)&param[2];
 
 	status = cli_trans(talloc_tos(), cli, SMBtrans2,
 			   NULL, 0xffff, 0, 0,
@@ -746,9 +751,7 @@ NTSTATUS cli_dfs_get_referral(TALLOC_CTX *ctx,
 
   out:
 
-	TALLOC_FREE(consumed_path);
-	SAFE_FREE(param);
-	TALLOC_FREE(rdata);
+	TALLOC_FREE(frame);
 	return status;
 }
 
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index d3b66b6..91e7fd4 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -201,7 +201,6 @@ struct cli_state *cli_initialise_ex(int signing_state)
 	cli->timeout = 20000; /* Timeout is in milliseconds. */
 	cli->bufsize = CLI_BUFFER_SIZE+4;
 	cli->max_xmit = cli->bufsize;
-	cli->outbuf = (char *)SMB_MALLOC(cli->bufsize+SAFETY_MARGIN);
 	cli->inbuf = (char *)SMB_MALLOC(cli->bufsize+SAFETY_MARGIN);
 	cli->oplock_handler = cli_oplock_ack;
 	cli->case_sensitive = false;
@@ -238,10 +237,9 @@ struct cli_state *cli_initialise_ex(int signing_state)
 		mandatory_signing = true;
 	}
 
-	if (!cli->outbuf || !cli->inbuf)
+	if (!cli->inbuf)
                 goto error;
 
-	memset(cli->outbuf, 0, cli->bufsize);
 	memset(cli->inbuf, 0, cli->bufsize);
 
 	/* initialise signing */
@@ -267,7 +265,6 @@ struct cli_state *cli_initialise_ex(int signing_state)
  error:
 
         SAFE_FREE(cli->inbuf);
-        SAFE_FREE(cli->outbuf);
 	TALLOC_FREE(cli);
         return NULL;
 }
@@ -315,7 +312,6 @@ static void _cli_shutdown(struct cli_state *cli)
 		cli_tdis(cli);
 	}
         
-	SAFE_FREE(cli->outbuf);
 	SAFE_FREE(cli->inbuf);
 
 	data_blob_free(&cli->secblob);
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index eab278f..24a099b 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -128,14 +128,33 @@ uint8_t *smb_bytes_push_bytes(uint8_t *buf, uint8_t prefix,
  other modules use async trans calls.
 ***********************************************************/
 
-static uint8_t *trans2_bytes_push_str(uint8_t *buf, bool ucs2,
-			    const char *str, size_t str_len,
-			    size_t *pconverted_size)
+uint8_t *trans2_bytes_push_str(uint8_t *buf, bool ucs2,
+			       const char *str, size_t str_len,
+			       size_t *pconverted_size)
 {
 	return internal_bytes_push_str(buf, ucs2, str, str_len,
 			false, pconverted_size);
 }
 
+uint8_t *trans2_bytes_push_bytes(uint8_t *buf,
+				 const uint8_t *bytes, size_t num_bytes)
+{
+	size_t buflen;
+
+	if (buf == NULL) {
+		return NULL;
+	}
+	buflen = talloc_get_size(buf);
+
+	buf = talloc_realloc(NULL, buf, uint8_t,
+			     buflen + num_bytes);
+	if (buf == NULL) {
+		return NULL;
+	}
+	memcpy(&buf[buflen], bytes, num_bytes);
+	return buf;
+}
+
 struct cli_setpathinfo_state {
 	uint16_t setup;
 	uint8_t *param;
@@ -4082,24 +4101,25 @@ NTSTATUS cli_set_ea_path(struct cli_state *cli, const char *path,
 {
 	unsigned int param_len = 0;
 	uint8_t *param;
-	size_t srclen = 2*(strlen(path)+1);
-	char *p;
 	NTSTATUS status;
+	TALLOC_CTX *frame = talloc_stackframe();
 
-	param = SMB_MALLOC_ARRAY(uint8_t, 6+srclen+2);
+	param = talloc_array(talloc_tos(), uint8_t, 6);
 	if (!param) {
 		return NT_STATUS_NO_MEMORY;
 	}
-	memset(param, '\0', 6);
 	SSVAL(param,0,SMB_INFO_SET_EA);
-	p = (char *)(&param[6]);
+	SSVAL(param,2,0);
+	SSVAL(param,4,0);
 
-	p += clistr_push(cli, p, path, srclen, STR_TERMINATE);
-	param_len = PTR_DIFF(p, param);
+	param = trans2_bytes_push_str(param, cli_ucs2(cli),
+				      path, strlen(path)+1,
+				      NULL);
+	param_len = talloc_get_size(param);
 
 	status = cli_set_ea(cli, TRANSACT2_SETPATHINFO, param, param_len,
 			    ea_name, ea_val, ea_len);
-	SAFE_FREE(param);
+	SAFE_FREE(frame);
 	return status;
 }
 
diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c
index 9eec97f..2c8a328 100644
--- a/source3/libsmb/clilist.c
+++ b/source3/libsmb/clilist.c
@@ -189,13 +189,15 @@ static size_t interpret_long_filename(TALLOC_CTX *ctx,
 				return pdata_end - base;
 			}
 			p += 2;
-			{
-				/* stupid NT bugs. grr */
-				int flags = 0;
-				if (p[1] == 0 && namelen > 1) flags |= STR_UNICODE;
-				clistr_pull(base_ptr, finfo->short_name, p,
-					    sizeof(finfo->short_name),
-					    slen, flags);
+			ret = clistr_pull_talloc(ctx,
+						base_ptr,
+						recv_flags2,
+						&finfo->short_name,
+						p,
+						slen,
+						STR_UNICODE);
+			if (ret == (size_t)-1) {
+				return pdata_end - base;
 			}
 			p += 24; /* short name? */
 			if (p + namelen < p || p + namelen > pdata_end) {
@@ -263,9 +265,10 @@ static bool interpret_short_filename(TALLOC_CTX *ctx,
 	}
 
 	if (finfo->name) {
-		strlcpy(finfo->short_name,
-			finfo->name,
-			sizeof(finfo->short_name));
+		finfo->short_name = talloc_strdup(ctx, finfo->name);
+		if (finfo->short_name == NULL) {
+			return false;
+		}
 	}
 	return true;
 }
@@ -549,8 +552,7 @@ static struct tevent_req *cli_list_trans_send(TALLOC_CTX *mem_ctx,
 {
 	struct tevent_req *req, *subreq;
 	struct cli_list_trans_state *state;
-	size_t nlen, param_len;
-	char *p;
+	size_t param_len;
 
 	req = tevent_req_create(mem_ctx, &state,
 				struct cli_list_trans_state);
@@ -572,8 +574,7 @@ static struct tevent_req *cli_list_trans_send(TALLOC_CTX *mem_ctx,
 
 	state->setup[0] = TRANSACT2_FINDFIRST;
 
-	nlen = 2*(strlen(mask)+1);
-	state->param = talloc_array(state, uint8_t, 12+nlen+2);
+	state->param = talloc_array(state, uint8_t, 12);
 	if (tevent_req_nomem(state->param, req)) {
 		return tevent_req_post(req, ev);
 	}
@@ -586,10 +587,13 @@ static struct tevent_req *cli_list_trans_send(TALLOC_CTX *mem_ctx,
 	SSVAL(state->param, 6, state->info_level);
 	SIVAL(state->param, 8, 0);
 
-	p = ((char *)state->param)+12;
-	p += clistr_push(state->cli, p, state->mask, nlen,
-			 STR_TERMINATE);
-	param_len = PTR_DIFF(p, state->param);
+	state->param = trans2_bytes_push_str(state->param, cli_ucs2(cli),
+					     state->mask, strlen(state->mask)+1,
+					     NULL);
+	if (tevent_req_nomem(state->param, req)) {
+		return tevent_req_post(req, ev);
+	}
+	param_len = talloc_get_size(state->param);
 
 	subreq = cli_trans_send(state, state->ev, state->cli,
 				SMBtrans2, NULL, -1, 0, 0,
@@ -626,7 +630,7 @@ static void cli_list_trans_done(struct tevent_req *subreq)
 	int i;
 	DATA_BLOB last_name_raw;
 	struct file_info *finfo = NULL;
-	size_t nlen, param_len;
+	size_t param_len;
 
 	min_param = (state->first ? 6 : 4);
 
@@ -734,10 +738,7 @@ static void cli_list_trans_done(struct tevent_req *subreq)
 
 	state->setup[0] = TRANSACT2_FINDNEXT;
 
-	nlen = 2*(strlen(state->mask) + 1);
-
-	param = talloc_realloc(state, state->param, uint8_t,
-				     12 + nlen + last_name_raw.length + 2);
+	param = talloc_realloc(state, state->param, uint8_t, 12);
 	if (tevent_req_nomem(param, req)) {
 		return;
 	}
@@ -758,17 +759,25 @@ static void cli_list_trans_done(struct tevent_req *subreq)
 	 */
 	SSVAL(param, 10, (FLAG_TRANS2_FIND_REQUIRE_RESUME
 			  |FLAG_TRANS2_FIND_CLOSE_IF_END));
-	p = ((char *)param)+12;
 	if (last_name_raw.length) {
-		memcpy(p, last_name_raw.data, last_name_raw.length);
-		p += last_name_raw.length;
+		state->param = trans2_bytes_push_bytes(state->param,
+						       last_name_raw.data,
+						       last_name_raw.length);
+		if (tevent_req_nomem(state->param, req)) {
+			return;
+		}
 		data_blob_free(&last_name_raw);
 	} else {
-		p += clistr_push(state->cli, p, state->mask, nlen,
-				 STR_TERMINATE);
+		state->param = trans2_bytes_push_str(state->param,
+						     cli_ucs2(state->cli),
+						     state->mask,
+						     strlen(state->mask)+1,
+						     NULL);
+		if (tevent_req_nomem(state->param, req)) {
+			return;
+		}
 	}
-
-	param_len = PTR_DIFF(p, param);
+	param_len = talloc_get_size(state->param);
 
 	subreq = cli_trans_send(state, state->ev, state->cli,
 				SMBtrans2, NULL, -1, 0, 0,
diff --git a/source3/libsmb/clistr.c b/source3/libsmb/clistr.c
index ff18ef6..f1264f6 100644
--- a/source3/libsmb/clistr.c
+++ b/source3/libsmb/clistr.c
@@ -21,44 +21,6 @@
 #include "includes.h"
 #include "libsmb/libsmb.h"
 
-size_t clistr_push_fn(struct cli_state *cli,
-			void *dest,
-			const char *src,
-			int dest_len,
-			int flags)
-{
-	size_t buf_used = PTR_DIFF(dest, cli->outbuf);
-	if (dest_len == -1) {
-		if (((ptrdiff_t)dest < (ptrdiff_t)cli->outbuf) || (buf_used > cli->bufsize)) {
-			DEBUG(0, ("Pushing string of 'unlimited' length into non-SMB buffer!\n"));
-			return push_string_base(cli->outbuf,
-						(uint16_t)(cli_ucs2(cli) ? FLAGS2_UNICODE_STRINGS : 0),
-						dest, src, -1, flags);
-		}
-		return push_string_base(cli->outbuf,
-					(uint16_t)(cli_ucs2(cli) ? FLAGS2_UNICODE_STRINGS : 0),
-					dest, src, cli->bufsize - buf_used,
-					flags);
-	}
-
-	/* 'normal' push into size-specified buffer */
-	return push_string_base(cli->outbuf,
-				(uint16_t)(cli_ucs2(cli) ? FLAGS2_UNICODE_STRINGS : 0),
-				dest, src, dest_len, flags);
-}
-
-size_t clistr_pull_fn(const char *inbuf,
-			char *dest,
-			const void *src,
-			int dest_len,
-			int src_len,
-			int flags)
-{
-	return pull_string_fn(inbuf,
-			      SVAL(inbuf, smb_flg2), dest, src, dest_len,
-			      src_len, flags);
-}
-
 size_t clistr_pull_talloc(TALLOC_CTX *ctx,
 			  const char *base,
 			  uint16_t flags2,
diff --git a/source3/libsmb/libsmb_server.c b/source3/libsmb/libsmb_server.c
index 755ef2d..d83d8ff 100644
--- a/source3/libsmb/libsmb_server.c
+++ b/source3/libsmb/libsmb_server.c
@@ -329,10 +329,15 @@ SMBC_server_internal(TALLOC_CTX *ctx,
                         if (is_ipc) {
                                 DEBUG(4,
                                       ("IPC$ so ignore case sensitivity\n"));


-- 
Samba Shared Repository


More information about the samba-cvs mailing list