Diff for /libaitwww/src/tools.c between versions 1.3 and 1.3.2.2

version 1.3, 2012/08/01 00:40:41 version 1.3.2.2, 2012/08/06 11:26:23
Line 178  www_unescape(char * __restrict str) Line 178  www_unescape(char * __restrict str)
   
         str[i] = 0;          str[i] = 0;
 }  }
   
   /*
    * www_undot() - Undotted and clean WWW query filename
    *
    * @fname = query filename
    * @fnlen = filename length
    * return: -1 error, 0 not valid filename or >0 validated filename length
    */
   int
   www_undot(const char * __restrict fname, int fnlen)
   {
           char *s, *s2;
           int l;
   
           if (!fname || !fnlen)
                   return -1;
   
           /* collapse / sequences */
           if ((s = strstr(fname, "//"))) {
                   s2 = s + 1;
                   for (s2 = ++s; *s2 == '/'; s2++);
                   memmove(s, s2, strlen(s2) + 1);
           }
   
           /* escaped ./ and /./ sequences */
           while (!strncmp(fname, "./", 2))
                   memmove((void*) fname, fname + 2, strlen(fname + 1));
           while ((s = strstr(fname, "/./")))
                   memmove(s, s + 2, strlen(s + 1));
   
           /* alternate between removing leading ../ and removing xxx/../ */
           while (42) {
                   while (!strncmp(fname, "../", 3))
                           memmove((void*) fname, fname + 3, strlen(fname + 2));
                   if (!(s = strstr(fname, "/../")))
                           break;
                   for (s2 = s - 1; s2 >= fname && *s2 != '/'; --s2);
                   memmove(s2 + 1, s + 4, strlen(s + 3));
           }
   
           /* elide any /.. at the end */
           while ((l = strlen(fname)) > 3 && 
                           !strcmp((s = (char*) fname + l - 3), "/..")) {
                   for (s2 = s - 1; s2 >= fname && *s2 != '/'; --s2);
                   if (s2 < fname)
                           break;
                   *s2 = 0;
           }
   
           /* if filename is empry add current dir */
           if (!*fname)
                   strlcpy((char*) fname, "./", fnlen);
   
           /* check for valid filename */
           if (*fname == '/' || (fname[0] == '.' && fname[1] == '.' && 
                                   (!fname[2] || fname[2] == '/')))
                   return 0;
   
           return strlen(fname);
   }

Removed from v.1.3  
changed lines
  Added in v.1.3.2.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>