1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00

Reformatting fixes to bring in line with the rest of the source.

Jeremy.
This commit is contained in:
Jeremy Allison 0001-01-01 00:00:00 +00:00
parent d0d85dd49c
commit 3c11d93623

View File

@ -53,9 +53,9 @@ extern int max_send;
****************************************************************************/
typedef struct {
ubi_slNode msg_next;
char *msg_buf;
int msg_len;
ubi_slNode msg_next;
char *msg_buf;
int msg_len;
} pending_message_list;
static ubi_slList smb_oplock_queue = { NULL, (ubi_slNodePtr)&smb_oplock_queue, 0};
@ -67,29 +67,27 @@ static ubi_slList smb_oplock_queue = { NULL, (ubi_slNodePtr)&smb_oplock_queue, 0
static BOOL push_message(ubi_slList *list_head, char *buf, int msg_len)
{
pending_message_list *msg = (pending_message_list *)
pending_message_list *msg = (pending_message_list *)
malloc(sizeof(pending_message_list));
if(msg == NULL)
{
DEBUG(0,("push_message: malloc fail (1)\n"));
return False;
}
if(msg == NULL) {
DEBUG(0,("push_message: malloc fail (1)\n"));
return False;
}
msg->msg_buf = (char *)malloc(msg_len);
if(msg->msg_buf == NULL)
{
DEBUG(0,("push_message: malloc fail (2)\n"));
SAFE_FREE(msg);
return False;
}
msg->msg_buf = (char *)malloc(msg_len);
if(msg->msg_buf == NULL) {
DEBUG(0,("push_message: malloc fail (2)\n"));
SAFE_FREE(msg);
return False;
}
memcpy(msg->msg_buf, buf, msg_len);
msg->msg_len = msg_len;
memcpy(msg->msg_buf, buf, msg_len);
msg->msg_len = msg_len;
ubi_slAddTail( list_head, msg);
ubi_slAddTail( list_head, msg);
return True;
return True;
}
/****************************************************************************
@ -295,28 +293,29 @@ BOOL receive_next_smb(char *inbuf, int bufsize, int timeout)
void respond_to_all_remaining_local_messages(void)
{
char buffer[1024];
char buffer[1024];
/*
* Assert we have no exclusive open oplocks.
*/
/*
* Assert we have no exclusive open oplocks.
*/
if(get_number_of_exclusive_open_oplocks()) {
DEBUG(0,("respond_to_all_remaining_local_messages: PANIC : we have %d exclusive oplocks.\n",
get_number_of_exclusive_open_oplocks() ));
return;
}
if(get_number_of_exclusive_open_oplocks()) {
DEBUG(0,("respond_to_all_remaining_local_messages: PANIC : we have %d exclusive oplocks.\n",
get_number_of_exclusive_open_oplocks() ));
return;
}
/*
* Keep doing receive_local_message with a 1 ms timeout until
* we have no more messages.
*/
while(receive_local_message(buffer, sizeof(buffer), 1)) {
/* Deal with oplock break requests from other smbd's. */
process_local_message(buffer, sizeof(buffer));
}
/*
* Keep doing receive_local_message with a 1 ms timeout until
* we have no more messages.
*/
return;
while(receive_local_message(buffer, sizeof(buffer), 1)) {
/* Deal with oplock break requests from other smbd's. */
process_local_message(buffer, sizeof(buffer));
}
return;
}
@ -339,13 +338,11 @@ force write permissions on print services.
functions. Any message that has a NULL function is unimplemented -
please feel free to contribute implementations!
*/
static const struct smb_message_struct
{
const char *name;
int (*fn)(connection_struct *conn, char *, char *, int, int);
int flags;
}
smb_messages[256] = {
static const struct smb_message_struct {
const char *name;
int (*fn)(connection_struct *conn, char *, char *, int, int);
int flags;
} smb_messages[256] = {
/* 0x00 */ { "SMBmkdir",reply_mkdir,AS_USER | NEED_WRITE},
/* 0x01 */ { "SMBrmdir",reply_rmdir,AS_USER | NEED_WRITE},
@ -849,67 +846,62 @@ set. Ignoring max smbd restriction.\n"));
}
/****************************************************************************
process an smb from the client - split out from the smbd_process() code so
it can be used by the oplock break code.
Process an smb from the client - split out from the smbd_process() code so
it can be used by the oplock break code.
****************************************************************************/
void process_smb(char *inbuf, char *outbuf)
{
static int trans_num;
int msg_type = CVAL(inbuf,0);
int32 len = smb_len(inbuf);
int nread = len + 4;
static int trans_num;
int msg_type = CVAL(inbuf,0);
int32 len = smb_len(inbuf);
int nread = len + 4;
DO_PROFILE_INC(smb_count);
DO_PROFILE_INC(smb_count);
if (trans_num == 0) {
/* on the first packet, check the global hosts allow/ hosts
deny parameters before doing any parsing of the packet
passed to us by the client. This prevents attacks on our
parsing code from hosts not in the hosts allow list */
if (smbd_process_limit() ||
!check_access(smbd_server_fd(), lp_hostsallow(-1), lp_hostsdeny(-1))) {
/* send a negative session response "not listening on calling
name" */
static unsigned char buf[5] = {0x83, 0, 0, 1, 0x81};
DEBUG( 1, ( "Connection denied from %s\n",
client_addr() ) );
(void)send_smb(smbd_server_fd(),(char *)buf);
exit_server("connection denied");
}
}
if (trans_num == 0) {
/* on the first packet, check the global hosts allow/ hosts
deny parameters before doing any parsing of the packet
passed to us by the client. This prevents attacks on our
parsing code from hosts not in the hosts allow list */
if (smbd_process_limit() ||
!check_access(smbd_server_fd(), lp_hostsallow(-1), lp_hostsdeny(-1))) {
/* send a negative session response "not listening on calling name" */
static unsigned char buf[5] = {0x83, 0, 0, 1, 0x81};
DEBUG( 1, ( "Connection denied from %s\n", client_addr() ) );
(void)send_smb(smbd_server_fd(),(char *)buf);
exit_server("connection denied");
}
}
DEBUG( 6, ( "got message type 0x%x of len 0x%x\n", msg_type, len ) );
DEBUG( 3, ( "Transaction %d of length %d\n", trans_num, nread ) );
DEBUG( 6, ( "got message type 0x%x of len 0x%x\n", msg_type, len ) );
DEBUG( 3, ( "Transaction %d of length %d\n", trans_num, nread ) );
if (msg_type == 0)
show_msg(inbuf);
else if(msg_type == SMBkeepalive)
return; /* Keepalive packet. */
if (msg_type == 0)
show_msg(inbuf);
else if(msg_type == SMBkeepalive)
return; /* Keepalive packet. */
nread = construct_reply(inbuf,outbuf,nread,max_send);
nread = construct_reply(inbuf,outbuf,nread,max_send);
if(nread > 0)
{
if (CVAL(outbuf,0) == 0)
show_msg(outbuf);
if(nread > 0) {
if (CVAL(outbuf,0) == 0)
show_msg(outbuf);
if (nread != smb_len(outbuf) + 4)
{
DEBUG(0,("ERROR: Invalid message response size! %d %d\n",
nread, smb_len(outbuf)));
}
else
if (!send_smb(smbd_server_fd(),outbuf))
exit_server("process_smb: send_smb failed.");
}
trans_num++;
if (nread != smb_len(outbuf) + 4) {
DEBUG(0,("ERROR: Invalid message response size! %d %d\n",
nread, smb_len(outbuf)));
} else if (!send_smb(smbd_server_fd(),outbuf)) {
exit_server("process_smb: send_smb failed.");
}
}
trans_num++;
}
/****************************************************************************
return a string containing the function name of a SMB command
Return a string containing the function name of a SMB command.
****************************************************************************/
const char *smb_fn_name(int type)
{
const char *unknown_name = "SMBunknown";
@ -949,92 +941,94 @@ void construct_reply_common(char *inbuf,char *outbuf)
}
/****************************************************************************
construct a chained reply and add it to the already made reply
**************************************************************************/
Construct a chained reply and add it to the already made reply
****************************************************************************/
int chain_reply(char *inbuf,char *outbuf,int size,int bufsize)
{
static char *orig_inbuf;
static char *orig_outbuf;
int smb_com1, smb_com2 = CVAL(inbuf,smb_vwv0);
unsigned smb_off2 = SVAL(inbuf,smb_vwv1);
char *inbuf2, *outbuf2;
int outsize2;
char inbuf_saved[smb_wct];
char outbuf_saved[smb_wct];
int wct = CVAL(outbuf,smb_wct);
int outsize = smb_size + 2*wct + SVAL(outbuf,smb_vwv0+2*wct);
static char *orig_inbuf;
static char *orig_outbuf;
int smb_com1, smb_com2 = CVAL(inbuf,smb_vwv0);
unsigned smb_off2 = SVAL(inbuf,smb_vwv1);
char *inbuf2, *outbuf2;
int outsize2;
char inbuf_saved[smb_wct];
char outbuf_saved[smb_wct];
int wct = CVAL(outbuf,smb_wct);
int outsize = smb_size + 2*wct + SVAL(outbuf,smb_vwv0+2*wct);
/* maybe its not chained */
if (smb_com2 == 0xFF) {
SCVAL(outbuf,smb_vwv0,0xFF);
return outsize;
}
/* maybe its not chained */
if (smb_com2 == 0xFF) {
SCVAL(outbuf,smb_vwv0,0xFF);
return outsize;
}
if (chain_size == 0) {
/* this is the first part of the chain */
orig_inbuf = inbuf;
orig_outbuf = outbuf;
}
if (chain_size == 0) {
/* this is the first part of the chain */
orig_inbuf = inbuf;
orig_outbuf = outbuf;
}
/*
* The original Win95 redirector dies on a reply to
* a lockingX and read chain unless the chain reply is
* 4 byte aligned. JRA.
*/
/*
* The original Win95 redirector dies on a reply to
* a lockingX and read chain unless the chain reply is
* 4 byte aligned. JRA.
*/
outsize = (outsize + 3) & ~3;
outsize = (outsize + 3) & ~3;
/* we need to tell the client where the next part of the reply will be */
SSVAL(outbuf,smb_vwv1,smb_offset(outbuf+outsize,outbuf));
SCVAL(outbuf,smb_vwv0,smb_com2);
/* we need to tell the client where the next part of the reply will be */
SSVAL(outbuf,smb_vwv1,smb_offset(outbuf+outsize,outbuf));
SCVAL(outbuf,smb_vwv0,smb_com2);
/* remember how much the caller added to the chain, only counting stuff
after the parameter words */
chain_size += outsize - smb_wct;
/* remember how much the caller added to the chain, only counting stuff
after the parameter words */
chain_size += outsize - smb_wct;
/* work out pointers into the original packets. The
headers on these need to be filled in */
inbuf2 = orig_inbuf + smb_off2 + 4 - smb_wct;
outbuf2 = orig_outbuf + SVAL(outbuf,smb_vwv1) + 4 - smb_wct;
/* work out pointers into the original packets. The
headers on these need to be filled in */
inbuf2 = orig_inbuf + smb_off2 + 4 - smb_wct;
outbuf2 = orig_outbuf + SVAL(outbuf,smb_vwv1) + 4 - smb_wct;
/* remember the original command type */
smb_com1 = CVAL(orig_inbuf,smb_com);
/* remember the original command type */
smb_com1 = CVAL(orig_inbuf,smb_com);
/* save the data which will be overwritten by the new headers */
memcpy(inbuf_saved,inbuf2,smb_wct);
memcpy(outbuf_saved,outbuf2,smb_wct);
/* save the data which will be overwritten by the new headers */
memcpy(inbuf_saved,inbuf2,smb_wct);
memcpy(outbuf_saved,outbuf2,smb_wct);
/* give the new packet the same header as the last part of the SMB */
memmove(inbuf2,inbuf,smb_wct);
/* give the new packet the same header as the last part of the SMB */
memmove(inbuf2,inbuf,smb_wct);
/* create the in buffer */
SCVAL(inbuf2,smb_com,smb_com2);
/* create the in buffer */
SCVAL(inbuf2,smb_com,smb_com2);
/* create the out buffer */
construct_reply_common(inbuf2, outbuf2);
/* create the out buffer */
construct_reply_common(inbuf2, outbuf2);
DEBUG(3,("Chained message\n"));
show_msg(inbuf2);
DEBUG(3,("Chained message\n"));
show_msg(inbuf2);
/* process the request */
outsize2 = switch_message(smb_com2,inbuf2,outbuf2,size-chain_size,
bufsize-chain_size);
/* process the request */
outsize2 = switch_message(smb_com2,inbuf2,outbuf2,size-chain_size,
bufsize-chain_size);
/* copy the new reply and request headers over the old ones, but
preserve the smb_com field */
memmove(orig_outbuf,outbuf2,smb_wct);
SCVAL(orig_outbuf,smb_com,smb_com1);
/* copy the new reply and request headers over the old ones, but
preserve the smb_com field */
memmove(orig_outbuf,outbuf2,smb_wct);
SCVAL(orig_outbuf,smb_com,smb_com1);
/* restore the saved data, being careful not to overwrite any
data from the reply header */
memcpy(inbuf2,inbuf_saved,smb_wct);
{
int ofs = smb_wct - PTR_DIFF(outbuf2,orig_outbuf);
if (ofs < 0) ofs = 0;
memmove(outbuf2+ofs,outbuf_saved+ofs,smb_wct-ofs);
}
/* restore the saved data, being careful not to overwrite any
data from the reply header */
memcpy(inbuf2,inbuf_saved,smb_wct);
return outsize2;
{
int ofs = smb_wct - PTR_DIFF(outbuf2,orig_outbuf);
if (ofs < 0) ofs = 0;
memmove(outbuf2+ofs,outbuf_saved+ofs,smb_wct-ofs);
}
return outsize2;
}
/****************************************************************************
@ -1065,17 +1059,16 @@ static int setup_select_timeout(void)
void check_reload(int t)
{
static time_t last_smb_conf_reload_time = 0;
static time_t last_smb_conf_reload_time = 0;
if(last_smb_conf_reload_time == 0)
last_smb_conf_reload_time = t;
if(last_smb_conf_reload_time == 0)
last_smb_conf_reload_time = t;
if (reload_after_sighup || (t >= last_smb_conf_reload_time+SMBD_RELOAD_CHECK))
{
reload_services(True);
reload_after_sighup = False;
last_smb_conf_reload_time = t;
}
if (reload_after_sighup || (t >= last_smb_conf_reload_time+SMBD_RELOAD_CHECK)) {
reload_services(True);
reload_after_sighup = False;
last_smb_conf_reload_time = t;
}
}
/****************************************************************************
@ -1084,165 +1077,159 @@ void check_reload(int t)
static BOOL timeout_processing(int deadtime, int *select_timeout, time_t *last_timeout_processing_time)
{
static time_t last_keepalive_sent_time = 0;
static time_t last_idle_closed_check = 0;
time_t t;
BOOL allidle = True;
extern int keepalive;
static time_t last_keepalive_sent_time = 0;
static time_t last_idle_closed_check = 0;
time_t t;
BOOL allidle = True;
extern int keepalive;
if (smb_read_error == READ_EOF)
{
DEBUG(3,("end of file from client\n"));
return False;
}
if (smb_read_error == READ_EOF) {
DEBUG(3,("end of file from client\n"));
return False;
}
if (smb_read_error == READ_ERROR)
{
DEBUG(3,("receive_smb error (%s) exiting\n",
strerror(errno)));
return False;
}
if (smb_read_error == READ_ERROR) {
DEBUG(3,("receive_smb error (%s) exiting\n",
strerror(errno)));
return False;
}
*last_timeout_processing_time = t = time(NULL);
*last_timeout_processing_time = t = time(NULL);
if(last_keepalive_sent_time == 0)
last_keepalive_sent_time = t;
if(last_keepalive_sent_time == 0)
last_keepalive_sent_time = t;
if(last_idle_closed_check == 0)
last_idle_closed_check = t;
if(last_idle_closed_check == 0)
last_idle_closed_check = t;
/* become root again if waiting */
change_to_root_user();
/* become root again if waiting */
change_to_root_user();
/* run all registered idle events */
smb_run_idle_events(t);
/* run all registered idle events */
smb_run_idle_events(t);
/* check if we need to reload services */
check_reload(t);
/* check if we need to reload services */
check_reload(t);
/* automatic timeout if all connections are closed */
if (conn_num_open()==0 && (t - last_idle_closed_check) >= IDLE_CLOSED_TIMEOUT)
{
DEBUG( 2, ( "Closing idle connection\n" ) );
return False;
}
else
last_idle_closed_check = t;
/* automatic timeout if all connections are closed */
if (conn_num_open()==0 && (t - last_idle_closed_check) >= IDLE_CLOSED_TIMEOUT) {
DEBUG( 2, ( "Closing idle connection\n" ) );
return False;
} else {
last_idle_closed_check = t;
}
if (keepalive && (t - last_keepalive_sent_time)>keepalive)
{
extern struct auth_context *negprot_global_auth_context;
if (!send_keepalive(smbd_server_fd())) {
DEBUG( 2, ( "Keepalive failed - exiting.\n" ) );
return False;
}
/* send a keepalive for a password server or the like.
This is attached to the auth_info created in the
negprot */
if (negprot_global_auth_context
&& negprot_global_auth_context->challenge_set_method
&& negprot_global_auth_context->challenge_set_method->send_keepalive) {
negprot_global_auth_context->challenge_set_method->send_keepalive
(&negprot_global_auth_context->challenge_set_method->private_data);
}
if (keepalive && (t - last_keepalive_sent_time)>keepalive) {
extern struct auth_context *negprot_global_auth_context;
if (!send_keepalive(smbd_server_fd())) {
DEBUG( 2, ( "Keepalive failed - exiting.\n" ) );
return False;
}
last_keepalive_sent_time = t;
}
/* send a keepalive for a password server or the like.
This is attached to the auth_info created in the
negprot */
if (negprot_global_auth_context && negprot_global_auth_context->challenge_set_method
&& negprot_global_auth_context->challenge_set_method->send_keepalive) {
/* check for connection timeouts */
allidle = conn_idle_all(t, deadtime);
negprot_global_auth_context->challenge_set_method->send_keepalive
(&negprot_global_auth_context->challenge_set_method->private_data);
}
if (allidle && conn_num_open()>0) {
DEBUG(2,("Closing idle connection 2.\n"));
return False;
}
last_keepalive_sent_time = t;
}
if(global_machine_password_needs_changing &&
/* for ADS we need to do a regular ADS password change, not a domain
password change */
lp_security() == SEC_DOMAIN)
{
unsigned char trust_passwd_hash[16];
time_t lct;
/* check for connection timeouts */
allidle = conn_idle_all(t, deadtime);
/*
* We're in domain level security, and the code that
* read the machine password flagged that the machine
* password needs changing.
*/
if (allidle && conn_num_open()>0) {
DEBUG(2,("Closing idle connection 2.\n"));
return False;
}
/*
* First, open the machine password file with an exclusive lock.
*/
if(global_machine_password_needs_changing &&
/* for ADS we need to do a regular ADS password change, not a domain
password change */
lp_security() == SEC_DOMAIN) {
if (secrets_lock_trust_account_password(lp_workgroup(), True) == False) {
DEBUG(0,("process: unable to lock the machine account password for \
unsigned char trust_passwd_hash[16];
time_t lct;
/*
* We're in domain level security, and the code that
* read the machine password flagged that the machine
* password needs changing.
*/
/*
* First, open the machine password file with an exclusive lock.
*/
if (secrets_lock_trust_account_password(lp_workgroup(), True) == False) {
DEBUG(0,("process: unable to lock the machine account password for \
machine %s in domain %s.\n", global_myname(), lp_workgroup() ));
return True;
}
return True;
}
if(!secrets_fetch_trust_account_password(lp_workgroup(),
trust_passwd_hash,
&lct, NULL)) {
DEBUG(0,("process: unable to read the machine account password for \
if(!secrets_fetch_trust_account_password(lp_workgroup(), trust_passwd_hash, &lct, NULL)) {
DEBUG(0,("process: unable to read the machine account password for \
machine %s in domain %s.\n", global_myname(), lp_workgroup()));
secrets_lock_trust_account_password(lp_workgroup(), False);
return True;
}
secrets_lock_trust_account_password(lp_workgroup(), False);
return True;
}
/*
* Make sure someone else hasn't already done this.
*/
/*
* Make sure someone else hasn't already done this.
*/
if(t < lct + lp_machine_password_timeout()) {
global_machine_password_needs_changing = False;
secrets_lock_trust_account_password(lp_workgroup(), False);
return True;
}
if(t < lct + lp_machine_password_timeout()) {
global_machine_password_needs_changing = False;
secrets_lock_trust_account_password(lp_workgroup(), False);
return True;
}
/* always just contact the PDC here */
/* always just contact the PDC here */
change_trust_account_password( lp_workgroup(), NULL);
global_machine_password_needs_changing = False;
secrets_lock_trust_account_password(lp_workgroup(), False);
}
change_trust_account_password( lp_workgroup(), NULL);
global_machine_password_needs_changing = False;
secrets_lock_trust_account_password(lp_workgroup(), False);
}
/*
* Check to see if we have any blocking locks
* outstanding on the queue.
*/
process_blocking_lock_queue(t);
/*
* Check to see if we have any blocking locks
* outstanding on the queue.
*/
process_blocking_lock_queue(t);
/* update printer queue caches if necessary */
/* update printer queue caches if necessary */
update_monitored_printq_cache();
update_monitored_printq_cache();
/*
* Check to see if we have any change notifies
* outstanding on the queue.
*/
process_pending_change_notify_queue(t);
/*
* Check to see if we have any change notifies
* outstanding on the queue.
*/
process_pending_change_notify_queue(t);
/*
* Now we are root, check if the log files need pruning.
* Force a log file check.
*/
force_check_log_size();
check_log_size();
/*
* Now we are root, check if the log files need pruning.
* Force a log file check.
*/
force_check_log_size();
check_log_size();
/* Send any queued printer notify message to interested smbd's. */
/* Send any queued printer notify message to interested smbd's. */
print_notify_send_messages(0);
print_notify_send_messages(0);
/*
* Modify the select timeout depending upon
* what we have remaining in our queues.
*/
/*
* Modify the select timeout depending upon
* what we have remaining in our queues.
*/
*select_timeout = setup_select_timeout();
*select_timeout = setup_select_timeout();
return True;
return True;
}
/****************************************************************************