Forward port the change to talloc_init() to make all talloc contexts
[kai/samba.git] / source3 / libsmb / clisecdesc.c
index b56e1ea68847cadaa4a4de4fa39b52bc3333c188..7dd2747ff6e08b4aae7f258a61c4ba00d9679bcb 100644 (file)
@@ -1,6 +1,5 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 3.0
+   Unix SMB/CIFS implementation.
    client security descriptor functions
    Copyright (C) Andrew Tridgell 2000
    
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#define NO_SYSLOG
-
 #include "includes.h"
 
-
-
 /****************************************************************************
   query the security descriptor for a open file
-  ****************************************************************************/
-SEC_DESC *cli_query_secdesc(struct cli_state *cli,int fd)
+ ****************************************************************************/
+SEC_DESC *cli_query_secdesc(struct cli_state *cli, int fnum, 
+                           TALLOC_CTX *mem_ctx)
 {
        char param[8];
        char *rparam=NULL, *rdata=NULL;
        int rparam_count=0, rdata_count=0;
-       TALLOC_CTX *mem_ctx;
        prs_struct pd;
        SEC_DESC *psd = NULL;
-       SEC_DESC *ret;
 
-       SIVAL(param, 0, fd);
+       SIVAL(param, 0, fnum);
        SSVAL(param, 4, 0x7);
 
        if (!cli_send_nt_trans(cli, 
@@ -48,7 +42,7 @@ SEC_DESC *cli_query_secdesc(struct cli_state *cli,int fd)
                               param, 8, 4,
                               NULL, 0, 0x10000)) {
                DEBUG(1,("Failed to send NT_TRANSACT_QUERY_SECURITY_DESC\n"));
-               return NULL;
+               goto cleanup;
        }
 
 
@@ -56,57 +50,53 @@ SEC_DESC *cli_query_secdesc(struct cli_state *cli,int fd)
                                  &rparam, &rparam_count,
                                  &rdata, &rdata_count)) {
                DEBUG(1,("Failed to recv NT_TRANSACT_QUERY_SECURITY_DESC\n"));
-               return NULL;
+               goto cleanup;
        }
 
-       if ((mem_ctx = talloc_init()) == NULL) {
-               DEBUG(0,("talloc_init failed.\n"));
-               return NULL;
-       }
-
-       prs_init(&pd, rdata_count, 4, mem_ctx, UNMARSHALL);
+       prs_init(&pd, rdata_count, mem_ctx, UNMARSHALL);
        prs_append_data(&pd, rdata, rdata_count);
        pd.data_offset = 0;
 
        if (!sec_io_desc("sd data", &psd, &pd, 1)) {
                DEBUG(1,("Failed to parse secdesc\n"));
-               talloc_destroy(mem_ctx);
-               return NULL;
+               goto cleanup;
        }
 
-       ret = dup_sec_desc(psd);
-       talloc_destroy(mem_ctx);
-       return ret;
-}
-
+ cleanup:
 
+       SAFE_FREE(rparam);
+       SAFE_FREE(rdata);
 
+       prs_mem_free(&pd);
+       return psd;
+}
 
 /****************************************************************************
   set the security descriptor for a open file
 ****************************************************************************/
-BOOL cli_set_secdesc(struct cli_state *cli,int fd, SEC_DESC *sd)
+ ****************************************************************************/
+BOOL cli_set_secdesc(struct cli_state *cli, int fnum, SEC_DESC *sd)
 {
        char param[8];
        char *rparam=NULL, *rdata=NULL;
        int rparam_count=0, rdata_count=0;
        TALLOC_CTX *mem_ctx;
        prs_struct pd;
+       BOOL ret = False;
 
-       if ((mem_ctx = talloc_init()) == NULL) {
+       if ((mem_ctx = talloc_init("cli_set_secdesc")) == NULL) {
                DEBUG(0,("talloc_init failed.\n"));
-               return False;
+               goto cleanup;
        }
 
-       prs_init(&pd, 0, 4, mem_ctx, MARSHALL);
+       prs_init(&pd, 0, mem_ctx, MARSHALL);
        prs_give_memory(&pd, NULL, 0, True);
 
        if (!sec_io_desc("sd data", &sd, &pd, 1)) {
                DEBUG(1,("Failed to marshall secdesc\n"));
-               return False;
+               goto cleanup;
        }
 
-       SIVAL(param, 0, fd);
+       SIVAL(param, 0, fnum);
        SSVAL(param, 4, 0x7);
 
        if (!cli_send_nt_trans(cli, 
@@ -116,7 +106,7 @@ BOOL cli_set_secdesc(struct cli_state *cli,int fd, SEC_DESC *sd)
                               param, 8, 0,
                               pd.data_p, pd.data_offset, 0)) {
                DEBUG(1,("Failed to send NT_TRANSACT_SET_SECURITY_DESC\n"));
-               return False;
+               goto cleanup;
        }
 
 
@@ -124,14 +114,18 @@ BOOL cli_set_secdesc(struct cli_state *cli,int fd, SEC_DESC *sd)
                                  &rparam, &rparam_count,
                                  &rdata, &rdata_count)) {
                DEBUG(1,("NT_TRANSACT_SET_SECURITY_DESC failed\n"));
-               return False;
+               goto cleanup;
        }
 
-       if (rparam) free(rparam);
-       if (rdata) free(rdata);
+       ret = True;
+
+  cleanup:
+
+       SAFE_FREE(rparam);
+       SAFE_FREE(rdata);
 
        talloc_destroy(mem_ctx);
 
-       return True;
+       prs_mem_free(&pd);
+       return ret;
 }
-