r6106: Fix bug #2551. It turns out that the incoming flags2 flag FLAGS2_LONG_PATH_COM...
authorJeremy Allison <jra@samba.org>
Tue, 29 Mar 2005 00:36:30 +0000 (00:36 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:56:22 +0000 (10:56 -0500)
determines if a reply is uppercased on a SMBsearch request, not the protocol level.
This could clear up quite a few hacks going forward I think.
Jeremy.

source/lib/util.c
source/smbd/reply.c

index d945bca5a7353cdc58a63115a2527fcbd01f599b..b76d561ccddd91a51aea5615a4f90146d88026f5 100644 (file)
@@ -603,7 +603,7 @@ void unix_clean_name(char *s)
  Make a dir struct.
 ****************************************************************************/
 
-void make_dir_struct(char *buf, const char *mask, const char *fname,SMB_OFF_T size,int mode,time_t date)
+void make_dir_struct(char *buf, const char *mask, const char *fname,SMB_OFF_T size,int mode,time_t date, BOOL uc)
 {  
        char *p;
        pstring mask2;
@@ -627,9 +627,9 @@ void make_dir_struct(char *buf, const char *mask, const char *fname,SMB_OFF_T si
        put_dos_date(buf,22,date);
        SSVAL(buf,26,size & 0xFFFF);
        SSVAL(buf,28,(size >> 16)&0xFFFF);
-       /* We only uppercase if the protocol is downrev.
+       /* We only uppercase if FLAGS2_LONG_PATH_COMPONENTS is zero in the input buf.
           Strange, but verified on W2K3. Needed for OS/2. JRA. */
-       push_ascii(buf+30,fname,12,Protocol < PROTOCOL_NT1 ? STR_UPPER : 0);
+       push_ascii(buf+30,fname,12, uc ? STR_UPPER : 0);
        DEBUG(8,("put name [%s] from [%s] into dir struct\n",buf+30, fname));
 }
 
index 6cc6a97afca0e00c89df9a367b1ca6254e08debd..9a811c14a36adbd9c28f8e460033d167ac377359 100644 (file)
@@ -931,6 +931,8 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
        BOOL can_open = True;
        BOOL bad_path = False;
        NTSTATUS nt_status;
+       BOOL allow_long_path_components = (SVAL(inbuf,smb_flg2) & FLAGS2_LONG_PATH_COMPONENTS) ? True : False;
+
        START_PROFILE(SMBsearch);
 
        *mask = *directory = *fname = 0;
@@ -1030,7 +1032,8 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
                if (ok) {
                        if ((dirtype&0x1F) == aVOLID) {   
                                memcpy(p,status,21);
-                               make_dir_struct(p,"???????????",volume_label(SNUM(conn)),0,aVOLID,0);
+                               make_dir_struct(p,"???????????",volume_label(SNUM(conn)),
+                                               0,aVOLID,0,!allow_long_path_components);
                                dptr_fill(p+12,dptr_num);
                                if (dptr_zero(p+12) && (status_len==0))
                                        numentries = 1;
@@ -1050,7 +1053,8 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
                                        finished = !get_dir_entry(conn,mask,dirtype,fname,&size,&mode,&date,check_descend);
                                        if (!finished) {
                                                memcpy(p,status,21);
-                                               make_dir_struct(p,mask,fname,size,mode,date);
+                                               make_dir_struct(p,mask,fname,size, mode,date,
+                                                               !allow_long_path_components);
                                                dptr_fill(p+12,dptr_num);
                                                numentries++;
                                                p += DIR_STRUCT_SIZE;
@@ -1088,8 +1092,11 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
        SCVAL(smb_buf(outbuf),0,5);
        SSVAL(smb_buf(outbuf),1,numentries*DIR_STRUCT_SIZE);
 
-       if (Protocol >= PROTOCOL_NT1)
-               SSVAL(outbuf,smb_flg2,SVAL(outbuf, smb_flg2) | FLAGS2_IS_LONG_NAME);
+       /* The replies here are never long name. */
+       SSVAL(outbuf,smb_flg2,SVAL(outbuf, smb_flg2) & (~FLAGS2_IS_LONG_NAME));
+       if (!allow_long_path_components) {
+               SSVAL(outbuf,smb_flg2,SVAL(outbuf, smb_flg2) & (~FLAGS2_LONG_PATH_COMPONENTS));
+       }
 
        /* This SMB *always* returns ASCII names. Remove the unicode bit in flags2. */
        SSVAL(outbuf,smb_flg2, (SVAL(outbuf, smb_flg2) & (~FLAGS2_UNICODE_STRINGS)));