s3fs-utils: Free the popt context in smbcacls and smbquotas.
[kai/samba.git] / source3 / utils / smbcacls.c
index f6b2ba65aaacaa207495736030a7b397e036827a..7df4e4872580d2a4834b0e2deeb361c998c40efb 100644 (file)
@@ -89,9 +89,9 @@ static NTSTATUS cli_lsa_lookup_sid(struct cli_state *cli,
        char **domains;
        char **names;
 
-       status = cli_tcon_andx(cli, "IPC$", "?????", "", 0);
+       status = cli_tree_connect(cli, "IPC$", "?????", "", 0);
        if (!NT_STATUS_IS_OK(status)) {
-               return status;
+               goto tcon_fail;
        }
 
        status = cli_rpc_pipe_open_noauth(cli, &ndr_table_lsarpc.syntax_id,
@@ -120,6 +120,7 @@ static NTSTATUS cli_lsa_lookup_sid(struct cli_state *cli,
  fail:
        TALLOC_FREE(p);
        cli_tdis(cli);
+ tcon_fail:
        cli_state_set_tid(cli, orig_cnum);
        TALLOC_FREE(frame);
        return status;
@@ -138,9 +139,9 @@ static NTSTATUS cli_lsa_lookup_name(struct cli_state *cli,
        struct dom_sid *sids;
        enum lsa_SidType *types;
 
-       status = cli_tcon_andx(cli, "IPC$", "?????", "", 0);
+       status = cli_tree_connect(cli, "IPC$", "?????", "", 0);
        if (!NT_STATUS_IS_OK(status)) {
-               return status;
+               goto tcon_fail;
        }
 
        status = cli_rpc_pipe_open_noauth(cli, &ndr_table_lsarpc.syntax_id,
@@ -168,6 +169,7 @@ static NTSTATUS cli_lsa_lookup_name(struct cli_state *cli,
  fail:
        TALLOC_FREE(p);
        cli_tdis(cli);
+ tcon_fail:
        cli_state_set_tid(cli, orig_cnum);
        TALLOC_FREE(frame);
        return status;
@@ -185,7 +187,7 @@ static NTSTATUS cli_lsa_lookup_domain_sid(struct cli_state *cli,
        TALLOC_CTX *frame = talloc_stackframe();
        const struct ndr_syntax_id *lsarpc_syntax = &ndr_table_lsarpc.syntax_id;
 
-       status = cli_tcon_andx(cli, "IPC$", "?????", "", 0);
+       status = cli_tree_connect(cli, "IPC$", "?????", "", 0);
        if (!NT_STATUS_IS_OK(status)) {
                goto done;
        }
@@ -221,7 +223,8 @@ done:
        return status;
 }
 
-struct dom_sid* get_domain_sid(struct cli_state *cli) {
+static struct dom_sid *get_domain_sid(struct cli_state *cli)
+{
        NTSTATUS status;
 
        struct dom_sid *sid = talloc(talloc_tos(), struct dom_sid);
@@ -865,12 +868,21 @@ static bool set_secdesc(struct cli_state *cli, const char *filename,
        uint16_t fnum = (uint16_t)-1;
         bool result=true;
        NTSTATUS status;
+       uint32_t desired_access = 0;
 
-       /* The desired access below is the only one I could find that works
-          with NT4, W2KP and Samba */
+       /* Make the desired_access more specific. */
+       if (sd->dacl) {
+               desired_access |= WRITE_DAC_ACCESS;
+       }
+       if (sd->sacl) {
+               desired_access |= SEC_FLAG_SYSTEM_SECURITY;
+       }
+       if (sd->owner_sid || sd->group_sid) {
+               desired_access |= WRITE_OWNER_ACCESS;
+       }
 
        status = cli_ntcreate(cli, filename, 0,
-                             WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS,
+                             desired_access,
                              0, FILE_SHARE_READ|FILE_SHARE_WRITE,
                              FILE_OPEN, 0x0, 0x0, &fnum);
        if (!NT_STATUS_IS_OK(status)) {
@@ -894,25 +906,29 @@ dump the acls for a file
 *******************************************************/
 static int cacl_dump(struct cli_state *cli, const char *filename)
 {
-       int result = EXIT_FAILED;
        struct security_descriptor *sd;
 
-       if (test_args)
+       if (test_args) {
                return EXIT_OK;
+       }
 
        sd = get_secdesc(cli, filename);
+       if (sd == NULL) {
+               return EXIT_FAILED;
+       }
 
-       if (sd) {
-               if (sddl) {
-                       printf("%s\n", sddl_encode(talloc_tos(), sd,
-                                          get_domain_sid(cli)));
-               } else {
-                       sec_desc_print(cli, stdout, sd);
+       if (sddl) {
+               char *str = sddl_encode(talloc_tos(), sd, get_domain_sid(cli));
+               if (str == NULL) {
+                       return EXIT_FAILED;
                }
-               result = EXIT_OK;
+               printf("%s\n", str);
+               TALLOC_FREE(str);
+       } else {
+               sec_desc_print(cli, stdout, sd);
        }
 
-       return result;
+       return EXIT_OK;
 }
 
 /***************************************************** 
@@ -1419,6 +1435,8 @@ static struct cli_state *connect_one(struct user_auth_info *auth_info,
                return -1;
        }
 
+       poptFreeContext(pc);
+
        string_replace(path,'/','\\');
 
        server = talloc_strdup(frame, path+2);