[SCM] Samba Shared Repository - branch v3-2-test updated -
initial-v3-2-unstable-343-gbac3bb2
Jeremy Allison
jra at samba.org
Tue Nov 20 23:32:13 GMT 2007
The branch, v3-2-test has been updated
via bac3bb2f6e9e15b3a9a6a6511c484f8509918ca1 (commit)
via 76f9c0b2dccffbff7cbf98aa63f50b48ad7cb9cb (commit)
from 99b75cada2c4caaec5d30c8351080f0a41e44bd1 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test
- Log -----------------------------------------------------------------
commit bac3bb2f6e9e15b3a9a6a6511c484f8509918ca1
Author: Jeremy Allison <jra at samba.org>
Date: Tue Nov 20 15:31:37 2007 -0800
More trivial pstring removal.
Jeremy.
commit 76f9c0b2dccffbff7cbf98aa63f50b48ad7cb9cb
Author: Jeremy Allison <jra at samba.org>
Date: Tue Nov 20 15:31:18 2007 -0800
Paranoia check that space_remaining never goes -ve.
Jeremy.
-----------------------------------------------------------------------
Summary of changes:
source/lib/charcnv.c | 2 +-
source/lib/util_unistr.c | 19 +++++
source/rpc_parse/parse_net.c | 2 +-
source/rpc_parse/parse_prs.c | 11 ++-
source/rpcclient/cmd_spoolss.c | 156 +++++++++++++++++++++++++++-------------
source/rpcclient/rpcclient.c | 5 +-
source/smbd/trans2.c | 12 +++-
7 files changed, 146 insertions(+), 61 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source/lib/charcnv.c b/source/lib/charcnv.c
index da972f5..0dfa88e 100644
--- a/source/lib/charcnv.c
+++ b/source/lib/charcnv.c
@@ -932,7 +932,7 @@ char *strdup_lower(const char *s)
return out_buffer;
}
-static size_t ucs2_align(const void *base_ptr, const void *p, int flags)
+size_t ucs2_align(const void *base_ptr, const void *p, int flags)
{
if (flags & (STR_NOALIGN|STR_ASCII))
return 0;
diff --git a/source/lib/util_unistr.c b/source/lib/util_unistr.c
index 1fef6ab..45f09da 100644
--- a/source/lib/util_unistr.c
+++ b/source/lib/util_unistr.c
@@ -319,6 +319,25 @@ int rpcstr_pull(char* dest, void *src, int dest_len, int src_len, int flags)
return pull_ucs2(NULL, dest, src, dest_len, src_len, flags|STR_UNICODE|STR_NOALIGN);
}
+/* Copy a string from little-endian or big-endian unicode source (depending
+ * on flags) to internal samba format destination. Allocates on talloc ctx.
+ */
+
+int rpcstr_pull_talloc(TALLOC_CTX *ctx,
+ char **dest,
+ void *src,
+ int src_len,
+ int flags)
+{
+ return pull_ucs2_base_talloc(ctx,
+ NULL,
+ dest,
+ src,
+ src_len,
+ flags|STR_UNICODE|STR_NOALIGN);
+
+}
+
/* Copy a string from a unistr2 source to internal samba format
destination. Use this instead of direct calls to rpcstr_pull() to avoid
having to determine whether the source string is null terminated. */
diff --git a/source/rpc_parse/parse_net.c b/source/rpc_parse/parse_net.c
index e12d9dd..df11c6d 100644
--- a/source/rpc_parse/parse_net.c
+++ b/source/rpc_parse/parse_net.c
@@ -1086,7 +1086,7 @@ bool net_io_r_srv_pwset(const char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps,
static int init_dom_sid2s(TALLOC_CTX *ctx, const char *sids_str, DOM_SID2 **ppsids)
{
const char *ptr;
- pstring s2;
+ fstring s2;
int count = 0;
DEBUG(4,("init_dom_sid2s: %s\n", sids_str ? sids_str:""));
diff --git a/source/rpc_parse/parse_prs.c b/source/rpc_parse/parse_prs.c
index a30e967..137e0da 100644
--- a/source/rpc_parse/parse_prs.c
+++ b/source/rpc_parse/parse_prs.c
@@ -48,14 +48,18 @@ void prs_dump_region(char *name, int v, prs_struct *ps,
int from_off, int to_off)
{
int fd, i;
- pstring fname;
+ char *fname = NULL;
ssize_t sz;
if (DEBUGLEVEL < 50) return;
for (i=1;i<100;i++) {
if (v != -1) {
- slprintf(fname,sizeof(fname)-1, "/tmp/%s_%d.%d.prs", name, v, i);
+ if (asprintf(&fname,"/tmp/%s_%d.%d.prs", name, v, i) < 0) {
+ return;
+ }
} else {
- slprintf(fname,sizeof(fname)-1, "/tmp/%s.%d.prs", name, i);
+ if (asprintf(&fname,"/tmp/%s.%d.prs", name, i) < 0) {
+ return;
+ }
}
fd = open(fname, O_WRONLY|O_CREAT|O_EXCL, 0644);
if (fd != -1 || errno != EEXIST) break;
@@ -69,6 +73,7 @@ void prs_dump_region(char *name, int v, prs_struct *ps,
DEBUG(0,("created %s\n", fname));
}
}
+ SAFE_FREE(fname);
}
/*******************************************************************
diff --git a/source/rpcclient/cmd_spoolss.c b/source/rpcclient/cmd_spoolss.c
index e573e92..3bcf1bd 100644
--- a/source/rpcclient/cmd_spoolss.c
+++ b/source/rpcclient/cmd_spoolss.c
@@ -675,17 +675,20 @@ static WERROR cmd_spoolss_getprinter(struct rpc_pipe_client *cli,
static void display_reg_value(REGISTRY_VALUE value)
{
- pstring text;
+ char *text = NULL;
switch(value.type) {
case REG_DWORD:
- printf("%s: REG_DWORD: 0x%08x\n", value.valuename,
+ printf("%s: REG_DWORD: 0x%08x\n", value.valuename,
*((uint32 *) value.data_p));
break;
case REG_SZ:
- rpcstr_pull(text, value.data_p, sizeof(text), value.size,
- STR_TERMINATE);
- printf("%s: REG_SZ: %s\n", value.valuename, text);
+ rpcstr_pull_talloc(talloc_tos(),
+ &text,
+ value.data_p,
+ value.size,
+ STR_TERMINATE);
+ printf("%s: REG_SZ: %s\n", value.valuename, text ? text : "");
break;
case REG_BINARY: {
char *hex = hex_encode(NULL, value.data_p, value.size);
@@ -2163,16 +2166,16 @@ static WERROR cmd_spoolss_enum_jobs(struct rpc_pipe_client *cli,
WERROR result;
uint32 level = 1, num_jobs, i;
bool got_hnd = False;
- pstring printername;
+ char *printername = NULL;
fstring servername, user;
POLICY_HND hnd;
JOB_INFO_CTR ctr;
-
+
if (argc < 2 || argc > 3) {
printf("Usage: %s printername [level]\n", argv[0]);
return WERR_OK;
}
-
+
if (argc == 3)
level = atoi(argv[2]);
@@ -2181,17 +2184,25 @@ static WERROR cmd_spoolss_enum_jobs(struct rpc_pipe_client *cli,
slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost);
strupper_m(servername);
fstrcpy(user, cli->user_name);
- slprintf(printername, sizeof(servername)-1, "\\\\%s\\", cli->cli->desthost);
+ printername = talloc_asprintf(mem_ctx,
+ "\\\\%s\\",
+ cli->cli->desthost);
+ if (!printername) {
+ return WERR_NOMEM;
+ }
strupper_m(printername);
- pstrcat(printername, argv[1]);
+ printername = talloc_asprintf_append(printername, "%s", argv[1]);
+ if (!printername) {
+ return WERR_NOMEM;
+ }
- result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername,
- "", MAXIMUM_ALLOWED_ACCESS,
+ result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername,
+ "", MAXIMUM_ALLOWED_ACCESS,
servername, user, &hnd);
if (!W_ERROR_IS_OK(result))
goto done;
-
+
got_hnd = True;
/* Enumerate ports */
@@ -2233,7 +2244,7 @@ static WERROR cmd_spoolss_enum_data( struct rpc_pipe_client *cli,
WERROR result;
uint32 i=0, val_needed, data_needed;
bool got_hnd = False;
- pstring printername;
+ char *printername = NULL;
fstring servername, user;
POLICY_HND hnd;
@@ -2241,18 +2252,28 @@ static WERROR cmd_spoolss_enum_data( struct rpc_pipe_client *cli,
printf("Usage: %s printername\n", argv[0]);
return WERR_OK;
}
-
+
/* Open printer handle */
slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost);
strupper_m(servername);
fstrcpy(user, cli->user_name);
- slprintf(printername, sizeof(printername)-1, "\\\\%s\\", cli->cli->desthost);
+ printername = talloc_asprintf(mem_ctx,
+ "\\\\%s\\",
+ cli->cli->desthost);
+ if (!printername) {
+ return WERR_NOMEM;
+ }
strupper_m(printername);
- pstrcat(printername, argv[1]);
+ printername = talloc_asprintf_append(mem_ctx,
+ "%s",
+ argv[1]);
+ if (!printername) {
+ return WERR_NOMEM;
+ }
- result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername,
- "", MAXIMUM_ALLOWED_ACCESS,
+ result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername,
+ "", MAXIMUM_ALLOWED_ACCESS,
servername, user, &hnd);
if (!W_ERROR_IS_OK(result))
@@ -2293,7 +2314,7 @@ static WERROR cmd_spoolss_enum_data_ex( struct rpc_pipe_client *cli,
WERROR result;
uint32 i;
bool got_hnd = False;
- pstring printername;
+ char *printername = NULL;
fstring servername, user;
const char *keyname = NULL;
POLICY_HND hnd;
@@ -2303,7 +2324,7 @@ static WERROR cmd_spoolss_enum_data_ex( struct rpc_pipe_client *cli,
printf("Usage: %s printername <keyname>\n", argv[0]);
return WERR_OK;
}
-
+
keyname = argv[2];
/* Open printer handle */
@@ -2311,9 +2332,20 @@ static WERROR cmd_spoolss_enum_data_ex( struct rpc_pipe_client *cli,
slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost);
strupper_m(servername);
fstrcpy(user, cli->user_name);
- slprintf(printername, sizeof(printername)-1, "\\\\%s\\", cli->cli->desthost);
+
+ printername = talloc_asprintf(mem_ctx,
+ "\\\\%s\\",
+ cli->cli->desthost);
+ if (!printername) {
+ return WERR_NOMEM;
+ }
strupper_m(printername);
- pstrcat(printername, argv[1]);
+ printername = talloc_asprintf_append(mem_ctx,
+ "%s",
+ argv[1]);
+ if (!printername) {
+ return WERR_NOMEM;
+ }
result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername,
"", MAXIMUM_ALLOWED_ACCESS,
@@ -2356,7 +2388,7 @@ static WERROR cmd_spoolss_enum_printerkey( struct rpc_pipe_client *cli,
{
WERROR result;
bool got_hnd = False;
- pstring printername;
+ char *printername = NULL;
fstring servername, user;
const char *keyname = NULL;
POLICY_HND hnd;
@@ -2366,7 +2398,7 @@ static WERROR cmd_spoolss_enum_printerkey( struct rpc_pipe_client *cli,
printf("Usage: %s printername [keyname]\n", argv[0]);
return WERR_OK;
}
-
+
if (argc == 3)
keyname = argv[2];
else
@@ -2377,9 +2409,21 @@ static WERROR cmd_spoolss_enum_printerkey( struct rpc_pipe_client *cli,
slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost);
strupper_m(servername);
fstrcpy(user, cli->user_name);
- slprintf(printername, sizeof(printername)-1, "\\\\%s\\", cli->cli->desthost);
+
+ printername = talloc_asprintf(mem_ctx,
+ "\\\\%s\\",
+ cli->cli->desthost);
+ if (!printername) {
+ return WERR_NOMEM;
+ }
strupper_m(printername);
- pstrcat(printername, argv[1]);
+ printername = talloc_asprintf_append(mem_ctx,
+ "%s",
+ argv[1]);
+ if (!printername) {
+ return WERR_NOMEM;
+ }
+
result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername,
"", MAXIMUM_ALLOWED_ACCESS,
@@ -2399,9 +2443,12 @@ static WERROR cmd_spoolss_enum_printerkey( struct rpc_pipe_client *cli,
curkey = keylist;
while (*curkey != 0) {
- pstring subkey;
- rpcstr_pull(subkey, curkey, sizeof(subkey), -1,
+ char *subkey = NULL;
+ rpcstr_pull_talloc(mem_ctx, &subkey, curkey, -1,
STR_TERMINATE);
+ if (!subkey) {
+ break;
+ }
printf("%s\n", subkey);
curkey += strlen(subkey) + 1;
}
@@ -2605,38 +2652,37 @@ static WERROR cmd_spoolss_printercmp(struct rpc_pipe_client *cli,
const char **argv)
{
fstring printername, servername1, servername2;
- pstring printername_path;
+ char *printername_path = NULL;
struct cli_state *cli_server1 = cli->cli;
struct cli_state *cli_server2 = NULL;
struct rpc_pipe_client *cli2 = NULL;
POLICY_HND hPrinter1, hPrinter2;
NTSTATUS nt_status;
WERROR werror;
-
+
if ( argc != 3 ) {
printf("Usage: %s <printer> <server>\n", argv[0]);
return WERR_OK;
}
-
+
fstrcpy( printername, argv[1] );
-
+
fstr_sprintf( servername1, cli->cli->desthost );
fstrcpy( servername2, argv[2] );
strupper_m( servername1 );
strupper_m( servername2 );
-
-
+
/* first get the connection to the remote server */
-
+
nt_status = cli_full_connection(&cli_server2, global_myname(), servername2,
NULL, 0,
- "IPC$", "IPC",
- cmdline_auth_info.username,
+ "IPC$", "IPC",
+ cmdline_auth_info.username,
lp_workgroup(),
- cmdline_auth_info.password,
+ cmdline_auth_info.password,
cmdline_auth_info.use_kerberos ? CLI_FULL_CONNECTION_USE_KERBEROS : 0,
cmdline_auth_info.signing_state, NULL);
-
+
if ( !NT_STATUS_IS_OK(nt_status) )
return WERR_GENERAL_FAILURE;
@@ -2646,10 +2692,16 @@ static WERROR cmd_spoolss_printercmp(struct rpc_pipe_client *cli,
servername2, nt_errstr(nt_status));
return WERR_GENERAL_FAILURE;
}
-
+
/* now open up both printers */
- pstr_sprintf( printername_path, "\\\\%s\\%s", servername1, printername );
+ printername_path = talloc_asprintf(mem_ctx,
+ "\\\\%s\\%s",
+ servername1,
+ printername);
+ if (!printername_path) {
+ return WERR_NOMEM;
+ }
printf("Opening %s...", printername_path);
werror = rpccli_spoolss_open_printer_ex( cli, mem_ctx, printername_path,
"", PRINTER_ALL_ACCESS, servername1, cli_server1->user_name, &hPrinter1);
@@ -2658,8 +2710,14 @@ static WERROR cmd_spoolss_printercmp(struct rpc_pipe_client *cli,
goto done;
}
printf("ok\n");
-
- pstr_sprintf( printername_path, "\\\\%s\\%s", servername2, printername );
+
+ printername_path = talloc_asprintf(mem_ctx,
+ "\\\\%s\\%s",
+ servername2,
+ printername);
+ if (!printername_path) {
+ return WERR_NOMEM;
+ }
printf("Opening %s...", printername_path);
werror = rpccli_spoolss_open_printer_ex( cli2, mem_ctx, printername_path,
"", PRINTER_ALL_ACCESS, servername2, cli_server2->user_name, &hPrinter2 );
@@ -2668,8 +2726,7 @@ static WERROR cmd_spoolss_printercmp(struct rpc_pipe_client *cli,
goto done;
}
printf("ok\n");
-
-
+
compare_printer( cli, &hPrinter1, cli2, &hPrinter2 );
compare_printer_secdesc( cli, &hPrinter1, cli2, &hPrinter2 );
#if 0
@@ -2680,15 +2737,14 @@ static WERROR cmd_spoolss_printercmp(struct rpc_pipe_client *cli,
done:
/* cleanup */
- printf("Closing printers...");
+ printf("Closing printers...");
rpccli_spoolss_close_printer( cli, mem_ctx, &hPrinter1 );
rpccli_spoolss_close_printer( cli2, mem_ctx, &hPrinter2 );
printf("ok\n");
-
+
/* close the second remote connection */
-
+
cli_shutdown( cli_server2 );
-
return WERR_OK;
}
diff --git a/source/rpcclient/rpcclient.c b/source/rpcclient/rpcclient.c
index 6d318ae..9f59ea6 100644
--- a/source/rpcclient/rpcclient.c
+++ b/source/rpcclient/rpcclient.c
@@ -878,12 +878,9 @@ out_free:
/* Loop around accepting commands */
while(1) {
- pstring prompt;
char *line;
- slprintf(prompt, sizeof(prompt) - 1, "rpcclient $> ");
-
- line = smb_readline(prompt, NULL, completion_fn);
+ line = smb_readline("rpcclient $> ", NULL, completion_fn);
if (line == NULL)
break;
diff --git a/source/smbd/trans2.c b/source/smbd/trans2.c
index bb24db9..323d78c 100644
--- a/source/smbd/trans2.c
+++ b/source/smbd/trans2.c
@@ -1371,7 +1371,9 @@ static bool get_lanman2_dir_entry(TALLOC_CTX *ctx,
SSVAL(p,20,mode);
p += 23;
nameptr = p;
- p += align_string(pdata, p, 0);
+ if (flags2 & FLAGS2_UNICODE_STRINGS) {
+ p += ucs2_align(base_data, p, 0);
+ }
len = srvstr_push(base_data, flags2, p,
fname, PTR_DIFF(end_data, p),
STR_TERMINATE);
@@ -2022,7 +2024,13 @@ total_data=%u (should be %u)\n", (unsigned int)total_data, (unsigned int)IVAL(pd
if(got_exact_match)
finished = True;
- space_remaining = max_data_bytes - PTR_DIFF(p,pdata);
+ /* Ensure space_remaining never goes -ve. */
+ if (PTR_DIFF(p,pdata) > max_data_bytes) {
+ space_remaining = 0;
+ out_of_space = true;
+ } else {
+ space_remaining = max_data_bytes - PTR_DIFF(p,pdata);
+ }
}
/* Check if we can close the dirptr */
--
Samba Shared Repository
More information about the samba-cvs
mailing list