summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/mangle.h8
-rw-r--r--source3/smbd/dir.c2
-rw-r--r--source3/smbd/filename.c10
-rw-r--r--source3/smbd/mangle.c19
-rw-r--r--source3/smbd/mangle_hash.c18
-rw-r--r--source3/smbd/mangle_hash2.c15
-rw-r--r--source3/smbd/reply.c9
-rw-r--r--source3/smbd/service.c3
-rw-r--r--source3/smbd/trans2.c12
9 files changed, 49 insertions, 47 deletions
diff --git a/source3/include/mangle.h b/source3/include/mangle.h
index 08d511689d..2bdef4ad64 100644
--- a/source3/include/mangle.h
+++ b/source3/include/mangle.h
@@ -5,10 +5,10 @@
*/
struct mangle_fns {
- BOOL (*is_mangled)(const char *s);
- BOOL (*is_8_3)(const char *fname, BOOL check_case, BOOL allow_wildcards);
void (*reset)(void);
- BOOL (*check_cache)(char *s, size_t maxlen);
- void (*name_map)(char *OutName, BOOL need83, BOOL cache83, int default_case);
+ BOOL (*is_mangled)(const char *s, int snum);
+ BOOL (*is_8_3)(const char *fname, BOOL check_case, BOOL allow_wildcards, int snum);
+ BOOL (*check_cache)(char *s, size_t maxlen, int snum);
+ void (*name_map)(char *OutName, BOOL need83, BOOL cache83, int default_case, int snum);
};
#endif /* _MANGLE_H_ */
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 95a5903c14..d66d1601fb 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -784,7 +784,7 @@ BOOL get_dir_entry(connection_struct *conn,char *mask,int dirtype, pstring fname
mask_match_search(filename,mask,False) ||
mangle_mask_match(conn,filename,mask)) {
- if (!mangle_is_8_3(filename, False))
+ if (!mangle_is_8_3(filename, False, SNUM(conn)))
mangle_map(filename,True,False,SNUM(conn));
pstrcpy(fname,filename);
diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c
index 9ca2c0efae..5f3cdfb77e 100644
--- a/source3/smbd/filename.c
+++ b/source3/smbd/filename.c
@@ -150,7 +150,7 @@ BOOL unix_convert(pstring name,connection_struct *conn,char *saved_last_componen
pstrcpy(saved_last_component, name);
}
- if (!conn->case_preserve || (mangle_is_8_3(name, False) && !conn->short_case_preserve))
+ if (!conn->case_preserve || (mangle_is_8_3(name, False, SNUM(conn)) && !conn->short_case_preserve))
strnorm(name, lp_defaultcase(SNUM(conn)));
start = name;
@@ -179,7 +179,7 @@ BOOL unix_convert(pstring name,connection_struct *conn,char *saved_last_componen
* sensitive then searching won't help.
*/
- if (conn->case_sensitive && !mangle_is_mangled(name) && !*lp_mangled_map(SNUM(conn)))
+ if (conn->case_sensitive && !mangle_is_mangled(name, SNUM(conn)) && !*lp_mangled_map(SNUM(conn)))
return(False);
name_has_wildcard = ms_has_wild(start);
@@ -189,7 +189,7 @@ BOOL unix_convert(pstring name,connection_struct *conn,char *saved_last_componen
* just a component. JRA.
*/
- if (mangle_is_mangled(start))
+ if (mangle_is_mangled(start, SNUM(conn)))
component_was_mangled = True;
/*
@@ -317,7 +317,7 @@ BOOL unix_convert(pstring name,connection_struct *conn,char *saved_last_componen
* base of the filename.
*/
- if (mangle_is_mangled(start)) {
+ if (mangle_is_mangled(start, SNUM(conn))) {
mangle_check_cache( start, sizeof(pstring) - 1 - (start - name) );
}
@@ -433,7 +433,7 @@ static BOOL scan_directory(connection_struct *conn, const char *path, char *name
BOOL mangled;
long curpos;
- mangled = mangle_is_mangled(name);
+ mangled = mangle_is_mangled(name, SNUM(conn));
/* handle null paths */
if (*path == 0)
diff --git a/source3/smbd/mangle.c b/source3/smbd/mangle.c
index 43becff69d..afc1ca12f0 100644
--- a/source3/smbd/mangle.c
+++ b/source3/smbd/mangle.c
@@ -67,29 +67,28 @@ static void mangle_init(void)
void mangle_reset_cache(void)
{
mangle_init();
-
mangle_fns->reset();
}
/*
see if a filename has come out of our mangling code
*/
-BOOL mangle_is_mangled(const char *s)
+BOOL mangle_is_mangled(const char *s, int snum)
{
- return mangle_fns->is_mangled(s);
+ return mangle_fns->is_mangled(s, snum);
}
/*
see if a filename matches the rules of a 8.3 filename
*/
-BOOL mangle_is_8_3(const char *fname, BOOL check_case)
+BOOL mangle_is_8_3(const char *fname, BOOL check_case, int snum)
{
- return mangle_fns->is_8_3(fname, check_case, False);
+ return mangle_fns->is_8_3(fname, check_case, False, snum);
}
-BOOL mangle_is_8_3_wildcards(const char *fname, BOOL check_case)
+BOOL mangle_is_8_3_wildcards(const char *fname, BOOL check_case, int snum)
{
- return mangle_fns->is_8_3(fname, check_case, True);
+ return mangle_fns->is_8_3(fname, check_case, True, snum);
}
/*
@@ -98,9 +97,9 @@ BOOL mangle_is_8_3_wildcards(const char *fname, BOOL check_case)
looking for a matching name if it doesn't. It should succeed most of the time
or there will be a huge performance penalty
*/
-BOOL mangle_check_cache(char *s, size_t maxlen)
+BOOL mangle_check_cache(char *s, size_t maxlen, int snum)
{
- return mangle_fns->check_cache(s, maxlen);
+ return mangle_fns->check_cache(s, maxlen, snum);
}
/*
@@ -120,5 +119,5 @@ void mangle_map(pstring OutName, BOOL need83, BOOL cache83, int snum)
/* invoke the inane "mangled map" code */
mangle_map_filename(OutName, snum);
- mangle_fns->name_map(OutName, need83, cache83, lp_defaultcase(snum));
+ mangle_fns->name_map(OutName, need83, cache83, lp_defaultcase(snum), snum);
}
diff --git a/source3/smbd/mangle_hash.c b/source3/smbd/mangle_hash.c
index 0067023e61..98ba775daf 100644
--- a/source3/smbd/mangle_hash.c
+++ b/source3/smbd/mangle_hash.c
@@ -276,13 +276,15 @@ done:
return ret;
}
-static BOOL is_8_3(const char *fname, BOOL check_case, BOOL allow_wildcards)
+static BOOL is_8_3(const char *fname, BOOL check_case, BOOL allow_wildcards, int snum)
{
const char *f;
smb_ucs2_t *ucs2name;
NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
size_t size;
+ magic_char = lp_magicchar(snum);
+
if (!fname || !*fname)
return False;
if ((f = strrchr(fname, '/')) == NULL)
@@ -362,10 +364,12 @@ static void init_chartest( void )
*
* ************************************************************************** **
*/
-static BOOL is_mangled(const char *s)
+static BOOL is_mangled(const char *s, int snum)
{
char *magic;
+ magic_char = lp_magicchar(snum);
+
if( !ct_initialized )
init_chartest();
@@ -460,12 +464,14 @@ static void cache_mangled_name( const char mangled_name[13], char *raw_name )
* ************************************************************************** **
*/
-static BOOL check_cache( char *s, size_t maxlen )
+static BOOL check_cache( char *s, size_t maxlen, int snum )
{
TDB_DATA data_val;
char *ext_start = NULL;
char *saved_ext = NULL;
+ magic_char = lp_magicchar(snum);
+
/* If the cache isn't initialized, give up. */
if( !tdb_mangled_cache )
return( False );
@@ -604,9 +610,11 @@ static void to_8_3(char *s, int default_case)
* ****************************************************************************
*/
-static void name_map(char *OutName, BOOL need83, BOOL cache83, int default_case)
+static void name_map(char *OutName, BOOL need83, BOOL cache83, int default_case, int snum)
{
smb_ucs2_t *OutName_ucs2;
+ magic_char = lp_magicchar(snum);
+
DEBUG(5,("name_map( %s, need83 = %s, cache83 = %s)\n", OutName,
need83 ? "True" : "False", cache83 ? "True" : "False"));
@@ -643,9 +651,9 @@ static void name_map(char *OutName, BOOL need83, BOOL cache83, int default_case)
to drop in an alternative mangling implementation
*/
static struct mangle_fns mangle_fns = {
+ mangle_reset,
is_mangled,
is_8_3,
- mangle_reset,
check_cache,
name_map
};
diff --git a/source3/smbd/mangle_hash2.c b/source3/smbd/mangle_hash2.c
index 4896cfb17b..6a8462ee3d 100644
--- a/source3/smbd/mangle_hash2.c
+++ b/source3/smbd/mangle_hash2.c
@@ -268,7 +268,7 @@ static BOOL is_mangled_component(const char *name, size_t len)
directory separators. It should return true if any component is
mangled
*/
-static BOOL is_mangled(const char *name)
+static BOOL is_mangled(const char *name, int snum)
{
const char *p;
const char *s;
@@ -293,7 +293,7 @@ static BOOL is_mangled(const char *name)
simplifies things greatly (it means that we know the string won't
get larger when converted from UNIX to DOS formats)
*/
-static BOOL is_8_3(const char *name, BOOL check_case, BOOL allow_wildcards)
+static BOOL is_8_3(const char *name, BOOL check_case, BOOL allow_wildcards, int snum)
{
int len, i;
char *dot_p;
@@ -370,7 +370,7 @@ static void mangle_reset(void)
try to find a 8.3 name in the cache, and if found then
replace the string with the original long name.
*/
-static BOOL check_cache(char *name, size_t maxlen)
+static BOOL check_cache(char *name, size_t maxlen, int snum)
{
u32 hash, multiplier;
unsigned int i;
@@ -378,7 +378,7 @@ static BOOL check_cache(char *name, size_t maxlen)
char extension[4];
/* make sure that this is a mangled name from this cache */
- if (!is_mangled(name)) {
+ if (!is_mangled(name, snum)) {
M_DEBUG(10,("check_cache: %s -> not mangled\n", name));
return False;
}
@@ -506,7 +506,7 @@ static BOOL is_legal_name(const char *name)
the name parameter must be able to hold 13 bytes
*/
-static void name_map(fstring name, BOOL need83, BOOL cache83, int default_case)
+static void name_map(fstring name, BOOL need83, BOOL cache83, int default_case, int snum)
{
char *dot_p;
char lead_chars[7];
@@ -520,7 +520,7 @@ static void name_map(fstring name, BOOL need83, BOOL cache83, int default_case)
if (!is_reserved_name(name)) {
/* if the name is already a valid 8.3 name then we don't need to
do anything */
- if (is_8_3(name, False, False)) {
+ if (is_8_3(name, False, False, snum)) {
return;
}
@@ -679,14 +679,13 @@ static void init_tables(void)
}
}
-
/*
the following provides the abstraction layer to make it easier
to drop in an alternative mangling implementation */
static struct mangle_fns mangle_fns = {
+ mangle_reset,
is_mangled,
is_8_3,
- mangle_reset,
check_cache,
name_map
};
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index aa33e59b7e..d39b9a20d3 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -30,7 +30,6 @@
extern enum protocol_types Protocol;
extern int max_send;
extern int max_recv;
-extern char magic_char;
extern int global_oplock_break;
unsigned int smb_echo_count = 0;
extern uint32 global_client_caps;
@@ -1753,7 +1752,7 @@ NTSTATUS unlink_internals(connection_struct *conn, int dirtype, char *name)
* Tine Smukavec <valentin.smukavec@hermes.si>.
*/
- if (!rc && mangle_is_mangled(mask))
+ if (!rc && mangle_is_mangled(mask,SNUM(conn)))
mangle_check_cache( mask, sizeof(pstring)-1 );
if (!has_wild) {
@@ -4055,7 +4054,7 @@ NTSTATUS rename_internals(connection_struct *conn, char *name, char *newname, ui
* Tine Smukavec <valentin.smukavec@hermes.si>.
*/
- if (!rc && mangle_is_mangled(mask))
+ if (!rc && mangle_is_mangled(mask,SNUM(conn)))
mangle_check_cache( mask, sizeof(pstring)-1 );
has_wild = ms_has_wild(mask);
@@ -4064,7 +4063,7 @@ NTSTATUS rename_internals(connection_struct *conn, char *name, char *newname, ui
/*
* No wildcards - just process the one file.
*/
- BOOL is_short_name = mangle_is_8_3(name, True);
+ BOOL is_short_name = mangle_is_8_3(name, True, SNUM(conn));
/* Add a terminating '/' to the directory name. */
pstrcat(directory,"/");
@@ -4536,7 +4535,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
* Tine Smukavec <valentin.smukavec@hermes.si>.
*/
- if (!rc && mangle_is_mangled(mask))
+ if (!rc && mangle_is_mangled(mask, SNUM(conn)))
mangle_check_cache( mask, sizeof(pstring)-1 );
has_wild = ms_has_wild(mask);
diff --git a/source3/smbd/service.c b/source3/smbd/service.c
index d4d6274dff..1708c51ff9 100644
--- a/source3/smbd/service.c
+++ b/source3/smbd/service.c
@@ -20,11 +20,9 @@
#include "includes.h"
-extern char magic_char;
extern struct timeval smb_last_time;
extern userdom_struct current_user_info;
-
/****************************************************************************
Load parameters specific to a connection/service.
****************************************************************************/
@@ -80,7 +78,6 @@ BOOL set_current_service(connection_struct *conn, uint16 flags, BOOL do_chdir)
conn->case_sensitive = False;
break;
}
- magic_char = lp_magicchar(snum);
return(True);
}
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index dd72db2fae..9f29a89f01 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -1064,7 +1064,7 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
if(!(got_match = *got_exact_match = exact_match(fname, mask, conn->case_sensitive)))
got_match = mask_match(fname, mask, conn->case_sensitive);
- if(!got_match && check_mangled_names && !mangle_is_8_3(fname, False)) {
+ if(!got_match && check_mangled_names && !mangle_is_8_3(fname, False, SNUM(conn))) {
/*
* It turns out that NT matches wildcards against
@@ -1286,7 +1286,7 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
case SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
DEBUG(10,("get_lanman2_dir_entry: SMB_FIND_FILE_BOTH_DIRECTORY_INFO\n"));
- was_8_3 = mangle_is_8_3(fname, True);
+ was_8_3 = mangle_is_8_3(fname, True, SNUM(conn));
p += 4;
SIVAL(p,0,reskey); p += 4;
put_long_date(p,cdate); p += 8;
@@ -1422,7 +1422,7 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
case SMB_FIND_ID_BOTH_DIRECTORY_INFO:
DEBUG(10,("get_lanman2_dir_entry: SMB_FIND_ID_BOTH_DIRECTORY_INFO\n"));
- was_8_3 = mangle_is_8_3(fname, True);
+ was_8_3 = mangle_is_8_3(fname, True, SNUM(conn));
p += 4;
SIVAL(p,0,reskey); p += 4;
put_long_date(p,cdate); p += 8;
@@ -1813,7 +1813,7 @@ total_data=%u (should be %u)\n", (unsigned int)total_data, (unsigned int)IVAL(pd
* (see PR#13758). JRA.
*/
- if(!mangle_is_8_3_wildcards( mask, False))
+ if(!mangle_is_8_3_wildcards( mask, False, SNUM(conn)))
mangle_map(mask, True, True, SNUM(conn));
return(-1);
@@ -2007,7 +2007,7 @@ total_data=%u (should be %u)\n", (unsigned int)total_data, (unsigned int)IVAL(pd
* could be mangled. Ensure we check the unmangled name.
*/
- if (mangle_is_mangled(resume_name)) {
+ if (mangle_is_mangled(resume_name, SNUM(conn))) {
mangle_check_cache(resume_name, sizeof(resume_name)-1);
}
@@ -3044,7 +3044,7 @@ total_data=%u (should be %u)\n", (unsigned int)total_data, (unsigned int)IVAL(pd
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_ALTERNATE_NAME_INFORMATION\n"));
pstrcpy(short_name,base_name);
/* Mangle if not already 8.3 */
- if(!mangle_is_8_3(short_name, True)) {
+ if(!mangle_is_8_3(short_name, True, SNUM(conn))) {
mangle_map(short_name,True,True,SNUM(conn));
}
len = srvstr_push(outbuf, pdata+4, short_name, -1, STR_UNICODE);