BOOL receive_smb(int fd,char *buffer, unsigned int timeout) { ssize_t len,ret; smb_read_error = 0; memset(buffer,'\0',smb_size + 100); len = read_smb_length_return_keepalive(fd,buffer,timeout); if (len < 0) { DEBUG(10,("receive_smb: length < 0!\n")); return(False); } if (len > BUFFER_SIZE) { DEBUG(0,("Invalid packet length! (%d bytes).\n",len)); if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) { exit(1); } } if(len > 0) { ret = read_socket_data(fd,buffer+4,len); if (ret != len) { smb_read_error = READ_ERROR; return False; } } return(True); }
BOOL receive_smb_raw(int fd,char *buffer, unsigned int timeout) { ssize_t len,ret; smb_read_error = 0; memset(buffer,'\0',smb_size + 100); len = read_smb_length_return_keepalive(fd,buffer,timeout); if (len < 0) { DEBUG(10,("receive_smb_raw: length < 0!\n")); /* * Correct fix. smb_read_error may have already been * set. Only set it here if not already set. Global * variables still suck :-). JRA. */ if (smb_read_error == 0) smb_read_error = READ_ERROR; return False; } /* * A WRITEX with CAP_LARGE_WRITEX can be 64k worth of data plus 65 bytes * of header. Don't print the error if this fits.... JRA. */ if (len > (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE)) { DEBUG(0,("Invalid packet length! (%lu bytes).\n",(unsigned long)len)); if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) { /* * Correct fix. smb_read_error may have already been * set. Only set it here if not already set. Global * variables still suck :-). JRA. */ if (smb_read_error == 0) smb_read_error = READ_ERROR; return False; } } if(len > 0) { ret = read_socket_data(fd,buffer+4,len); if (ret != len) { if (smb_read_error == 0) smb_read_error = READ_ERROR; return False; } /* not all of samba3 properly checks for packet-termination of strings. This ensures that we don't run off into empty space. */ SSVAL(buffer+4,len, 0); } return True; }
NTSTATUS receive_smb_raw(int fd, char *buffer, size_t buflen, unsigned int timeout, size_t maxlen, size_t *p_len) { size_t len; NTSTATUS status; status = read_smb_length_return_keepalive(fd,buffer,timeout,&len); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("read_fd_with_timeout failed, read " "error = %s.\n", nt_errstr(status))); return status; } if (len > buflen) { DEBUG(0,("Invalid packet length! (%lu bytes).\n", (unsigned long)len)); return NT_STATUS_INVALID_PARAMETER; } if(len > 0) { if (maxlen) { len = MIN(len,maxlen); } status = read_fd_with_timeout( fd, buffer+4, len, len, timeout, &len); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("read_fd_with_timeout failed, read error = " "%s.\n", nt_errstr(status))); return status; } /* not all of samba3 properly checks for packet-termination * of strings. This ensures that we don't run off into * empty space. */ SSVAL(buffer+4,len, 0); } *p_len = len; return NT_STATUS_OK; }
ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout) { ssize_t len; for(;;) { len = read_smb_length_return_keepalive(fd, inbuf, timeout); if(len < 0) return len; /* Ignore session keepalives. */ if(CVAL(inbuf,0) != 0x85) break; } DEBUG(10,("read_smb_length: got smb length of %d\n",len)); return len; }