Fossil

Diff
Login

Differences From Artifact [26f6e4e3bc]:

To Artifact [dcd451d839]:


521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
521
522
523
524
525
526
527


528
529
530
531
532
533
534







-
-







            }
          } else if( ((c & 0xff) == 0xed) && ((z[i+1] & 0xe0) == 0xa0) ){
            /* Unicode character in the range U+D800 - U+DFFF are for
             * surrogate pairs, they shouldn't occur in filenames. */
            return 0;
          }
        }
      }else if( c=='\\' ){
        return 0;
      }
    }
    if( c=='/' ){
      if( z[i+1]=='/' ) return 0;
      if( z[i+1]=='.' ){
        if( z[i+2]=='/' || z[i+2]==0 ) return 0;
        if( z[i+2]=='.' && (z[i+3]=='/' || z[i+3]==0) ) return 0;
767
768
769
770
771
772
773
774
775


776
777
778
779
780
781
782
783
784
785

786

787
788
789
790
791
792
793
765
766
767
768
769
770
771


772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793







-
-
+
+










+

+







    fossil_print("  file_isdir  = %d\n", file_wd_isdir(zName));
  }
}

/*
** Return TRUE if the given filename is canonical.
**
** Canonical names are full pathnames using "/" not "\" and which
** contain no "/./" or "/../" terms.
** Canonical names are full pathnames using "/" not "\" (on Windows)
** and which contain no "/./" or "/../" terms.
*/
int file_is_canonical(const char *z){
  int i;
  if( z[0]!='/'
#if defined(_WIN32)
    && (z[0]==0 || z[1]!=':' || z[2]!='/')
#endif
  ) return 0;

  for(i=0; z[i]; i++){
#if defined(_WIN32)
    if( z[i]=='\\' ) return 0;
#endif
    if( z[i]=='/' ){
      if( z[i+1]=='.' ){
        if( z[i+2]=='/' || z[i+2]==0 ) return 0;
        if( z[i+2]=='.' && (z[i+3]=='/' || z[i+3]==0) ) return 0;
      }
    }
  }