*** empty log message ***
authorAndrew Tridgell <tridge@samba.org>
Mon, 12 Jan 1998 00:20:10 +0000 (00:20 +0000)
committerAndrew Tridgell <tridge@samba.org>
Mon, 12 Jan 1998 00:20:10 +0000 (00:20 +0000)
source/include/smb.h
source/smbd/reply.c
source/smbd/server.c
source/smbd/trans2.c

index ebf0945855efa55fa83af484e5053cf363314407..e6c0565b056955356fa46b62ab9faf6c6e7193cf 100644 (file)
@@ -1443,6 +1443,7 @@ typedef struct
   BOOL modified;
   BOOL granted_oplock;
   BOOL sent_oplock_break;
   BOOL modified;
   BOOL granted_oplock;
   BOOL sent_oplock_break;
+  BOOL reserved;
   char *name;
 } files_struct;
 
   char *name;
 } files_struct;
 
index c903c7a1fd28ddd03f8c37002b6dfed497431f5f..7194f3b14465268cb6782ab26604c75a8102238f 100644 (file)
@@ -1191,6 +1191,7 @@ int reply_open(char *inbuf,char *outbuf)
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
+    Files[fnum].reserved = False;
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
  
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
  
@@ -1208,6 +1209,7 @@ int reply_open(char *inbuf,char *outbuf)
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
+    Files[fnum].reserved = False;
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
@@ -1291,6 +1293,7 @@ int reply_open_and_X(char *inbuf,char *outbuf,int length,int bufsize)
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
+    Files[fnum].reserved = False;
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
@@ -1308,6 +1311,7 @@ int reply_open_and_X(char *inbuf,char *outbuf,int length,int bufsize)
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
+    Files[fnum].reserved = False;
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
@@ -1437,6 +1441,7 @@ int reply_mknew(char *inbuf,char *outbuf)
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
+    Files[fnum].reserved = False;
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
@@ -1464,6 +1469,7 @@ int reply_mknew(char *inbuf,char *outbuf)
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
+    Files[fnum].reserved = False;
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
  
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
  
@@ -1519,6 +1525,7 @@ int reply_ctemp(char *inbuf,char *outbuf)
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
+    Files[fnum].reserved = False;
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
@@ -1538,6 +1545,7 @@ int reply_ctemp(char *inbuf,char *outbuf)
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
+    Files[fnum].reserved = False;
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
@@ -2572,15 +2580,19 @@ int reply_printopen(char *inbuf,char *outbuf)
 
   strcpy(fname2,(char *)mktemp(fname));
 
 
   strcpy(fname2,(char *)mktemp(fname));
 
-  if (!check_name(fname2,cnum))
-    return(ERROR(ERRDOS,ERRnoaccess));
+  if (!check_name(fname2,cnum)) {
+         Files[fnum].reserved = False;
+         return(ERROR(ERRDOS,ERRnoaccess));
+  }
 
   /* Open for exclusive use, write only. */
   open_file_shared(fnum,cnum,fname2,(DENY_ALL<<4)|1, 0x12, unix_mode(cnum,0), 
                    0, NULL, NULL);
 
 
   /* Open for exclusive use, write only. */
   open_file_shared(fnum,cnum,fname2,(DENY_ALL<<4)|1, 0x12, unix_mode(cnum,0), 
                    0, NULL, NULL);
 
-  if (!Files[fnum].open)
-    return(UNIXERROR(ERRDOS,ERRnoaccess));
+  if (!Files[fnum].open) {
+         Files[fnum].reserved = False;
+         return(UNIXERROR(ERRDOS,ERRnoaccess));
+  }
 
   /* force it to be a print file */
   Files[fnum].print_file = True;
 
   /* force it to be a print file */
   Files[fnum].print_file = True;
@@ -3250,7 +3262,10 @@ static BOOL copy_file(char *src,char *dest1,int cnum,int ofun,
   open_file_shared(fnum1,cnum,src,(DENY_NONE<<4),
                   1,0,0,&Access,&action);
 
   open_file_shared(fnum1,cnum,src,(DENY_NONE<<4),
                   1,0,0,&Access,&action);
 
-  if (!Files[fnum1].open) return(False);
+  if (!Files[fnum1].open) {
+         Files[fnum1].reserved = False;
+         return(False);
+  }
 
   if (!target_is_directory && count)
     ofun = 1;
 
   if (!target_is_directory && count)
     ofun = 1;
@@ -3265,6 +3280,7 @@ static BOOL copy_file(char *src,char *dest1,int cnum,int ofun,
 
   if (!Files[fnum2].open) {
     close_file(fnum1,False);
 
   if (!Files[fnum2].open) {
     close_file(fnum1,False);
+    Files[fnum2].reserved = False;
     return(False);
   }
 
     return(False);
   }
 
index a83e865f9e4feb3db2631658020cf09f9bb5ef94..3c40e9800faf4fc080940ad6de1e4008940c8ef3 100644 (file)
@@ -1466,6 +1466,8 @@ void close_file(int fnum, BOOL normal_close)
   uint32 inode = fs_p->fd_ptr->inode;
   int token;
 
   uint32 inode = fs_p->fd_ptr->inode;
   int token;
 
+  Files[fnum].reserved = False;
+
 #if USE_READ_PREDICTION
   invalidate_read_prediction(fs_p->fd_ptr->fd);
 #endif
 #if USE_READ_PREDICTION
   invalidate_read_prediction(fs_p->fd_ptr->fd);
 #endif
@@ -3671,21 +3673,23 @@ int find_free_file(void )
                if (first_file == 0) first_file = 1;
        }
 
                if (first_file == 0) first_file = 1;
        }
 
-       if (first_file == MAX_OPEN_FILES)
-               first_file = 0;
+       if (first_file >= MAX_OPEN_FILES)
+               first_file = 1;
 
        for (i=first_file;i<MAX_OPEN_FILES;i++)
 
        for (i=first_file;i<MAX_OPEN_FILES;i++)
-               if (!Files[i].open) {
+               if (!Files[i].open && !Files[i].reserved) {
                        memset(&Files[i], 0, sizeof(Files[i]));
                        memset(&Files[i], 0, sizeof(Files[i]));
-                       first_file++;
+                       first_file = i+1;
+                       Files[i].reserved = True;
                        return(i);
                }
 
        /* returning a file handle of 0 is a bad idea - so we start at 1 */
        for (i=1;i<first_file;i++)
                        return(i);
                }
 
        /* returning a file handle of 0 is a bad idea - so we start at 1 */
        for (i=1;i<first_file;i++)
-               if (!Files[i].open) {
+               if (!Files[i].open && !Files[i].reserved) {
                        memset(&Files[i], 0, sizeof(Files[i]));
                        memset(&Files[i], 0, sizeof(Files[i]));
-                       first_file++;
+                       first_file = i+1;
+                       Files[i].reserved = True;
                        return(i);
                }
 
                        return(i);
                }
 
index ce4a45005020d7b4b50d447180b4a90923172547..b52169a66b25a362f11a83d87e9386a7f1a0a04f 100644 (file)
@@ -208,6 +208,7 @@ static int call_trans2open(char *inbuf, char *outbuf, int bufsize, int cnum,
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
+    Files[fnum].reserved = False;
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
@@ -224,6 +225,7 @@ static int call_trans2open(char *inbuf, char *outbuf, int bufsize, int cnum,
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
       unix_ERR_class = ERRDOS;
       unix_ERR_code = ERRbadpath;
     }
+    Files[fnum].reserved = False;
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }
 
     return(UNIXERROR(ERRDOS,ERRnoaccess));
   }