From f63ee18c684af33342de2c5757f9fdf0b7d84997 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 9 Jun 2001 01:38:54 +0000 Subject: *Wonderful* patch from Andrew Bartlett that will help ensure tdb's are cleaned on clients abending connections. Thanks Andrew ! Jeremy. (This used to be commit 1b3977c5367a0b713b194f369abd9872ae01ac2a) --- source3/lib/util_sock.c | 64 ++++++++++++++--------------------------------- source3/smbd/blocking.c | 22 ++++++++-------- source3/smbd/ipc.c | 9 ++++--- source3/smbd/notify.c | 3 ++- source3/smbd/nttrans.c | 9 ++++--- source3/smbd/oplock.c | 6 +++-- source3/smbd/posix_acls.c | 25 +++++++++++++----- source3/smbd/process.c | 5 ++-- source3/smbd/reply.c | 12 ++++++--- source3/smbd/ssl.c | 6 +++-- source3/smbd/trans2.c | 9 ++++--- 11 files changed, 89 insertions(+), 81 deletions(-) diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c index 144498138a..d741f038ce 100644 --- a/source3/lib/util_sock.c +++ b/source3/lib/util_sock.c @@ -661,8 +661,10 @@ BOOL receive_smb(int fd,char *buffer, unsigned int timeout) if (len > (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE)) { DEBUG(0,("Invalid packet length! (%d bytes).\n",len)); - if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) - exit(1); + if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) { + smb_read_error = READ_ERROR; + return False; + } } if(len > 0) { @@ -710,56 +712,28 @@ BOOL client_receive_smb(int fd,char *buffer, unsigned int timeout) return ret; } -/**************************************************************************** - send an null session message to a fd -****************************************************************************/ - -BOOL send_null_session_msg(int fd) -{ - ssize_t ret; - uint32 blank = 0; - size_t len = 4; - size_t nwritten=0; - char *buffer = (char *)␣ - - while (nwritten < len) - { - ret = write_socket(fd,buffer+nwritten,len - nwritten); - if (ret <= 0) - { - DEBUG(0,("send_null_session_msg: Error writing %d bytes to client. %d. Exiting\n",(int)len,(int)ret)); - exit(1); - } - nwritten += ret; - } - - DEBUG(10,("send_null_session_msg: sent 4 null bytes to client.\n")); - return True; -} - /**************************************************************************** send an smb to a fd ****************************************************************************/ BOOL send_smb(int fd,char *buffer) { - size_t len; - size_t nwritten=0; - ssize_t ret; - len = smb_len(buffer) + 4; - - while (nwritten < len) - { - ret = write_socket(fd,buffer+nwritten,len - nwritten); - if (ret <= 0) - { - DEBUG(0,("Error writing %d bytes to client. %d. Exiting\n",(int)len,(int)ret)); - exit(1); - } - nwritten += ret; - } + size_t len; + size_t nwritten=0; + ssize_t ret; + len = smb_len(buffer) + 4; + + while (nwritten < len) { + ret = write_socket(fd,buffer+nwritten,len - nwritten); + if (ret <= 0) { + DEBUG(0,("Error writing %d bytes to client. %d. (%s)\n", + (int)len,(int)ret, strerror(errno) )); + return False; + } + nwritten += ret; + } - return True; + return True; } /**************************************************************************** diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c index e8dc29f80a..cebad5ce35 100644 --- a/source3/smbd/blocking.c +++ b/source3/smbd/blocking.c @@ -130,10 +130,11 @@ for fnum = %d, name = %s\n", length, (int)blr->expire_time, lock_timeout, static void send_blocking_reply(char *outbuf, int outsize) { - if(outsize > 4) - smb_setlen(outbuf,outsize - 4); + if(outsize > 4) + smb_setlen(outbuf,outsize - 4); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("send_blocking_reply: send_smb failed.\n"); } /**************************************************************************** @@ -171,15 +172,16 @@ static void reply_lockingX_success(blocking_lock_record *blr) static void generic_blocking_lock_error(blocking_lock_record *blr, int eclass, int32 ecode) { - char *outbuf = OutBuffer; - char *inbuf = blr->inbuf; - construct_reply_common(inbuf, outbuf); + char *outbuf = OutBuffer; + char *inbuf = blr->inbuf; + construct_reply_common(inbuf, outbuf); - if(eclass == 0) /* NT Error. */ - SSVAL(outbuf,smb_flg2, SVAL(outbuf,smb_flg2) | FLAGS2_32_BIT_ERROR_CODES); + if(eclass == 0) /* NT Error. */ + SSVAL(outbuf,smb_flg2, SVAL(outbuf,smb_flg2) | FLAGS2_32_BIT_ERROR_CODES); - ERROR(eclass,ecode); - send_smb(smbd_server_fd(),outbuf); + ERROR(eclass,ecode); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("generic_blocking_lock_error: send_smb failed.\n"); } /**************************************************************************** diff --git a/source3/smbd/ipc.c b/source3/smbd/ipc.c index 1418d3444f..efad2d27c0 100644 --- a/source3/smbd/ipc.c +++ b/source3/smbd/ipc.c @@ -128,7 +128,8 @@ void send_trans_reply(char *outbuf, SSVAL(outbuf,smb_vwv9,0); show_msg(outbuf); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("send_trans_reply: send_smb failed.\n"); tot_data_sent = this_ldata; tot_param_sent = this_lparam; @@ -161,7 +162,8 @@ void send_trans_reply(char *outbuf, SSVAL(outbuf,smb_vwv9,0); show_msg(outbuf); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("send_trans_reply: send_smb failed.\n"); tot_data_sent += this_ldata; tot_param_sent += this_lparam; @@ -424,7 +426,8 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int of the parameter/data bytes */ outsize = set_message(outbuf,0,0,True); show_msg(outbuf); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("reply_trans: send_smb failed.\n"); } /* receive the rest of the trans packet */ diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index 429723c19e..3c21ce1e1b 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -71,7 +71,8 @@ static void change_notify_reply_packet(char *inbuf, uint32 error_code) */ set_message(outbuf,18,0,False); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("change_notify_reply_packet: send_smb failed.\n"); } /**************************************************************************** diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index b67815ff69..d58bb106af 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -96,7 +96,8 @@ static int send_nt_replies(char *inbuf, char *outbuf, int bufsize, uint32 nt_err */ if(params_to_send == 0 && data_to_send == 0) { - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("send_nt_replies: send_smb failed.\n"); return 0; } @@ -225,7 +226,8 @@ static int send_nt_replies(char *inbuf, char *outbuf, int bufsize, uint32 nt_err params_to_send, data_to_send, paramsize, datasize)); /* Send the packet */ - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("send_nt_replies: send_smb failed.\n"); pp += params_sent_thistime; pd += data_sent_thistime; @@ -1780,7 +1782,8 @@ due to being in oplock break state.\n" )); /* We need to send an interim response then receive the rest of the parameter/data bytes */ outsize = set_message(outbuf,0,0,True); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("reply_nttrans: send_smb failed.\n"); while( num_data_sofar < total_data_count || num_params_sofar < total_parameter_count) { BOOL ret; diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index ac0836324b..4482c0221c 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -572,7 +572,8 @@ BOOL oplock_break_level2(files_struct *fsp, BOOL local_request, int token) /* Prepare the SMBlockingX message. */ prepare_break_message( outbuf, fsp, False); - send_smb(smbd_server_fd(), outbuf); + if (!send_smb(smbd_server_fd(), outbuf)) + exit_server("oplock_break_level2: send_smb failed.\n"); } /* @@ -716,7 +717,8 @@ static BOOL oplock_break(SMB_DEV_T dev, SMB_INO_T inode, struct timeval *tval, B fsp->sent_oplock_break = using_levelII? LEVEL_II_BREAK_SENT:EXCLUSIVE_BREAK_SENT; - send_smb(smbd_server_fd(), outbuf); + if (!send_smb(smbd_server_fd(), outbuf)) + exit_server("oplock_break: send_smb failed.\n"); /* We need this in case a readraw crosses on the wire. */ global_oplock_break = True; diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c index 0cc0f2bac6..d369746e50 100644 --- a/source3/smbd/posix_acls.c +++ b/source3/smbd/posix_acls.c @@ -2056,12 +2056,25 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd) } } - if (acl_perms && acl_set_support && fsp->is_directory && dir_ace_list) { - if (!set_canon_ace_list(fsp, dir_ace_list, True, &acl_set_support)) { - DEBUG(3,("set_nt_acl: failed to set default acl on directory %s (%s).\n", fsp->fsp_name, strerror(errno) )); - free_canon_ace_list(file_ace_list); - free_canon_ace_list(dir_ace_list); - return False; + if (acl_perms && acl_set_support && fsp->is_directory) { + if (dir_ace_list) { + if (!set_canon_ace_list(fsp, dir_ace_list, True, &acl_set_support)) { + DEBUG(3,("set_nt_acl: failed to set default acl on directory %s (%s).\n", fsp->fsp_name, strerror(errno) )); + free_canon_ace_list(file_ace_list); + free_canon_ace_list(dir_ace_list); + return False; + } + } else { + + /* + * No default ACL - delete one if it exists. + */ + + if (sys_acl_delete_def_file(dos_to_unix(fsp->fsp_name,False)) == -1) { + DEBUG(3,("set_nt_acl: sys_acl_delete_def_file failed (%s)\n", strerror(errno))); + free_canon_ace_list(file_ace_list); + return False; + } } } diff --git a/source3/smbd/process.c b/source3/smbd/process.c index 1f575e2a46..f757467680 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -822,7 +822,7 @@ void process_smb(char *inbuf, char *outbuf) static unsigned char buf[5] = {0x83, 0, 0, 1, 0x81}; DEBUG( 1, ( "Connection denied from %s\n", client_addr() ) ); - send_smb(smbd_server_fd(),(char *)buf); + (void)send_smb(smbd_server_fd(),(char *)buf); exit_server("connection denied"); } } @@ -860,7 +860,8 @@ void process_smb(char *inbuf, char *outbuf) nread, smb_len(outbuf))); } else - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("process_smb: send_smb failed.\n"); } trans_num++; } diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index d3f2527b35..9705bfd6b3 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -2487,7 +2487,8 @@ int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size, CVAL(outbuf,smb_com) = SMBwritebraw; SSVALS(outbuf,smb_vwv0,-1); outsize = set_message(outbuf,Protocol>PROTOCOL_COREPLUS?1:0,0,True); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("reply_writebraw: send_smb failed.\n"); /* Now read the raw data into the buffer and write it */ if (read_smb_length(smbd_server_fd(),inbuf,SMB_SECONDARY_WAIT) == -1) { @@ -3172,7 +3173,8 @@ int reply_echo(connection_struct *conn, smb_setlen(outbuf,outsize - 4); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("reply_echo: send_smb failed.\n"); } DEBUG(3,("echo %d times\n", smb_reverb)); @@ -4552,7 +4554,8 @@ int reply_readbmpx(connection_struct *conn, char *inbuf,char *outbuf,int length, SSVAL(outbuf,smb_vwv6,nread); SSVAL(outbuf,smb_vwv7,smb_offset(data,outbuf)); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("reply_readbmpx: send_smb failed.\n"); total_read += nread; startpos += nread; @@ -4650,7 +4653,8 @@ int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size, if (write_through && tcount==nwritten) { /* we need to send both a primary and a secondary response */ smb_setlen(outbuf,outsize - 4); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("reply_writebmpx: send_smb failed.\n"); /* now the secondary */ outsize = set_message(outbuf,1,0,True); diff --git a/source3/smbd/ssl.c b/source3/smbd/ssl.c index 65d6532d48..67a8afc82e 100644 --- a/source3/smbd/ssl.c +++ b/source3/smbd/ssl.c @@ -255,11 +255,13 @@ char *reqHosts, *resignHosts; if(msg_type != 0x81){ /* first packet must be a session request */ DEBUG( 0, ( "Client %s did not use session setup; access denied\n", client_addr() ) ); - send_smb(fd, (char *)buf); + if (!send_smb(fd, (char *)buf)) + exit_server("sslutil_negotiate_ssl: send_smb failed.\n"); return -1; } buf[4] = 0x8e; /* negative session response: use SSL */ - send_smb(fd, (char *)buf); + if (!send_smb(fd, (char *)buf)) + exit_server("sslutil_negotiate_ssl: send_smb failed.\n"); if(sslutil_accept(fd) != 0){ DEBUG( 0, ( "Client %s failed SSL negotiation!\n", client_addr() ) ); return -1; diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 7b2167b6ca..6f970ee3ac 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -65,7 +65,8 @@ static int send_trans2_replies(char *outbuf, int bufsize, char *params, the empty packet */ if(params_to_send == 0 && data_to_send == 0) { - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("send_trans2_replies: send_smb failed.\n"); return 0; } @@ -160,7 +161,8 @@ static int send_trans2_replies(char *outbuf, int bufsize, char *params, params_to_send, data_to_send, paramsize, datasize)); /* Send the packet */ - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("send_trans2_replies: send_smb failed.\n"); pp += params_sent_thistime; pd += data_sent_thistime; @@ -2340,7 +2342,8 @@ int reply_trans2(connection_struct *conn, /* We need to send an interim response then receive the rest of the parameter/data bytes */ outsize = set_message(outbuf,0,0,True); - send_smb(smbd_server_fd(),outbuf); + if (!send_smb(smbd_server_fd(),outbuf)) + exit_server("reply_trans2: send_smb failed.\n"); while (num_data_sofar < total_data || num_params_sofar < total_params) { -- cgit