1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

Convert read_smb_length_return_keepalive to return NTSTATUS

(This used to be commit 73a79a957a)
This commit is contained in:
Volker Lendecke 2008-01-25 21:24:48 +01:00
parent 3e5b98555b
commit 0afbfa4284
2 changed files with 61 additions and 47 deletions

View File

@ -1141,36 +1141,21 @@ bool send_keepalive(int client)
Timeout is in milliseconds. Timeout is in milliseconds.
****************************************************************************/ ****************************************************************************/
ssize_t read_smb_length_return_keepalive(int fd, NTSTATUS read_smb_length_return_keepalive(int fd, char *inbuf,
char *inbuf, unsigned int timeout,
unsigned int timeout, size_t *len)
enum smb_read_errors *pre)
{ {
size_t len=0;
int msg_type; int msg_type;
NTSTATUS status; NTSTATUS status;
set_smb_read_error(pre, SMB_READ_OK);
status = read_socket_with_timeout_ntstatus(fd, inbuf, 4, 4, timeout, status = read_socket_with_timeout_ntstatus(fd, inbuf, 4, 4, timeout,
NULL); NULL);
if (!NT_STATUS_IS_OK(status)) { if (!NT_STATUS_IS_OK(status)) {
if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) { return status;
set_smb_read_error(pre, SMB_READ_EOF);
return -1;
}
if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
set_smb_read_error(pre, SMB_READ_TIMEOUT);
return -1;
}
set_smb_read_error(pre, SMB_READ_ERROR);
return -1;
} }
len = smb_len(inbuf); *len = smb_len(inbuf);
msg_type = CVAL(inbuf,0); msg_type = CVAL(inbuf,0);
if (msg_type == SMBkeepalive) { if (msg_type == SMBkeepalive) {
@ -1179,7 +1164,7 @@ ssize_t read_smb_length_return_keepalive(int fd,
DEBUG(10,("got smb length of %lu\n",(unsigned long)len)); DEBUG(10,("got smb length of %lu\n",(unsigned long)len));
return len; return NT_STATUS_OK;
} }
/**************************************************************************** /****************************************************************************
@ -1191,15 +1176,31 @@ ssize_t read_smb_length_return_keepalive(int fd,
ssize_t read_smb_length(int fd, char *inbuf, unsigned int timeout, enum smb_read_errors *pre) ssize_t read_smb_length(int fd, char *inbuf, unsigned int timeout, enum smb_read_errors *pre)
{ {
ssize_t len; size_t len;
uint8_t msgtype = SMBkeepalive; uint8_t msgtype = SMBkeepalive;
set_smb_read_error(pre, SMB_READ_OK);
while (msgtype == SMBkeepalive) { while (msgtype == SMBkeepalive) {
len = read_smb_length_return_keepalive(fd, inbuf, timeout, NTSTATUS status;
pre);
if (len < 0) { status = read_smb_length_return_keepalive(fd, inbuf, timeout,
return len; &len);
if (!NT_STATUS_IS_OK(status)) {
if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
set_smb_read_error(pre, SMB_READ_EOF);
return -1;
}
if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
set_smb_read_error(pre, SMB_READ_TIMEOUT);
return -1;
}
set_smb_read_error(pre, SMB_READ_ERROR);
return -1;
} }
msgtype = CVAL(inbuf, 0); msgtype = CVAL(inbuf, 0);
} }
@ -1225,21 +1226,28 @@ ssize_t receive_smb_raw(int fd,
size_t maxlen, size_t maxlen,
enum smb_read_errors *pre) enum smb_read_errors *pre)
{ {
ssize_t len,ret; size_t len;
ssize_t ret;
NTSTATUS status;
set_smb_read_error(pre,SMB_READ_OK); set_smb_read_error(pre,SMB_READ_OK);
len = read_smb_length_return_keepalive(fd,buffer,timeout,pre); status = read_smb_length_return_keepalive(fd,buffer,timeout,&len);
if (len < 0) {
DEBUG(10,("receive_smb_raw: length < 0!\n"));
/* if (!NT_STATUS_IS_OK(status)) {
* Correct fix. smb_read_error may have already been DEBUG(10, ("receive_smb_raw: %s!\n", nt_errstr(status)));
* set. Only set it here if not already set. Global
* variables still suck :-). JRA.
*/
cond_set_smb_read_error(pre,SMB_READ_ERROR); if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
set_smb_read_error(pre, SMB_READ_EOF);
return -1;
}
if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
set_smb_read_error(pre, SMB_READ_TIMEOUT);
return -1;
}
set_smb_read_error(pre, SMB_READ_ERROR);
return -1; return -1;
} }

View File

@ -300,24 +300,30 @@ static ssize_t receive_smb_raw_talloc(TALLOC_CTX *mem_ctx,
size_t *p_unread) size_t *p_unread)
{ {
char lenbuf[4]; char lenbuf[4];
ssize_t len,ret; size_t len;
ssize_t ret;
int min_recv_size = lp_min_receive_file_size(); int min_recv_size = lp_min_receive_file_size();
NTSTATUS status;
set_smb_read_error(get_srv_read_error(),SMB_READ_OK); set_smb_read_error(get_srv_read_error(),SMB_READ_OK);
*p_unread = 0; *p_unread = 0;
len = read_smb_length_return_keepalive(fd, lenbuf, status = read_smb_length_return_keepalive(fd, lenbuf, timeout, &len);
timeout, get_srv_read_error()); if (!NT_STATUS_IS_OK(status)) {
if (len < 0) { DEBUG(10, ("receive_smb_raw: %s\n", nt_errstr(status)));
DEBUG(10,("receive_smb_raw: length < 0!\n"));
/* if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
* Correct fix. smb_read_error may have already been set_smb_read_error(get_srv_read_error(), SMB_READ_EOF);
* set. Only set it here if not already set. Global return -1;
* variables still suck :-). JRA. }
*/
cond_set_smb_read_error(get_srv_read_error(),SMB_READ_ERROR); if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
set_smb_read_error(get_srv_read_error(),
SMB_READ_TIMEOUT);
return -1;
}
set_smb_read_error(get_srv_read_error(), SMB_READ_ERROR);
return -1; return -1;
} }