summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/adt_tree.c52
-rw-r--r--source3/lib/smbrun.c28
2 files changed, 51 insertions, 29 deletions
diff --git a/source3/lib/adt_tree.c b/source3/lib/adt_tree.c
index f26f924d61..cf305d7307 100644
--- a/source3/lib/adt_tree.c
+++ b/source3/lib/adt_tree.c
@@ -278,31 +278,41 @@ done:
Recursive routine to print out all children of a TREE_NODE
*************************************************************************/
-static void pathtree_print_children( TREE_NODE *node, int debug, const char *path )
+static void pathtree_print_children(TALLOC_CTX *ctx,
+ TREE_NODE *node,
+ int debug,
+ const char *path )
{
int i;
int num_children;
- pstring path2;
-
+ char *path2 = NULL;
+
if ( !node )
return;
-
-
+
if ( node->key )
DEBUG(debug,("%s: [%s] (%s)\n", path ? path : "NULL", node->key,
node->data_p ? "data" : "NULL" ));
- *path2 = '\0';
- if ( path )
- pstrcpy( path2, path );
- pstrcat( path2, node->key ? node->key : "NULL" );
- pstrcat( path2, "/" );
-
- num_children = node->num_children;
- for ( i=0; i<num_children; i++ )
- pathtree_print_children( node->children[i], debug, path2 );
-
+ if ( path ) {
+ path2 = talloc_strdup(ctx, path);
+ if (!path2) {
+ return;
+ }
+ }
+
+ path2 = talloc_asprintf(ctx,
+ "%s%s/",
+ path ? path : "",
+ node->key ? node->key : "NULL");
+ if (!path2) {
+ return;
+ }
+ num_children = node->num_children;
+ for ( i=0; i<num_children; i++ ) {
+ pathtree_print_children(ctx, node->children[i], debug, path2 );
+ }
}
/**************************************************************************
@@ -313,21 +323,23 @@ static void pathtree_print_children( TREE_NODE *node, int debug, const char *pat
{
int i;
int num_children = tree->root->num_children;
-
+
if ( tree->root->key )
DEBUG(debug,("ROOT/: [%s] (%s)\n", tree->root->key,
tree->root->data_p ? "data" : "NULL" ));
-
+
for ( i=0; i<num_children; i++ ) {
- pathtree_print_children( tree->root->children[i], debug,
+ TALLOC_CTX *ctx = talloc_stackframe();
+ pathtree_print_children(ctx, tree->root->children[i], debug,
tree->root->key ? tree->root->key : "ROOT/" );
+ TALLOC_FREE(ctx);
}
-
+
}
/**************************************************************************
return the data_p for for the node in tree matching the key string
- The key string is the full path. We must break it apart and walk
+ The key string is the full path. We must break it apart and walk
the tree
*************************************************************************/
diff --git a/source3/lib/smbrun.c b/source3/lib/smbrun.c
index b656822321..26330ab992 100644
--- a/source3/lib/smbrun.c
+++ b/source3/lib/smbrun.c
@@ -1,18 +1,18 @@
-/*
+/*
Unix SMB/CIFS implementation.
run a command as a specified user
Copyright (C) Andrew Tridgell 1992-1998
-
+
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/>.
*/
@@ -27,11 +27,19 @@ This is a utility function of smbrun().
****************************************************************************/
static int setup_out_fd(void)
-{
+{
int fd;
- pstring path;
-
- slprintf(path, sizeof(path)-1, "%s/smb.XXXXXX", tmpdir());
+ TALLOC_CTX *ctx = talloc_stackframe();
+ char *path = NULL;
+
+ path = talloc_asprintf(ctx,
+ "%s/smb.XXXXXX",
+ tmpdir());
+ if (!path) {
+ TALLOC_FREE(ctx);
+ errno = ENOMEM;
+ return -1;
+ }
/* now create the file */
fd = smb_mkstemp(path);
@@ -39,6 +47,7 @@ static int setup_out_fd(void)
if (fd == -1) {
DEBUG(0,("setup_out_fd: Failed to create file %s. (%s)\n",
path, strerror(errno) ));
+ TALLOC_FREE(ctx);
return -1;
}
@@ -46,6 +55,7 @@ static int setup_out_fd(void)
/* Ensure file only kept around by open fd. */
unlink(path);
+ TALLOC_FREE(ctx);
return fd;
}
@@ -59,7 +69,7 @@ static int smbrun_internal(const char *cmd, int *outfd, BOOL sanitize)
pid_t pid;
uid_t uid = current_user.ut.uid;
gid_t gid = current_user.ut.gid;
-
+
/*
* Lose any elevated privileges.
*/