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

Reformatting only before real change.

Jeremy.
(This used to be commit ac21f280d5030a9c49330be37bd754a1540a238a)
This commit is contained in:
Jeremy Allison 2002-08-26 20:26:25 +00:00
parent 6dad13d801
commit dc0c3e97ca

View File

@ -609,8 +609,9 @@ const static struct smb_message_struct
}; };
/******************************************************************* /*******************************************************************
dump a prs to a file Dump a packet to a file.
********************************************************************/ ********************************************************************/
static void smb_dump(const char *name, int type, char *data, ssize_t len) static void smb_dump(const char *name, int type, char *data, ssize_t len)
{ {
int fd, i; int fd, i;
@ -635,178 +636,170 @@ static void smb_dump(const char *name, int type, char *data, ssize_t len)
/**************************************************************************** /****************************************************************************
do a switch on the message type, and return the response size Do a switch on the message type, and return the response size
****************************************************************************/ ****************************************************************************/
static int switch_message(int type,char *inbuf,char *outbuf,int size,int bufsize) static int switch_message(int type,char *inbuf,char *outbuf,int size,int bufsize)
{ {
static pid_t pid= (pid_t)-1; static pid_t pid= (pid_t)-1;
int outsize = 0; int outsize = 0;
extern uint16 global_smbpid; extern uint16 global_smbpid;
type &= 0xff; type &= 0xff;
if (pid == (pid_t)-1) if (pid == (pid_t)-1)
pid = sys_getpid(); pid = sys_getpid();
errno = 0; errno = 0;
last_message = type; last_message = type;
/* make sure this is an SMB packet */ /* Make sure this is an SMB packet */
if (strncmp(smb_base(inbuf),"\377SMB",4) != 0) if (strncmp(smb_base(inbuf),"\377SMB",4) != 0) {
{ DEBUG(2,("Non-SMB packet of length %d\n",smb_len(inbuf)));
DEBUG(2,("Non-SMB packet of length %d\n",smb_len(inbuf))); return(-1);
return(-1); }
}
/* yuck! this is an interim measure before we get rid of our /* yuck! this is an interim measure before we get rid of our
current inbuf/outbuf system */ current inbuf/outbuf system */
global_smbpid = SVAL(inbuf,smb_pid); global_smbpid = SVAL(inbuf,smb_pid);
if (smb_messages[type].fn == NULL) if (smb_messages[type].fn == NULL) {
{ DEBUG(0,("Unknown message type %d!\n",type));
DEBUG(0,("Unknown message type %d!\n",type)); smb_dump("Unknown", 1, inbuf, size);
smb_dump("Unknown", 1, inbuf, size); outsize = reply_unknown(inbuf,outbuf);
outsize = reply_unknown(inbuf,outbuf); } else {
} int flags = smb_messages[type].flags;
else static uint16 last_session_tag = UID_FIELD_INVALID;
{ /* In share mode security we must ignore the vuid. */
int flags = smb_messages[type].flags; uint16 session_tag = (lp_security() == SEC_SHARE) ? UID_FIELD_INVALID : SVAL(inbuf,smb_uid);
static uint16 last_session_tag = UID_FIELD_INVALID; connection_struct *conn = conn_find(SVAL(inbuf,smb_tid));
/* In share mode security we must ignore the vuid. */
uint16 session_tag = (lp_security() == SEC_SHARE) ? UID_FIELD_INVALID : SVAL(inbuf,smb_uid);
connection_struct *conn = conn_find(SVAL(inbuf,smb_tid));
DEBUG(3,("switch message %s (pid %d)\n",smb_fn_name(type),(int)pid)); DEBUG(3,("switch message %s (pid %d)\n",smb_fn_name(type),(int)pid));
smb_dump(smb_fn_name(type), 1, inbuf, size); smb_dump(smb_fn_name(type), 1, inbuf, size);
if(global_oplock_break) if(global_oplock_break) {
{ if(flags & QUEUE_IN_OPLOCK) {
if(flags & QUEUE_IN_OPLOCK) /*
{ * Queue this message as we are the process of an oplock break.
/* */
* Queue this message as we are the process of an oplock break.
*/
DEBUG( 2, ( "switch_message: queueing message due to being in " ) ); DEBUG( 2, ( "switch_message: queueing message due to being in " ) );
DEBUGADD( 2, ( "oplock break state.\n" ) ); DEBUGADD( 2, ( "oplock break state.\n" ) );
push_oplock_pending_smb_message( inbuf, size ); push_oplock_pending_smb_message( inbuf, size );
return -1; return -1;
} }
} }
/* Ensure this value is replaced in the incoming packet. */ /* Ensure this value is replaced in the incoming packet. */
SSVAL(inbuf,smb_uid,session_tag); SSVAL(inbuf,smb_uid,session_tag);
/* /*
* Ensure the correct username is in current_user_info. * Ensure the correct username is in current_user_info.
* This is a really ugly bugfix for problems with * This is a really ugly bugfix for problems with
* multiple session_setup_and_X's being done and * multiple session_setup_and_X's being done and
* allowing %U and %G substitutions to work correctly. * allowing %U and %G substitutions to work correctly.
* There is a reason this code is done here, don't * There is a reason this code is done here, don't
* move it unless you know what you're doing... :-). * move it unless you know what you're doing... :-).
* JRA. * JRA.
*/ */
if (session_tag != last_session_tag) { if (session_tag != last_session_tag) {
user_struct *vuser = NULL; user_struct *vuser = NULL;
last_session_tag = session_tag; last_session_tag = session_tag;
if(session_tag != UID_FIELD_INVALID) if(session_tag != UID_FIELD_INVALID)
vuser = get_valid_user_struct(session_tag); vuser = get_valid_user_struct(session_tag);
if(vuser != NULL) if(vuser != NULL)
current_user_info = vuser->user; current_user_info = vuser->user;
} }
/* does this protocol need to be run as root? */ /* does this protocol need to be run as root? */
if (!(flags & AS_USER)) if (!(flags & AS_USER))
change_to_root_user(); change_to_root_user();
/* does this protocol need a valid tree connection? */ /* does this protocol need a valid tree connection? */
if ((flags & AS_USER) && !conn) { if ((flags & AS_USER) && !conn)
return ERROR_DOS(ERRSRV, ERRinvnid); return ERROR_DOS(ERRSRV, ERRinvnid);
}
/* does this protocol need to be run as the connected user? */ /* does this protocol need to be run as the connected user? */
if ((flags & AS_USER) && !change_to_user(conn,session_tag)) { if ((flags & AS_USER) && !change_to_user(conn,session_tag)) {
if (flags & AS_GUEST) if (flags & AS_GUEST)
flags &= ~AS_USER; flags &= ~AS_USER;
else else
return(ERROR_DOS(ERRSRV,ERRaccess)); return(ERROR_DOS(ERRSRV,ERRaccess));
} }
/* this code is to work around a bug is MS client 3 without /* this code is to work around a bug is MS client 3 without
introducing a security hole - it needs to be able to do introducing a security hole - it needs to be able to do
print queue checks as guest if it isn't logged in properly */ print queue checks as guest if it isn't logged in properly */
if (flags & AS_USER) if (flags & AS_USER)
flags &= ~AS_GUEST; flags &= ~AS_GUEST;
/* does it need write permission? */ /* does it need write permission? */
if ((flags & NEED_WRITE) && !CAN_WRITE(conn)) if ((flags & NEED_WRITE) && !CAN_WRITE(conn))
return(ERROR_DOS(ERRSRV,ERRaccess)); return(ERROR_DOS(ERRSRV,ERRaccess));
/* ipc services are limited */ /* ipc services are limited */
if (IS_IPC(conn) && (flags & AS_USER) && !(flags & CAN_IPC)) { if (IS_IPC(conn) && (flags & AS_USER) && !(flags & CAN_IPC))
return(ERROR_DOS(ERRSRV,ERRaccess)); return(ERROR_DOS(ERRSRV,ERRaccess));
}
/* load service specific parameters */ /* load service specific parameters */
if (conn && !set_current_service(conn,(flags & AS_USER)?True:False)) { if (conn && !set_current_service(conn,(flags & AS_USER)?True:False))
return(ERROR_DOS(ERRSRV,ERRaccess)); return(ERROR_DOS(ERRSRV,ERRaccess));
}
/* does this protocol need to be run as guest? */ /* does this protocol need to be run as guest? */
if ((flags & AS_GUEST) && if ((flags & AS_GUEST) && (!change_to_guest() ||
(!change_to_guest() || !check_access(smbd_server_fd(), lp_hostsallow(-1), lp_hostsdeny(-1))))
!check_access(smbd_server_fd(), lp_hostsallow(-1), lp_hostsdeny(-1)))) { return(ERROR_DOS(ERRSRV,ERRaccess));
return(ERROR_DOS(ERRSRV,ERRaccess));
}
last_inbuf = inbuf; last_inbuf = inbuf;
outsize = smb_messages[type].fn(conn, inbuf,outbuf,size,bufsize); outsize = smb_messages[type].fn(conn, inbuf,outbuf,size,bufsize);
} }
smb_dump(smb_fn_name(type), 0, outbuf, outsize); smb_dump(smb_fn_name(type), 0, outbuf, outsize);
return(outsize); return(outsize);
} }
/**************************************************************************** /****************************************************************************
construct a reply to the incoming packet Construct a reply to the incoming packet.
****************************************************************************/ ****************************************************************************/
static int construct_reply(char *inbuf,char *outbuf,int size,int bufsize) static int construct_reply(char *inbuf,char *outbuf,int size,int bufsize)
{ {
int type = CVAL(inbuf,smb_com); int type = CVAL(inbuf,smb_com);
int outsize = 0; int outsize = 0;
int msg_type = CVAL(inbuf,0); int msg_type = CVAL(inbuf,0);
GetTimeOfDay(&smb_last_time); GetTimeOfDay(&smb_last_time);
chain_size = 0; chain_size = 0;
file_chain_reset(); file_chain_reset();
reset_chain_p(); reset_chain_p();
if (msg_type != 0) if (msg_type != 0)
return(reply_special(inbuf,outbuf)); return(reply_special(inbuf,outbuf));
construct_reply_common(inbuf, outbuf); construct_reply_common(inbuf, outbuf);
outsize = switch_message(type,inbuf,outbuf,size,bufsize); outsize = switch_message(type,inbuf,outbuf,size,bufsize);
outsize += chain_size; outsize += chain_size;
if(outsize > 4) if(outsize > 4)
smb_setlen(outbuf,outsize - 4); smb_setlen(outbuf,outsize - 4);
return(outsize); return(outsize);
} }
/**************************************************************************** /****************************************************************************
Keep track of the number of running smbd's. This functionality is used to Keep track of the number of running smbd's. This functionality is used to
'hard' limit Samba overhead on resource constrained systems. 'hard' limit Samba overhead on resource constrained systems.
****************************************************************************/ ****************************************************************************/
static BOOL smbd_process_limit(void) static BOOL smbd_process_limit(void)
{ {
int32 total_smbds; int32 total_smbds;