Merge from HEAD:
authorAndrew Bartlett <abartlet@samba.org>
Mon, 17 Mar 2003 22:56:13 +0000 (22:56 +0000)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 17 Mar 2003 22:56:13 +0000 (22:56 +0000)
 - Make ReadDirName return a const char*.

 - Consequential changes from that

 - mark our fstring/pstring assumptions in function prototypes

Andrew Bartlett
(This used to be commit 10b53d7c6fd77f23433dd2ef12bb14b227147a48)

source3/include/safe_string.h
source3/lib/util.c
source3/smbd/chgpasswd.c
source3/smbd/dir.c
source3/smbd/filename.c
source3/smbd/mangle.c
source3/smbd/mangle_hash2.c
source3/smbd/mangle_map.c
source3/smbd/reply.c
source3/smbd/trans2.c

index 431dc400aa1ed9b8053bdea649c9d2ae0a0c8f1c..95cf23df8377d4f73f6dbcdd07d53f8d6001e81b 100644 (file)
@@ -96,4 +96,7 @@ char * __unsafe_string_function_usage_here__(void);
 #define push_pstring_base(dest, src, pstring_base) \
     push_ascii(dest, src, sizeof(pstring)-PTR_DIFF(dest,pstring_base)-1, STR_TERMINATE)
 
+#define safe_strcpy_base(dest, src, base, size) \
+    safe_strcpy(dest, src, size-PTR_DIFF(dest,base)-1)
+
 #endif
index 77ffa70a471697a1245ae4c1a22a76c235edc522..bdf67a515aed8b7cd596796feeed952776e6a4f1 100644 (file)
@@ -1421,7 +1421,7 @@ void smb_panic(const char *why)
  A readdir wrapper which just returns the file name.
 ********************************************************************/
 
-char *readdirname(DIR *p)
+const char *readdirname(DIR *p)
 {
        SMB_STRUCT_DIRENT *ptr;
        char *dname;
index 401ab131adb7bf306247b9ce1e5c5ff6ffcb0f2a..31c4fa7cc9bf286a5b8c4fa9185611ed201f4cfc 100644 (file)
@@ -64,7 +64,7 @@ static int findpty(char **slave)
        int master;
        static fstring line;
        DIR *dirp;
-       char *dpname;
+       const char *dpname;
 
 #if defined(HAVE_GRANTPT)
        /* Try to open /dev/ptmx. If that fails, fall through to old method. */
index 95acf4a2621883dd9a0e940d2bea0d72f06720be..3f29ac892c7f8816bab321fdd71c59ed46234214 100644 (file)
@@ -578,7 +578,7 @@ BOOL dir_check_ftype(connection_struct *conn,int mode,SMB_STRUCT_STAT *st,int di
        return True;
 }
 
-static BOOL mangle_mask_match(connection_struct *conn, char *filename, char *mask)
+static BOOL mangle_mask_match(connection_struct *conn, fstring filename, char *mask)
 {
        mangle_map(filename,True,False,SNUM(conn));
        return mask_match(filename,mask,False);
@@ -588,10 +588,10 @@ static BOOL mangle_mask_match(connection_struct *conn, char *filename, char *mas
  Get an 8.3 directory entry.
 ****************************************************************************/
 
-BOOL get_dir_entry(connection_struct *conn,char *mask,int dirtype,char *fname,
+BOOL get_dir_entry(connection_struct *conn,char *mask,int dirtype, pstring fname,
                    SMB_OFF_T *size,int *mode,time_t *date,BOOL check_descend)
 {
-       char *dname;
+       const char *dname;
        BOOL found = False;
        SMB_STRUCT_STAT sbuf;
        pstring path;
@@ -907,7 +907,7 @@ void *OpenDir(connection_struct *conn, const char *name, BOOL use_veto)
                        dirp->current = dirp->data;
                }
 
-               safe_strcpy(dirp->data+used,n, dirp->mallocsize - used - 1);
+               safe_strcpy_base(dirp->data+used,n, dirp->data, dirp->mallocsize);
                used += l;
                dirp->numentries++;
        }
@@ -933,7 +933,7 @@ void CloseDir(void *p)
  Read from a directory.
 ********************************************************************/
 
-char *ReadDirName(void *p)
+const char *ReadDirName(void *p)
 {
        char *ret;
        Dir *dirp = (Dir *)p;
@@ -1008,7 +1008,7 @@ static ubi_dlNewList( dir_cache );
  Output: None.
 *****************************************************************************/
 
-void DirCacheAdd( const char *path, char *name, char *dname, int snum )
+void DirCacheAdd( const char *path, const char *name, const char *dname, int snum )
 {
        int pathlen;
        int namelen;
index 7d3527402e88c2aef65ed3d8ad9ded37127a28b7..ad707a2b9dd7e5275b1a8dd67fe4b1e3789fb629 100644 (file)
@@ -39,7 +39,7 @@ static BOOL scan_directory(const char *path, char *name,size_t maxlength,
  This needs to be careful about whether we are case sensitive.
 ****************************************************************************/
 
-static BOOL fname_equal(char *name1, char *name2)
+static BOOL fname_equal(const char *name1, const char *name2)
 {
        /* Normal filename handling */
        if (case_sensitive)
@@ -52,7 +52,7 @@ static BOOL fname_equal(char *name1, char *name2)
  Mangle the 2nd name and check if it is then equal to the first name.
 ****************************************************************************/
 
-static BOOL mangled_equal(char *name1, const char *name2, int snum)
+static BOOL mangled_equal(const char *name1, const char *name2, int snum)
 {
        pstring tmpname;
        
@@ -439,7 +439,7 @@ static BOOL scan_directory(const char *path, char *name, size_t maxlength,
                           connection_struct *conn,BOOL docache)
 {
        void *cur_dir;
-       char *dname;
+       const char *dname;
        BOOL mangled;
 
        mangled = mangle_is_mangled(name);
index f5c703a5bff1980450b88d70f7ef15adf3da614c..c5d7582c0336b3556ae01958e0c3149b4af564ea 100644 (file)
@@ -107,7 +107,7 @@ BOOL mangle_check_cache(char *s)
    map a long filename to a 8.3 name. 
  */
 
-void mangle_map(char *OutName, BOOL need83, BOOL cache83, int snum)
+void mangle_map(pstring OutName, BOOL need83, BOOL cache83, int snum)
 {
        /* name mangling can be disabled for speed, in which case
           we just truncate the string */
index eda509214d8a63090537cdf87d6c8f1a4be6e7e2..cdce28e1bd858d9cf03cd77f1d02e1ab71f42f48 100644 (file)
@@ -484,7 +484,7 @@ static BOOL is_legal_name(const char *name)
 
   the name parameter must be able to hold 13 bytes
 */
-static void name_map(char *name, BOOL need83, BOOL cache83)
+static void name_map(fstring name, BOOL need83, BOOL cache83)
 {
        char *dot_p;
        char lead_chars[7];
index 5ae3ebd174b5cd2580e2f8ac90c8cb7dc80cc5d9..9e798fd41b46ce6d5912d362346417bdc4c28b06 100644 (file)
@@ -201,7 +201,7 @@ static void mangled_map(char *s, const char *MangledMap)
   front end routine to the mangled map code 
   personally I think that the whole idea of "mangled map" is completely bogus
 */
-void mangle_map_filename(char *fname, int snum)
+void mangle_map_filename(fstring fname, int snum)
 {
        char *map;
 
index 71e880476cf69583ad7a37c1cffade7a2dfd46d2..ff1c0e5a528ea672135b17806f427707d21c728f 100644 (file)
@@ -1305,7 +1305,7 @@ NTSTATUS unlink_internals(connection_struct *conn, int dirtype, char *name)
                }
        } else {
                void *dirptr = NULL;
-               char *dname;
+               const char *dname;
                
                if (check_name(directory,conn))
                        dirptr = OpenDir(conn, directory, True);
@@ -2861,7 +2861,7 @@ int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
 
 static BOOL recursive_rmdir(connection_struct *conn, char *directory)
 {
-       char *dname = NULL;
+       const char *dname = NULL;
        BOOL ret = False;
        void *dirptr = OpenDir(conn, directory, False);
 
@@ -2926,7 +2926,7 @@ BOOL rmdir_internals(connection_struct *conn, char *directory)
                 * do a recursive delete) then fail the rmdir.
                 */
                BOOL all_veto_files = True;
-               char *dname;
+               const char *dname;
                void *dirptr = OpenDir(conn, directory, False);
 
                if(dirptr != NULL) {
@@ -3285,7 +3285,7 @@ directory = %s, newname = %s, newname_last_component = %s, is_8_3 = %d\n",
                 * Wildcards - process each file that matches.
                 */
                void *dirptr = NULL;
-               char *dname;
+               const char *dname;
                pstring destname;
                
                if (check_name(directory,conn))
@@ -3574,7 +3574,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
                }
        } else {
                void *dirptr = NULL;
-               char *dname;
+               const char *dname;
                pstring destname;
 
                if (check_name(directory,conn))
index bea09e9e373a4bdeee2f06d7c23d066c72709fc3..5d85cae907a4e291900ef10b6a9c0bfef0822db6 100644 (file)
@@ -460,7 +460,7 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
                                 BOOL *out_of_space, BOOL *got_exact_match,
                                 int *last_name_off)
 {
-       char *dname;
+       const char *dname;
        BOOL found = False;
        SMB_STRUCT_STAT sbuf;
        pstring mask;
@@ -1173,7 +1173,8 @@ resume_key = %d resume name = %s continue=%d level = %d\n",
                 */
 
                int current_pos, start_pos;
-               char *dname = NULL;
+               const char *dname = NULL;
+               pstring dname_pstring;
                void *dirptr = conn->dirptr;
                start_pos = TellDir(dirptr);
                for(current_pos = start_pos; current_pos >= 0; current_pos--) {
@@ -1181,7 +1182,7 @@ resume_key = %d resume name = %s continue=%d level = %d\n",
 
                        SeekDir(dirptr, current_pos);
                        dname = ReadDirName(dirptr);
-
+                       if (dname) {
                        /*
                         * Remember, mangle_map is called by
                         * get_lanman2_dir_entry(), so the resume name
@@ -1189,15 +1190,18 @@ resume_key = %d resume name = %s continue=%d level = %d\n",
                         * here.
                         */
 
-                       if(dname != NULL)
-                               mangle_map( dname, False, True, SNUM(conn));
+                               /* make sure we get a copy that mangle_map can modify */
+
+                               pstrcpy(dname_pstring, dname);
+                               mangle_map( dname_pstring, False, True, SNUM(conn));
 
-                       if(dname && strcsequal( resume_name, dname)) {
+                               if(strcsequal( resume_name, dname_pstring)) {
                                SeekDir(dirptr, current_pos+1);
                                DEBUG(7,("call_trans2findnext: got match at pos %d\n", current_pos+1 ));
                                break;
                        }
                }
+               }
 
                /*
                 * Scan forward from start if not found going backwards.
@@ -1215,14 +1219,18 @@ resume_key = %d resume name = %s continue=%d level = %d\n",
                                 * here.
                                 */
 
-                               if(dname != NULL)
-                                       mangle_map( dname, False, True, SNUM(conn));
+                               if(dname) {
+                                       /* make sure we get a copy that mangle_map can modify */
 
-                               if(dname && strcsequal( resume_name, dname)) {
+                                       pstrcpy(dname_pstring, dname);
+                                       mangle_map(dname_pstring, False, True, SNUM(conn));
+
+                                       if(strcsequal( resume_name, dname_pstring)) {
                                        SeekDir(dirptr, current_pos+1);
                                        DEBUG(7,("call_trans2findnext: got match at pos %d\n", current_pos+1 ));
                                        break;
                                }
+                               }
                        } /* end for */
                } /* end if current_pos */
        } /* end if requires_resume_key && !continue_bit */
@@ -1269,7 +1277,6 @@ resume_key = %d resume name = %s continue=%d level = %d\n",
                dptr_close(&dptr_num); /* This frees up the saved mask */
        }
 
-
        /* Set up the return parameter block */
        SSVAL(params,0,numentries);
        SSVAL(params,2,finished);