r1841: Fix for #1606, can't launch dos exe's.
authorJeremy Allison <jra@samba.org>
Mon, 16 Aug 2004 21:27:26 +0000 (21:27 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:52:21 +0000 (10:52 -0500)
2 related problems - 1). DOS uses chained commands - when we
are replying with sendfile we neglect to send the chained header. 2). Win9x and
DOS TCP stacks blow up when getting data back from a Linux sendfile - "The
engines canna take the strain cap'n". Don't use sendfile for anything less than NT1.
Jeremy.
(This used to be commit 3cd88f48afa589a189bb728d2d2660d058203d4d)

source3/param/loadparm.c
source3/smbd/reply.c

index 4150f57e55d20ca464d1e1d4f4e5650899abdbf7..2750cc7edabdea48d3078fce668151e79a4996fb 100644 (file)
@@ -4320,6 +4320,11 @@ int lp_maxprintjobs(int snum)
 
 BOOL lp_use_sendfile(int snum)
 {
+       extern int Protocol;
+       /* Using sendfile blows the brains out of any DOS or Win9x TCP stack... JRA. */
+       if (Protocol < PROTOCOL_NT1) {
+               return False;
+       }
        return (_lp_use_sendfile(snum) && (get_remote_arch() != RA_WIN95) && !srv_is_signing_active());
 }
 
index 4125d71b8404920e885438eac6f6caa4222fb1d6..74872eeea9f563ccc117f6e84dd54428aca4df7a 100644 (file)
@@ -1735,7 +1735,7 @@ void send_file_readbraw(connection_struct *conn, files_struct *fsp, SMB_OFF_T st
         * reply_readbraw has already checked the length.
         */
 
-       if ((nread > 0) && (lp_write_cache_size(SNUM(conn)) == 0) && lp_use_sendfile(SNUM(conn)) ) {
+       if (chain_size ==0 && (nread > 0) && (lp_write_cache_size(SNUM(conn)) == 0) && lp_use_sendfile(SNUM(conn)) ) {
                DATA_BLOB header;
 
                _smb_setlen(outbuf,nread);
@@ -2075,7 +2075,7 @@ int send_file_readX(connection_struct *conn, char *inbuf,char *outbuf,int length
         * on a train in Germany :-). JRA.
         */
 
-       if ((CVAL(inbuf,smb_vwv0) == 0xFF) && lp_use_sendfile(SNUM(conn)) &&
+       if (chain_size ==0 && (CVAL(inbuf,smb_vwv0) == 0xFF) && lp_use_sendfile(SNUM(conn)) &&
                        (lp_write_cache_size(SNUM(conn)) == 0) ) {
                SMB_STRUCT_STAT sbuf;
                DATA_BLOB header;