diff options
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/smbd/mangle.c | 11 | ||||
-rw-r--r-- | source3/smbd/reply.c | 6 | ||||
-rw-r--r-- | source3/smbd/server.c | 34 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 2 |
5 files changed, 26 insertions, 29 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index cd1340dbd5..5993e1d67b 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -272,7 +272,7 @@ void clean_share_modes(void); /*The following definitions come from mangle.c */ int str_checksum(char *s); -BOOL is_8_3(char *fname); +BOOL is_8_3(char *fname, BOOL check_case); void create_mangled_stack(int size); BOOL check_mangled_stack(char *s); BOOL is_mangled(char *s); diff --git a/source3/smbd/mangle.c b/source3/smbd/mangle.c index c0baa65982..5fdf31b7a4 100644 --- a/source3/smbd/mangle.c +++ b/source3/smbd/mangle.c @@ -79,7 +79,7 @@ static BOOL is_reserved_msdos(char *fname) /**************************************************************************** return True if a name is in 8.3 dos format ****************************************************************************/ -BOOL is_8_3(char *fname) +BOOL is_8_3(char *fname, BOOL check_case) { int len; char *dot_pos; @@ -91,8 +91,7 @@ BOOL is_8_3(char *fname) DEBUG(5,("checking %s for 8.3\n",fname)); - if (case_mangle) -#ifndef YOSTW + if (check_case && case_mangle) switch (case_default) { case CASE_LOWER: @@ -102,10 +101,6 @@ BOOL is_8_3(char *fname) if (strhaslower(fname)) return(False); break; } -#endif -#ifdef YOSTW - if (strhasupper(fname) && strhaslower(fname)) return(False); -#endif /* can't be longer than 12 chars */ if (len == 0 || len > 12) @@ -652,7 +647,7 @@ BOOL name_map_mangle(char *OutName,BOOL need83,int snum) } /* check if it's already in 8.3 format */ - if (need83 && !is_8_3(OutName)) { + if (need83 && !is_8_3(OutName, True)) { if (!lp_manglednames(snum)) return(False); /* mangle it into 8.3 */ diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 3698787ba4..46c385b85e 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -37,6 +37,7 @@ extern connection_struct Connections[]; extern files_struct Files[]; extern BOOL case_sensitive; extern BOOL case_preserve; +extern BOOL short_case_preserve; extern pstring sesssetup_user; extern int Client; @@ -605,7 +606,7 @@ int reply_getatr(char *inbuf,char *outbuf) char *p = strrchr(fname,'/'); uint16 flg2 = SVAL(outbuf,smb_flg2); if (!p) p = fname; - if (!is_8_3(fname)) + if (!is_8_3(fname, True)) SSVAL(outbuf,smb_flg2,flg2 | 0x40); /* IS_LONG_NAME */ } @@ -2582,7 +2583,8 @@ int reply_mv(char *inbuf,char *outbuf) * the rename (user is trying to change the case of the * filename). */ - if((case_sensitive == False) && (case_preserve == True) && + if((case_sensitive == False) && ((case_preserve == True) || + ((short_case_preserve == True) && is_8_3(name, True))) && strcsequal(name, newname)) { pstring newname_modified_last_component; diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 5ff60c6c6c..4f3ee0fd0b 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -300,7 +300,7 @@ static BOOL mangled_equal(char *name1, char *name2) { pstring tmpname; - if (is_8_3(name2)) + if (is_8_3(name2, True)) return(False); strcpy(tmpname,name2); @@ -398,18 +398,29 @@ BOOL unix_convert(char *name,int cnum,pstring saved_last_component) unix_format(name); unix_clean_name(name); - if (!case_sensitive && - (!case_preserve || (is_8_3(name) && !short_case_preserve))) - strnorm(name); - /* names must be relative to the root of the service - trim any leading /. also trim trailing /'s */ trim_string(name,"/","/"); + /* + * Ensure saved_last_component is valid even if file exists. + */ + if(saved_last_component) { + end = strrchr(name, '/'); + if(end) + strcpy(saved_last_component, end + 1); + else + strcpy(saved_last_component, name); + } + + if (!case_sensitive && + (!case_preserve || (is_8_3(name, False) && !short_case_preserve))) + strnorm(name); + /* check if it's a printer file */ if (Connections[cnum].printer) { - if ((! *name) || strchr(name,'/') || !is_8_3(name)) + if ((! *name) || strchr(name,'/') || !is_8_3(name, True)) { char *s; fstring name2; @@ -422,17 +433,6 @@ BOOL unix_convert(char *name,int cnum,pstring saved_last_component) return(True); } - /* - * Ensure saved_last_component is valid even if file exists. - */ - if(saved_last_component) { - end = strrchr(name, '/'); - if(end) - strcpy(saved_last_component, end + 1); - else - strcpy(saved_last_component, name); - } - /* stat the name - if it exists then we are all done! */ if (sys_stat(name,&st) == 0) return(True); diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 2df28e9264..d489978ab8 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -429,7 +429,7 @@ static int get_lanman2_dir_entry(int cnum,char *path_mask,int dirtype,int info_l break; case SMB_FIND_FILE_BOTH_DIRECTORY_INFO: - was_8_3 = is_8_3(fname); + was_8_3 = is_8_3(fname, True); len = 94+strlen(fname); len = (len + 3) & ~3; SIVAL(p,0,len); p += 4; |