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 <b...@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 <me...@samba.org> Autobuild-User: Stefan Metzmacher <me...@samba.org> Autobuild-Date: Thu Jul 7 20:29:13 CEST 2011 on sn-devel-104 commit 80c65416c17169e487ce17314bdc9975679ec331 Author: Björn Baumbach <b...@sernet.de> Date: Thu Jul 7 17:36:22 2011 +0200 s3-client: Remove use of cli_errstr() Signed-off-by: Stefan Metzmacher <me...@samba.org> commit 11426758d71e59ffe9804d2ebb2f145b4ed398e1 Author: Björn Baumbach <b...@sernet.de> Date: Thu Jul 7 17:18:40 2011 +0200 s3-libsmb: Remove use of cli_errstr() Signed-off-by: Stefan Metzmacher <me...@samba.org> commit 98e0f9d1edb77f07f2f733478e91d0410c020b2e Author: Björn Baumbach <b...@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 <me...@samba.org> commit 684095b0a2e24869b684cc12b92ed7847caf0021 Author: Björn Baumbach <b...@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 <me...@samba.org> commit 840a1c7445377c24bfff04ffa619ea6b4aa83029 Author: Stefan Metzmacher <me...@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 <me...@samba.org> commit 60873a9e48115e5bfb3c58cccd078c49d43c56bc Author: Björn Baumbach <b...@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 <me...@samba.org> commit 3cdf962d1ea2823e2a5200533685b3a627a00237 Author: Stefan Metzmacher <me...@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 <me...@samba.org> Date: Thu Jul 7 17:24:32 2011 +0200 s3:libsmb: remove unused clistr_push_fn() metze commit 30574a73d8073e1bb0a552fdf8444f17eeebec74 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Jul 6 17:57:45 2011 +0200 s3:libsmb: remove unused clistr_pull_fn() metze commit fc992e7029a8cec00b91b50e79f90dea09efcab2 Author: Stefan Metzmacher <me...@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 <me...@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 <me...@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 <me...@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 <me...@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 <me...@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 <me...@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 <me...@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 <me...@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 <me...@samba.org> Date: Thu Jul 7 10:02:36 2011 +0200 s3:libsmb: add trans2_bytes_push_bytes() metze commit ed99caded241925dbd8beee5bb57ba2d4a3b1c5e Author: Stefan Metzmacher <me...@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 <me...@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 *)(¶m[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 *)¶m[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 *)(¶m[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