void send_trans_reply(connection_struct *conn, struct smb_request *req, char *rparam, int rparam_len, char *rdata, int rdata_len, bool buffer_too_large) { int this_ldata,this_lparam; int tot_data_sent = 0; int tot_param_sent = 0; int align; int ldata = rdata ? rdata_len : 0; int lparam = rparam ? rparam_len : 0; struct smbd_server_connection *sconn = req->sconn; int max_send = sconn->smb1.sessions.max_send; if (buffer_too_large) DEBUG(5,("send_trans_reply: buffer %d too large\n", ldata )); this_lparam = MIN(lparam,max_send - 500); /* hack */ this_ldata = MIN(ldata,max_send - (500+this_lparam)); align = ((this_lparam)%4); reply_outbuf(req, 10, 1+align+this_ldata+this_lparam); /* * We might have SMBtranss in req which was transferred to the outbuf, * fix that. */ SCVAL(req->outbuf, smb_com, SMBtrans); copy_trans_params_and_data((char *)req->outbuf, align, rparam, tot_param_sent, this_lparam, rdata, tot_data_sent, this_ldata); SSVAL(req->outbuf,smb_vwv0,lparam); SSVAL(req->outbuf,smb_vwv1,ldata); SSVAL(req->outbuf,smb_vwv3,this_lparam); SSVAL(req->outbuf,smb_vwv4, smb_offset(smb_buf(req->outbuf)+1, req->outbuf)); SSVAL(req->outbuf,smb_vwv5,0); SSVAL(req->outbuf,smb_vwv6,this_ldata); SSVAL(req->outbuf,smb_vwv7, smb_offset(smb_buf(req->outbuf)+1+this_lparam+align, req->outbuf)); SSVAL(req->outbuf,smb_vwv8,0); SSVAL(req->outbuf,smb_vwv9,0); if (buffer_too_large) { error_packet_set((char *)req->outbuf, ERRDOS, ERRmoredata, STATUS_BUFFER_OVERFLOW, __LINE__, __FILE__); } show_msg((char *)req->outbuf); if (!srv_send_smb(sconn, (char *)req->outbuf, true, req->seqnum+1, IS_CONN_ENCRYPTED(conn), &req->pcd)) { exit_server_cleanly("send_trans_reply: srv_send_smb failed."); } TALLOC_FREE(req->outbuf); tot_data_sent = this_ldata; tot_param_sent = this_lparam; while (tot_data_sent < ldata || tot_param_sent < lparam) { this_lparam = MIN(lparam-tot_param_sent, max_send - 500); /* hack */ this_ldata = MIN(ldata -tot_data_sent, max_send - (500+this_lparam)); if(this_lparam < 0) this_lparam = 0; if(this_ldata < 0) this_ldata = 0; align = (this_lparam%4); reply_outbuf(req, 10, 1+align+this_ldata+this_lparam); /* * We might have SMBtranss in req which was transferred to the * outbuf, fix that. */ SCVAL(req->outbuf, smb_com, SMBtrans); copy_trans_params_and_data((char *)req->outbuf, align, rparam, tot_param_sent, this_lparam, rdata, tot_data_sent, this_ldata); SSVAL(req->outbuf,smb_vwv0,lparam); SSVAL(req->outbuf,smb_vwv1,ldata); SSVAL(req->outbuf,smb_vwv3,this_lparam); SSVAL(req->outbuf,smb_vwv4, smb_offset(smb_buf(req->outbuf)+1,req->outbuf)); SSVAL(req->outbuf,smb_vwv5,tot_param_sent); SSVAL(req->outbuf,smb_vwv6,this_ldata); SSVAL(req->outbuf,smb_vwv7, smb_offset(smb_buf(req->outbuf)+1+this_lparam+align, req->outbuf)); SSVAL(req->outbuf,smb_vwv8,tot_data_sent); SSVAL(req->outbuf,smb_vwv9,0); if (buffer_too_large) { error_packet_set((char *)req->outbuf, ERRDOS, ERRmoredata, STATUS_BUFFER_OVERFLOW, __LINE__, __FILE__); } show_msg((char *)req->outbuf); if (!srv_send_smb(sconn, (char *)req->outbuf, true, req->seqnum+1, IS_CONN_ENCRYPTED(conn), &req->pcd)) exit_server_cleanly("send_trans_reply: srv_send_smb " "failed."); tot_data_sent += this_ldata; tot_param_sent += this_lparam; TALLOC_FREE(req->outbuf); } }
int error_packet(char *outbuf, uint8 eclass, uint32 ecode, NTSTATUS ntstatus, int line, const char *file) { int outsize = set_message(outbuf,0,0,True); error_packet_set(outbuf, eclass, ecode, ntstatus, line, file); return outsize; }