summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1998-09-03 03:14:31 +0000
committerAndrew Tridgell <tridge@samba.org>1998-09-03 03:14:31 +0000
commitc319d8ea3f8b42bb3a8e501642971ed0bdb21583 (patch)
treed6993f89a84537e12903372de0b66dc71ce7aba9
parente817d836bba3aaf0f732d66bc5a4383a7f7005db (diff)
downloadsamba-c319d8ea3f8b42bb3a8e501642971ed0bdb21583.tar.gz
fixed a bug in the name mangling code. It implicitly assumed that
mangling a name can't increase it's size which isn't true. (imagine a file called "L B" which mangles to "LB~XX") The symptoms were that users couldn't run batch files from short directory names that contained non 8.3 characters (such as spaces).
-rw-r--r--source/include/proto.h8
-rw-r--r--source/smbd/filename.c2
-rw-r--r--source/smbd/mangle.c78
3 files changed, 43 insertions, 45 deletions
diff --git a/source/include/proto.h b/source/include/proto.h
index 01ae342f98f..969b8c6a86e 100644
--- a/source/include/proto.h
+++ b/source/include/proto.h
@@ -170,7 +170,7 @@ int dos_open(char *fname,int flags,int mode);
DIR *dos_opendir(char *dname);
int dos_stat(char *fname,SMB_STRUCT_STAT *sbuf);
int sys_waitpid(pid_t pid,int *status,int options);
-int dos_lstat(char *fname,struct stat *sbuf);
+int dos_lstat(char *fname,SMB_STRUCT_STAT *sbuf);
int dos_mkdir(char *dname,int mode);
int dos_rmdir(char *dname);
int dos_chdir(char *dname);
@@ -305,7 +305,6 @@ int set_filelen(int fd, long len);
int byte_checksum(char *buf,int len);
char *dirname_dos(char *path,char *buf);
void *Realloc(void *p,int size);
-void Abort(void );
BOOL get_myname(char *my_name,struct in_addr *ip);
BOOL ip_equal(struct in_addr ip1,struct in_addr ip2);
int open_socket_in(int type, int port, int dlevel,uint32 socket_addr);
@@ -2052,8 +2051,8 @@ BOOL is_mangled( char *s );
BOOL is_8_3( char *fname, BOOL check_case );
void reset_mangled_cache( void );
BOOL check_mangled_cache( char *s );
-void mangle_name_83( char *s, int s_len );
-BOOL name_map_mangle( char *OutName, BOOL need83, int snum );
+void mangle_name_83( char *s);
+BOOL name_map_mangle(char *OutName, BOOL need83, int snum);
/*The following definitions come from smbd/message.c */
@@ -2291,7 +2290,6 @@ char *quotequotes(char *s);
void quote_spaces(char *buf);
void cgi_setup(char *rootdir, int auth_required);
char *cgi_baseurl(void);
-char *cgi_rooturl(void);
char *cgi_pathinfo(void);
char *cgi_remote_host(void);
char *cgi_remote_addr(void);
diff --git a/source/smbd/filename.c b/source/smbd/filename.c
index 3bc69210b93..656bb8997c9 100644
--- a/source/smbd/filename.c
+++ b/source/smbd/filename.c
@@ -77,7 +77,7 @@ BOOL mangled_equal(char *name1, char *name2)
return(False);
pstrcpy(tmpname,name2);
- mangle_name_83(tmpname,sizeof(tmpname));
+ mangle_name_83(tmpname);
return(strequal(name1,tmpname));
}
diff --git a/source/smbd/mangle.c b/source/smbd/mangle.c
index 0703a4a74ef..0a3d3f54eb7 100644
--- a/source/smbd/mangle.c
+++ b/source/smbd/mangle.c
@@ -799,12 +799,12 @@ static void do_fwd_mangled_map(char *s, char *MangledMap)
}
} /* do_fwd_mangled_map */
-/* ************************************************************************** **
+/*****************************************************************************
* do the actual mangling to 8.3 format
- *
- * ************************************************************************** **
+ * the buffer must be able to hold 13 characters (including the null)
+ *****************************************************************************
*/
-void mangle_name_83( char *s, int s_len )
+void mangle_name_83( char *s)
{
int csum = str_checksum(s);
char *p;
@@ -907,7 +907,7 @@ void mangle_name_83( char *s, int s_len )
csum = csum % (36*36);
- (void)slprintf( s, s_len - 1, "%s%c%c%c",
+ (void)slprintf(s, 12, "%s%c%c%c",
base, magic_char, base36( csum/36 ), base36( csum ) );
if( *extension )
@@ -917,12 +917,13 @@ void mangle_name_83( char *s, int s_len )
}
DEBUG( 5, ( "%s\n", s ) );
+
} /* mangle_name_83 */
-/* ************************************************************************** **
+/*****************************************************************************
* Convert a filename to DOS format. Return True if successful.
*
- * Input: OutName - Source *and* destination buffer.
+ * Input: OutName - Source *and* destination buffer.
*
* NOTE that OutName must point to a memory space that
* is at least 13 bytes in size!
@@ -939,47 +940,46 @@ void mangle_name_83( char *s, int s_len )
* Output: Returns False only if the name wanted mangling but the share does
* not have name mangling turned on.
*
- * ************************************************************************** **
+ * ****************************************************************************
*/
-BOOL name_map_mangle( char *OutName, BOOL need83, int snum )
- {
- DEBUG(5,
- ("name_map_mangle( %s, %s, %d )\n", OutName, need83?"TRUE":"FALSE", snum) );
+BOOL name_map_mangle(char *OutName, BOOL need83, int snum)
+{
+ char *map;
+ DEBUG(5,("name_map_mangle( %s, %s, %d )\n",
+ OutName, need83?"TRUE":"FALSE", snum));
#ifdef MANGLE_LONG_FILENAMES
- if( !need83 && is_illegal_name(OutName) )
- need83 = True;
+ if( !need83 && is_illegal_name(OutName) )
+ need83 = True;
#endif
- /* apply any name mappings */
- {
- char *map = lp_mangled_map( snum );
+ /* apply any name mappings */
+ map = lp_mangled_map(snum);
- if( map && *map )
- do_fwd_mangled_map( OutName, map );
- }
+ if (map && *map) {
+ do_fwd_mangled_map( OutName, map );
+ }
- /* check if it's already in 8.3 format */
- if( need83 && !is_8_3( OutName, True ) )
- {
- char *tmp; /* kludge -- mangle_name_83() overwrites the source string */
- /* but cache_mangled_name() needs both. crh 09-Apr-1998 */
+ /* check if it's already in 8.3 format */
+ if (need83 && !is_8_3(OutName, True)) {
+ char *tmp;
- if( !lp_manglednames( snum ) )
- return( False );
+ if (!lp_manglednames(snum)) {
+ return(False);
+ }
- /* mangle it into 8.3 */
- tmp = strdup( OutName );
- mangle_name_83( OutName, strlen(OutName) );
- if( tmp )
- {
- cache_mangled_name( OutName, tmp );
- free( tmp );
- }
- }
+ /* mangle it into 8.3 */
+ tmp = strdup(OutName);
+ mangle_name_83(OutName);
- DEBUG( 5, ("name_map_mangle() ==> [%s]\n", OutName) );
- return( True );
- } /* name_map_mangle */
+ if(tmp) {
+ cache_mangled_name(OutName, tmp);
+ free(tmp);
+ }
+ }
+
+ DEBUG(5,("name_map_mangle() ==> [%s]\n", OutName));
+ return(True);
+} /* name_map_mangle */
/* ========================================================================== */