diff options
Diffstat (limited to 'source/libsmb')
-rw-r--r-- | source/libsmb/cliconnect.c | 8 | ||||
-rw-r--r-- | source/libsmb/clifile.c | 41 | ||||
-rw-r--r-- | source/libsmb/clikrb5.c | 18 | ||||
-rw-r--r-- | source/libsmb/cliquota.c | 4 | ||||
-rw-r--r-- | source/libsmb/clireadwrite.c | 8 |
5 files changed, 68 insertions, 11 deletions
diff --git a/source/libsmb/cliconnect.c b/source/libsmb/cliconnect.c index 559538aac9b..4ff60c1b1ca 100644 --- a/source/libsmb/cliconnect.c +++ b/source/libsmb/cliconnect.c @@ -668,11 +668,16 @@ static NTSTATUS cli_session_setup_ntlmssp(struct cli_state *cli, const char *use DATA_BLOB key = data_blob(ntlmssp_state->session_key.data, ntlmssp_state->session_key.length); DATA_BLOB null_blob = data_blob(NULL, 0); + BOOL res; fstrcpy(cli->server_domain, ntlmssp_state->server_domain); cli_set_session_key(cli, ntlmssp_state->session_key); - if (cli_simple_set_signing(cli, key, null_blob)) { + res = cli_simple_set_signing(cli, key, null_blob); + + data_blob_free(&key); + + if (res) { /* 'resign' the last message, so we get the right sequence numbers for checking the first reply from the server */ @@ -1133,6 +1138,7 @@ BOOL cli_negprot(struct cli_state *cli) cli->use_spnego = False; cli->sec_mode = SVAL(cli->inbuf,smb_vwv1); cli->max_xmit = SVAL(cli->inbuf,smb_vwv2); + cli->max_mux = SVAL(cli->inbuf, smb_vwv3); cli->sesskey = IVAL(cli->inbuf,smb_vwv6); cli->serverzone = SVALS(cli->inbuf,smb_vwv10); cli->serverzone *= 60; diff --git a/source/libsmb/clifile.c b/source/libsmb/clifile.c index 398c7cc4f0a..ff0edc6bb4e 100644 --- a/source/libsmb/clifile.c +++ b/source/libsmb/clifile.c @@ -983,6 +983,47 @@ BOOL cli_getatr(struct cli_state *cli, const char *fname, } /**************************************************************************** + Do a SMBsetattrE call. +****************************************************************************/ + +BOOL cli_setattrE(struct cli_state *cli, int fd, + time_t c_time, time_t a_time, time_t m_time) + +{ + char *p; + + memset(cli->outbuf,'\0',smb_size); + memset(cli->inbuf,'\0',smb_size); + + set_message(cli->outbuf,7,0,True); + + SCVAL(cli->outbuf,smb_com,SMBsetattrE); + SSVAL(cli->outbuf,smb_tid,cli->cnum); + cli_setup_packet(cli); + + SSVAL(cli->outbuf,smb_vwv0, fd); + put_dos_date3(cli->outbuf,smb_vwv1, c_time); + put_dos_date3(cli->outbuf,smb_vwv3, a_time); + put_dos_date3(cli->outbuf,smb_vwv5, m_time); + + p = smb_buf(cli->outbuf); + *p++ = 4; + + cli_setup_bcc(cli, p); + + cli_send_smb(cli); + if (!cli_receive_smb(cli)) { + return False; + } + + if (cli_is_error(cli)) { + return False; + } + + return True; +} + +/**************************************************************************** Do a SMBsetatr call. ****************************************************************************/ diff --git a/source/libsmb/clikrb5.c b/source/libsmb/clikrb5.c index 5fcde4654ad..f7f84f1e297 100644 --- a/source/libsmb/clikrb5.c +++ b/source/libsmb/clikrb5.c @@ -190,6 +190,7 @@ krb5_error_code rc; int num_kdcs, i; struct sockaddr *sa; + struct addrinfo *ai; *addr_pp = NULL; *naddrs = 0; @@ -219,10 +220,19 @@ return -1; } + *addr_pp = malloc(sizeof(struct sockaddr) * num_kdcs); memset(*addr_pp, '\0', sizeof(struct sockaddr) * num_kdcs ); for (i = 0; i < num_kdcs && (rc = krb5_krbhst_next(ctx, hnd, &hinfo) == 0); i++) { - if (hinfo->ai->ai_family == AF_INET) + +#if defined(HAVE_KRB5_KRBHST_GET_ADDRINFO) + rc = krb5_krbhst_get_addrinfo(ctx, hinfo, &ai); + if (rc) { + DEBUG(0,("krb5_krbhst_get_addrinfo failed: %s\n", error_message(rc))); + continue; + } +#endif + if (hinfo->ai && hinfo->ai->ai_family == AF_INET) memcpy(&sa[i], hinfo->ai->ai_addr, sizeof(struct sockaddr)); } @@ -420,14 +430,8 @@ int cli_krb5_get_ticket(const char *principal, time_t time_offset, failed: if ( context ) { -/* Removed by jra. They really need to fix their kerberos so we don't leak memory. - JERRY -- disabled since it causes heimdal 0.6.1rc3 to die - SuSE 9.1 Pro -*/ if (ccdef) -#if 0 /* redisabled by gd :) at least until any official heimdal version has it fixed. */ krb5_cc_close(context, ccdef); -#endif if (auth_context) krb5_auth_con_free(context, auth_context); krb5_free_context(context); diff --git a/source/libsmb/cliquota.c b/source/libsmb/cliquota.c index ed808aa1f5c..af8b4422b78 100644 --- a/source/libsmb/cliquota.c +++ b/source/libsmb/cliquota.c @@ -22,13 +22,13 @@ BOOL cli_get_quota_handle(struct cli_state *cli, int *quota_fnum) { - *quota_fnum = cli_nt_create_full(cli, FAKE_FILE_NAME_QUOTA, + *quota_fnum = cli_nt_create_full(cli, FAKE_FILE_NAME_QUOTA_WIN32, 0x00000016, DESIRED_ACCESS_PIPE, 0x00000000, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0x00000000, 0x03); if (*quota_fnum == (-1)) { - return False; + return False; } return True; diff --git a/source/libsmb/clireadwrite.c b/source/libsmb/clireadwrite.c index 8eac7d07d8b..3f14e530943 100644 --- a/source/libsmb/clireadwrite.c +++ b/source/libsmb/clireadwrite.c @@ -325,10 +325,16 @@ ssize_t cli_write(struct cli_state *cli, int bwritten = 0; int issued = 0; int received = 0; - int mpx = MAX(cli->max_mux-1, 1); + int mpx = 1; int block = cli->max_xmit - (smb_size+32); int blocks = (size + (block-1)) / block; + if(cli->max_mux > 1) { + mpx = cli->max_mux-1; + } else { + mpx = 1; + } + while (received < blocks) { while ((issued - received < mpx) && (issued < blocks)) { |