LCOV - code coverage report
Current view: top level - src - pathcmp.c (source / functions) Hit Total Coverage
Test: burp-coverage-clean.info Lines: 31 31 100.0 %
Date: 2016-11-02 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #include "burp.h"
       2             : #include "pathcmp.h"
       3             : 
       4             : // Return a number indicating the number of directories matched.
       5             : // 0 if it is not a sub-directory.
       6             : // Two paths the same counts as a subdirectory.
       7         251 : int is_subdir(const char *dir, const char *sub)
       8             : {
       9         251 :         int count=1;
      10         251 :         const char *d=NULL;
      11         251 :         const char *s=NULL;
      12         251 :         const char *dl=NULL;
      13         251 :         const char *sl=NULL;
      14         251 :         if(!sub || !dir) return 0;
      15        7458 :         for(s=sl=sub, dl=d=dir; *s && *d; s++, d++)
      16             :         {
      17        7501 :                 if(*s!=*d) break;
      18        7458 :                 sl=s;
      19        7458 :                 dl=d;
      20        7458 :                 if(*s=='/') count++;
      21             :         }
      22         248 :         if(!*d && !*s) return count; // Paths were exactly the same.
      23         222 :         if(!*d && *s=='/')
      24             :                 return count; // 'dir' ended without a slash, for example:
      25             :         // dir=/bin sub=/bin/bash
      26          90 :         if(*dl=='/' && *sl=='/' && *(sl+1) && !*(dl+1)) return count;
      27             :         return 0;
      28             : }
      29             : 
      30      672054 : int pathcmp(const char *a, const char *b)
      31             : {
      32             :         // This should have used 'unsigned chars', but now its too late and
      33             :         // everybody has backups with odd sorting. Will have to live with it.
      34      672054 :         const char *x=NULL;
      35      672054 :         const char *y=NULL;
      36      672054 :         if(!a && !b)
      37             :                 return 0; // equal
      38      594329 :         if( a && !b)
      39             :                 return 1; // a is longer
      40      592242 :         if(!a &&  b)
      41             :                 return -1; // b is longer
      42    10832621 :         for(x=a, y=b; *x && *y ; x++, y++)
      43             :         {
      44    11357788 :                 if(*x==*y)
      45    10832621 :                         continue;
      46      525167 :                 if(*x=='/' && *y!='/')
      47             :                         return -1;
      48      525137 :                 if(*x!='/' && *y=='/')
      49             :                         return 1;
      50             :                 // Need to make sure the comparisons are signed.
      51             :                 // Not doing this caused problems on raspberry pis.
      52      525136 :                 if((int8_t)*x<(int8_t)*y)
      53             :                         return -1;
      54      269212 :                 if((int8_t)*x>(int8_t)*y)
      55             :                         return 1;
      56             :         }
      57       67074 :         if(!*x && !*y)
      58             :                 return 0; // equal
      59         307 :         if( *x && !*y)
      60             :                 return 1; // x is longer
      61           9 :         return -1; // y is longer
      62             : }

Generated by: LCOV version 1.10