diff options
author | Andrew Tridgell <tridge@samba.org> | 1997-10-02 03:14:32 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1997-10-02 03:14:32 +0000 |
commit | 85097a7c177977c3e0cb9b2ad41642dba5f917ac (patch) | |
tree | 04809ff5192c9bfa9c33f76d5a27b67c7790d024 /source3/smbd | |
parent | c9cf77a6bb245145dce3cd96ff4267fe226a1019 (diff) | |
download | samba-85097a7c177977c3e0cb9b2ad41642dba5f917ac.tar.gz samba-85097a7c177977c3e0cb9b2ad41642dba5f917ac.tar.bz2 samba-85097a7c177977c3e0cb9b2ad41642dba5f917ac.zip |
change the semantics of hosts allow/hosts deny so that a global
setting applies to all shares regardless of any settings on other
shares. This allows us to immediately drop a connection if it does not
come from a allowed host, without even parsing the first SMB
packet. The next time we get a nasty security hole we can offer people
the option of just setting their hosts allow line.
If we drop a connection in this way we generate a "Not listening for
calling name" response and then exit.
add a per share "oplocks" option in smb.conf. I think its important to
be able to disable oplocks on a per-share basis as there are occasions
then they are definately not wanted, for example when sharing data
between a windows box and a unix application. This also allows us to
tell people "try disabling oplocks" when diagnosing problems.
fix a bug in process_smb(). It was taking the length of the packet
from outbuf, not inbuf (this bug was introduced with the oplocks
code). Jeremy, I assume this wasn't deliberate?
(This used to be commit 44bc9f239aa0b3cdf6cf9ad8d3911e397eba7335)
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/server.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/source3/smbd/server.c b/source3/smbd/server.c index b9bdbaa655..7b04d228c3 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1841,7 +1841,7 @@ dev = %x, inode = %x\n", old_shares[i].op_type, fname, dev, inode)); be extended to level II oplocks (multiple reader oplocks). */ - if(oplock_request && (num_share_modes == 0)) + if(oplock_request && (num_share_modes == 0) && lp_oplocks(SNUM(cnum))) { fs_p->granted_oplock = True; global_oplocks_open++; @@ -2412,12 +2412,27 @@ static BOOL open_sockets(BOOL is_daemon,int port) static void process_smb(char *inbuf, char *outbuf) { extern int Client; - static int trans_num = 0; - + static int trans_num; int msg_type = CVAL(inbuf,0); - int32 len = smb_len(outbuf); + int32 len = smb_len(inbuf); int nread = len + 4; + 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 (!check_access(-1)) { + /* send a negative session response "not listining on calling + name" */ + static unsigned char buf[5] = {0x83, 0, 0, 1, 0x81}; + DEBUG(1,("%s Connection denied from %s\n", + timestring(),client_addr())); + send_smb(Client,buf); + exit_server("connection denied"); + } + } + DEBUG(6,("got message type 0x%x of len 0x%x\n",msg_type,len)); DEBUG(3,("%s Transaction %d of length %d\n",timestring(),trans_num,nread)); |