Fix a couple of memory leaks in the cli_establish_connection() code's failure
[ira/wip.git] / source3 / libsmb / cliconnect.c
index 75560da6766f2f7406000a31862a5d0fc4e3734c..86ff6b5c9250724e6811b84ee8a3ede4cfd70b31 100644 (file)
@@ -76,10 +76,10 @@ static BOOL cli_session_setup_lanman2(struct cli_state *cli, char *user,
        /* send a session setup command */
        memset(cli->outbuf,'\0',smb_size);
        set_message(cli->outbuf,10, 0, True);
-       CVAL(cli->outbuf,smb_com) = SMBsesssetupX;
+       SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
        cli_setup_packet(cli);
        
-       CVAL(cli->outbuf,smb_vwv0) = 0xFF;
+       SCVAL(cli->outbuf,smb_vwv0,0xFF);
        SSVAL(cli->outbuf,smb_vwv2,cli->max_xmit);
        SSVAL(cli->outbuf,smb_vwv3,2);
        SSVAL(cli->outbuf,smb_vwv4,1);
@@ -142,10 +142,10 @@ static BOOL cli_session_setup_guest(struct cli_state *cli)
        uint32 capabilities = cli_session_setup_capabilities(cli);
 
        set_message(cli->outbuf,13,0,True);
-       CVAL(cli->outbuf,smb_com) = SMBsesssetupX;
+       SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
        cli_setup_packet(cli);
                        
-       CVAL(cli->outbuf,smb_vwv0) = 0xFF;
+       SCVAL(cli->outbuf,smb_vwv0,0xFF);
        SSVAL(cli->outbuf,smb_vwv2,CLI_BUFFER_SIZE);
        SSVAL(cli->outbuf,smb_vwv3,2);
        SSVAL(cli->outbuf,smb_vwv4,cli->pid);
@@ -197,10 +197,10 @@ static BOOL cli_session_setup_plaintext(struct cli_state *cli, char *user,
        passlen = clistr_push(cli, pword, pass, sizeof(pword), STR_TERMINATE|STR_ASCII);
 
        set_message(cli->outbuf,13,0,True);
-       CVAL(cli->outbuf,smb_com) = SMBsesssetupX;
+       SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
        cli_setup_packet(cli);
                        
-       CVAL(cli->outbuf,smb_vwv0) = 0xFF;
+       SCVAL(cli->outbuf,smb_vwv0,0xFF);
        SSVAL(cli->outbuf,smb_vwv2,CLI_BUFFER_SIZE);
        SSVAL(cli->outbuf,smb_vwv3,2);
        SSVAL(cli->outbuf,smb_vwv4,cli->pid);
@@ -273,10 +273,10 @@ static BOOL cli_session_setup_nt1(struct cli_state *cli, char *user,
        memset(cli->outbuf,'\0',smb_size);
 
        set_message(cli->outbuf,13,0,True);
-       CVAL(cli->outbuf,smb_com) = SMBsesssetupX;
+       SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
        cli_setup_packet(cli);
                        
-       CVAL(cli->outbuf,smb_vwv0) = 0xFF;
+       SCVAL(cli->outbuf,smb_vwv0,0xFF);
        SSVAL(cli->outbuf,smb_vwv2,CLI_BUFFER_SIZE);
        SSVAL(cli->outbuf,smb_vwv3,2);
        SSVAL(cli->outbuf,smb_vwv4,cli->pid);
@@ -335,10 +335,10 @@ static DATA_BLOB cli_session_setup_blob(struct cli_state *cli, DATA_BLOB blob)
        memset(cli->outbuf,'\0',smb_size);
 
        set_message(cli->outbuf,12,0,True);
-       CVAL(cli->outbuf,smb_com) = SMBsesssetupX;
+       SCVAL(cli->outbuf,smb_com,SMBsesssetupX);
        cli_setup_packet(cli);
                        
-       CVAL(cli->outbuf,smb_vwv0) = 0xFF;
+       SCVAL(cli->outbuf,smb_vwv0,0xFF);
        SSVAL(cli->outbuf,smb_vwv2,CLI_BUFFER_SIZE);
        SSVAL(cli->outbuf,smb_vwv3,2);
        SSVAL(cli->outbuf,smb_vwv4,1);
@@ -576,7 +576,8 @@ BOOL cli_session_setup(struct cli_state *cli,
 
        /* allow for workgroups as part of the username */
        fstrcpy(user2, user);
-       if ((p=strchr_m(user2,'\\')) || (p=strchr_m(user2,'/'))) {
+       if ((p=strchr_m(user2,'\\')) || (p=strchr_m(user2,'/')) ||
+           (p=strchr_m(user2,*lp_winbind_separator()))) {
                *p = 0;
                user = p+1;
                workgroup = user2;
@@ -632,7 +633,7 @@ BOOL cli_ulogoff(struct cli_state *cli)
 {
         memset(cli->outbuf,'\0',smb_size);
         set_message(cli->outbuf,2,0,True);
-        CVAL(cli->outbuf,smb_com) = SMBulogoffX;
+        SCVAL(cli->outbuf,smb_com,SMBulogoffX);
         cli_setup_packet(cli);
        SSVAL(cli->outbuf,smb_vwv0,0xFF);
        SSVAL(cli->outbuf,smb_vwv2,0);  /* no additional info */
@@ -690,7 +691,7 @@ BOOL cli_send_tconX(struct cli_state *cli,
        }
 
        set_message(cli->outbuf,4, 0, True);
-       CVAL(cli->outbuf,smb_com) = SMBtconX;
+       SCVAL(cli->outbuf,smb_com,SMBtconX);
        cli_setup_packet(cli);
 
        SSVAL(cli->outbuf,smb_vwv0,0xFF);
@@ -736,7 +737,7 @@ BOOL cli_tdis(struct cli_state *cli)
 {
        memset(cli->outbuf,'\0',smb_size);
        set_message(cli->outbuf,0,0,True);
-       CVAL(cli->outbuf,smb_com) = SMBtdis;
+       SCVAL(cli->outbuf,smb_com,SMBtdis);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
        cli_setup_packet(cli);
        
@@ -769,11 +770,11 @@ void cli_negprot_send(struct cli_state *cli)
                p += clistr_push(cli, p, prots[numprots].name, -1, STR_TERMINATE);
        }
 
-       CVAL(cli->outbuf,smb_com) = SMBnegprot;
+       SCVAL(cli->outbuf,smb_com,SMBnegprot);
        cli_setup_bcc(cli, p);
        cli_setup_packet(cli);
 
-       CVAL(smb_buf(cli->outbuf),0) = 2;
+       SCVAL(smb_buf(cli->outbuf),0,2);
 
        cli_send_smb(cli);
 }
@@ -806,10 +807,10 @@ BOOL cli_negprot(struct cli_state *cli)
                p += clistr_push(cli, p, prots[numprots].name, -1, STR_TERMINATE);
        }
 
-       CVAL(cli->outbuf,smb_com) = SMBnegprot;
+       SCVAL(cli->outbuf,smb_com,SMBnegprot);
        cli_setup_packet(cli);
 
-       CVAL(smb_buf(cli->outbuf),0) = 2;
+       SCVAL(smb_buf(cli->outbuf),0,2);
 
        cli_send_smb(cli);
        if (!cli_receive_smb(cli))
@@ -904,7 +905,7 @@ BOOL cli_session_request(struct cli_state *cli,
 
        /* setup the packet length */
        _smb_setlen(cli->outbuf,len);
-       CVAL(cli->outbuf,0) = 0x81;
+       SCVAL(cli->outbuf,0,0x81);
 
 #ifdef WITH_SSL
 retry:
@@ -1205,7 +1206,13 @@ NTSTATUS cli_full_connection(struct cli_state **output_cli,
        struct nmb_name called;
        struct cli_state *cli;
        struct in_addr ip;
-        
+       
+       if (!output_cli) {
+               DEBUG(0, ("output_cli is NULL!?!"));
+       }
+
+       *output_cli = NULL;
+       
        make_nmb_name(&calling, my_name, 0x0);
        make_nmb_name(&called , dest_host, 0x20);
 
@@ -1216,6 +1223,7 @@ again:
        }
        
        if (cli_set_port(cli, port) != port) {
+               cli_shutdown(cli);
                return NT_STATUS_UNSUCCESSFUL;
        }
 
@@ -1228,6 +1236,7 @@ again:
        {
                DEBUG(1,("cli_establish_connection: failed to connect to %s (%s)\n",
                         nmb_namestr(&called), inet_ntoa(*dest_ip)));
+               cli_shutdown(cli);
                return NT_STATUS_UNSUCCESSFUL;
        }
 
@@ -1250,7 +1259,7 @@ again:
        if (!cli_negprot(cli))
        {
                DEBUG(1,("failed negprot\n"));
-               nt_status = cli_nt_error(cli);
+               nt_status = NT_STATUS_UNSUCCESSFUL;
                cli_shutdown(cli);
                return nt_status;
        }
@@ -1263,6 +1272,7 @@ again:
                DEBUG(1,("failed session setup\n"));
                nt_status = cli_nt_error(cli);
                cli_shutdown(cli);
+               if (NT_STATUS_IS_OK(nt_status)) nt_status = NT_STATUS_UNSUCCESSFUL;
                return nt_status;
        } 
 
@@ -1274,6 +1284,7 @@ again:
                        DEBUG(1,("failed tcon_X\n"));
                        nt_status = cli_nt_error(cli);
                        cli_shutdown(cli);
+                       if (NT_STATUS_IS_OK(nt_status)) nt_status = NT_STATUS_UNSUCCESSFUL;
                        return nt_status;
                }
        }