]> git.ipfire.org Git - thirdparty/sarg.git/blobdiff - log.c
Protection against buffer overflows in getword and friends and report the origin...
[thirdparty/sarg.git] / log.c
diff --git a/log.c b/log.c
index 335b102c7aaa168a79e81b6835e709c7844302f8..f8edecd753411b7f272329b6f754fb73605ae7e8 100644 (file)
--- a/log.c
+++ b/log.c
@@ -300,7 +300,10 @@ int main(argc,argv)
          case 'd':
             strcpy(date,optarg);
             strcpy(cduntil,optarg);
-            getword(cdfrom,cduntil,'-');
+            if (getword(cdfrom,sizeof(cdfrom),cduntil,'-')<0) {
+               printf("SARG: Maybe you have a broken record or garbage in your date range.\n");
+               exit(1);
+            }
             date_from(date, cdfrom, cduntil);
             dfrom=atoi(cdfrom);
             duntil=atoi(cduntil);
@@ -351,7 +354,10 @@ int main(argc,argv)
               strcpy(hm,optarg);
               strcpy(hmf,optarg);
             } else {
-               getword(hm,optarg,'-');
+               if (getword(hm,sizeof(hm),optarg,'-')<0) {
+                  printf("SARG: Maybe you have a broken record or garbage in your time range.\n");
+                  exit(1);
+               }
                strcpy(hmf,optarg);
             }
             if(strlen(hm) > 5) {
@@ -360,13 +366,19 @@ int main(argc,argv)
             }
             bzero(whm,15);
             if(strstr(hm,":") != 0) {
-               getword(warea,hm,':');
+               if (getword(warea,sizeof(warea),hm,':')<0) {
+                  printf("SARG: Maybe you have a broken record or garbage in your time range.\n");
+                  exit(1);
+               }
                sprintf(whm,"%s%s",warea,hm);
                strcpy(hm,whm);
             }
             bzero(whm,15);
             if(strstr(hmf,":") != 0) {
-               getword(warea,hmf,':');
+               if (getword(warea,sizeof(warea),hmf,':')<0) {
+                  printf("SARG: Maybe you have a broken record or garbage in your time range.\n");
+                  exit(1);
+               }
                sprintf(whm,"%s%s",warea,hmf);
                strcpy(hmf,whm);
             }
@@ -692,7 +704,10 @@ int main(argc,argv)
       while(fgets(buf,MAXLEN,fp_usr)!=NULL) {
          buf[strlen(buf)-1]='\0';
          if(strstr(buf,"\r") != 0) buf[strlen(buf)-1]='\0';
-         getword(bufy,buf,' ');
+        if (getword_multisep(bufy,sizeof(bufy),buf,' ')<0) {
+           printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",UserTabFile);
+           exit(1);
+        }
          for(z1=0; z1<=strlen(bufy); z1++) {
             userfile[z2]=bufy[z1];
             z2++;
@@ -733,10 +748,11 @@ int main(argc,argv)
    if(!isalog && strncmp(bufz,"#Software: Mic",14) == 0) isalog++;
 
    if(strncmp(bufz,"*** SARG Log ***",16) == 0) {
-      getword(val2,arqtt,'-');
-      getword(val2,arqtt,'_');
-      getword(val3,arqtt,'-');
-      getword(val3,arqtt,'_');
+      if (getword(val2,sizeof(val2),arqtt,'-')<0 || getword(val2,sizeof(val2),arqtt,'_')<0 ||
+          getword(val3,sizeof(val3),arqtt,'-')<0 || getword(val3,sizeof(val3),arqtt,'_')<0) {
+         printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+         exit(1);
+      }
       sprintf(period,"%s-%s",val2,val3);
       sarglog=1;
    } else lseek(fileno(fp_in), 0, 0);
@@ -816,7 +832,10 @@ int main(argc,argv)
            strcpy(warea,bufz);
            strcpy(html,ExcludeString);
            while(strstr(html,":") != 0) {
-              getword(val1,html,':');
+              if (getword_multisep(val1,sizeof(val1),html,':')<0) {
+                 printf("SARG: Maybe you have a broken record or garbage in your exclusion string.\n");
+                 exit(1);
+              }
               if((str=(char *) strstr(warea,val1)) != (char *) NULL )
                  exstring++;
            }
@@ -835,29 +854,38 @@ int main(argc,argv)
                   printf("BUF=%s\n",bufz);
 
         if(!sarglog && !isalog) {
-           getword(data,bufz,' ');
+           if (getword(data,sizeof(data),bufz,' ')<0) {
+             printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n");
+             exit(1);
+           }
            if((str=(char *) strstr(data, ".")) != (char *) NULL ) {
               if((str=(char *) strstr(str+1, ".")) != (char *) NULL ) {
                  strcpy(ip,data);
                         strcpy(elap,"0");
-                if(squid24) {
-                    getword(user,bufz,' ');
-                    getword(none,bufz,' ');
-                } else {
-                   getword(none,bufz,' ');
-                   getword(user,bufz,' ');
-                }
-                getword(data,bufz,']');
-                getword(fun,bufz,'"');
-                getword(fun,bufz,' ');
-                getword(url,bufz,' ');
-                 getword(code2,bufz,' ');
-                 getword(code2,bufz,' ');
-                 getword(tam,bufz,' ');
-
-
-                 if((str=(char *) strstr(bufz, " ")) != (char *) NULL )
-                    getword(code,bufz,' ');
+                        if(squid24) {
+                    if (getword(user,sizeof(user),bufz,' ')<0 || getword(none,sizeof(none),bufz,' ')<0) {
+                       printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                       exit(1);
+                    }
+                        } else {
+                       if (getword(none,sizeof(none),bufz,' ')<0 || getword(user,sizeof(user),bufz,' ')<0) {
+                       printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                       exit(1);
+                    }
+                 }
+                    if (getword(data,sizeof(data),bufz,']')<0 || getword(fun,sizeof(fun),bufz,'"')<0 ||
+                        getword(fun,sizeof(fun),bufz,' ')<0 || getword(url,sizeof(url),bufz,' ')<0 ||
+                     getword(code2,sizeof(code2),bufz,' ')<0 || getword(code2,sizeof(code2),bufz,' ')<0 ||
+                     getword(tam,sizeof(tam),bufz,' ')<0) {
+                    printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                    exit(1);
+                 }
+                 if((str=(char *) strstr(bufz, " ")) != (char *) NULL ) {
+                    if (getword(code,sizeof(code),bufz,' ')<0) {
+                       printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                       exit(1);
+                    }
+                 }
                  else strcpy(code,bufz);
 
                  if ((str = strchr(code, ':')) != NULL)
@@ -872,37 +900,94 @@ int main(argc,argv)
           }
 
           if(!common) {
-             getword(elap,bufz,' ');
+             if (getword(elap,sizeof(elap),bufz,' ')<0) {
+             printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+             exit(1);
+          }
              while(strcmp(elap,"") == 0 && strlen(bufz) > 0)
-                getword(elap,bufz,' ');
+                if (getword(elap,sizeof(elap),bufz,' ')<0) {
+                printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                exit(1);
+             }
               if(strlen(elap) < 1) continue;
-             getword(ip,bufz,' ');
-             getword(code,bufz,' ');
-             getword(tam,bufz,' ');
-             getword(fun,bufz,' ');
-             getword(url,bufz,' ');
+                 if (getword(ip,sizeof(ip),bufz,' ')<0){
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+              if (getword(code,sizeof(code),bufz,' ')<0){
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+              if (getword(tam,sizeof(tam),bufz,' ')<0){
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+              if (getword(fun,sizeof(fun),bufz,' ')<0){
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+              if (getword(url,sizeof(url),bufz,' ')<0){
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
 //              while (strstr(bufz,"%20") != 0) {
 //                 getword(warea,bufz,' ');
 //                 strcat(url,warea);
 //              }
-             getword(user,bufz,' ');
-             squid_log=1;
-          }
+              if (getword(user,sizeof(user),bufz,' ')<0){
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+              squid_log=1;
+              }
         } else if(!isalog) {
-          getword(data,bufz,' ');
-          getword(hora,bufz,' ');
-          getword(user,bufz,' ');
-          getword(ip,bufz,' ');
-          getword(url,bufz,' ');
-          getword(tam,bufz,' ');
-          getword(code,bufz,' ');
-          getword(elap,bufz,' ');
-          getword(smartfilter,bufz,' ');
+              if (getword(data,sizeof(data),bufz,' ')<0){
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword(hora,sizeof(hora),bufz,' ')<0) {
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword(user,sizeof(user),bufz,' ')<0) {
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword(ip,sizeof(ip),bufz,' ')<0) {
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword(url,sizeof(url),bufz,' ')<0){
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword(tam,sizeof(tam),bufz,' ')<0){
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword(code,sizeof(code),bufz,' ')<0){
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword(elap,sizeof(elap),bufz,' ')<0){
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword(smartfilter,sizeof(smartfilter),bufz,' ')<0){
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
         } else if(isalog) {
            if(!i0) {
-              getword(val1,bufz,' ');
+              if (getword(val1,sizeof(val1),bufz,' ')<0){
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
               while(strstr(bufz,"\t") != 0) {
-                 getword(val1,bufz,'\t');
+                 if (getword(val1,sizeof(val1),bufz,'\t')<0){
+                    printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                    exit(1);
+                 }
                  i0++;
                  if(strcmp(val1,"c-ip") == 0) i1=i0;
                  if(strcmp(val1,"cs-username") == 0) i2=i0;
@@ -916,28 +1001,74 @@ int main(argc,argv)
            }
            fgets(bufz,sizeof(bufz),fp_in);
            strcpy(val1,bufz);
-           for(x=0; x<=i1-1; x++) getword3(ip,val1,'\t');
+           for(x=0; x<=i1-1; x++) {
+              if (getword3(ip,sizeof(ip),val1,'\t')<0) {
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+           }
            strcpy(val1,bufz);
-           for(x=0; x<=i2-1; x++) getword3(user,val1,'\t');
+           for(x=0; x<=i2-1; x++) {
+              if (getword3(user,sizeof(user),val1,'\t')<0) {
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+           }
            strcpy(val1,bufz);
-           for(x=0; x<=i3-1; x++) getword3(data,val1,'\t');
+           for(x=0; x<=i3-1; x++) {
+              if (getword3(data,sizeof(data),val1,'\t')<0) {
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+           }
            strcpy(val1,bufz);
-           for(x=0; x<=i4-1; x++) getword3(hora,val1,'\t');
+           for(x=0; x<=i4-1; x++) {
+              if (getword3(hora,sizeof(hora),val1,'\t')<0) {
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+           }
            strcpy(val1,bufz);
-           for(x=0; x<=i5-1; x++) getword3(elap,val1,'\t');
+           for(x=0; x<=i5-1; x++) {
+              if (getword3(elap,sizeof(elap),val1,'\t')<0) {
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+           }
            strcpy(val1,bufz);
-           for(x=0; x<=i6-1; x++) getword3(tam,val1,'\t');
+           for(x=0; x<=i6-1; x++) {
+              if (getword3(tam,sizeof(tam),val1,'\t')<0) {
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+           }
            strcpy(val1,bufz);
-           for(x=0; x<=i7-1; x++) getword3(url,val1,'\t');
+           for(x=0; x<=i7-1; x++) {
+              if (getword3(url,sizeof(url),val1,'\t')<0) {
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+           }
            strcpy(val1,bufz);
-           for(x=0; x<=i8-1; x++) getword3(code,val1,'\t');
+           for(x=0; x<=i8-1; x++) {
+              if (getword3(code,sizeof(code),val1,'\t')<0) {
+                 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+                 exit(1);
+              }
+           }
            
            if(strcmp(code,"401") == 0 || strcmp(code,"403") == 0 || strcmp(code,"407") == 0) {
               sprintf(val1,"DENIED/%s",code);
               strcpy(code,val1);
            }
-           getword(ano,data,'-');
-           getword(mes,data,'-');
+           if (getword(ano,sizeof(ano),data,'-')<0){
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword(mes,sizeof(mes),data,'-')<0){
+              printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",arq);
+              exit(1);
+           }
            strcpy(dia,data);
            conv_month_name(mes);
            sprintf(data," %s/%s/%s:%s",dia,mes,ano,hora);
@@ -966,12 +1097,18 @@ int main(argc,argv)
           continue;
 
         if(strstr(user,"%20") != 0) {
-           getword(w,user,'%');
+           if (getword(w,sizeof(w),user,'%')<0) {
+              printf("SARG: Maybe you have a broken user in your %s file.\n",arq);
+              exit(1);
+           }
            strcpy(user,w);
         }
 
         while(strstr(user,"%5c") != 0) {
-           getword(w,user,'%');
+           if (getword_multisep(w,sizeof(w),user,'%')<0){
+              printf("SARG: Maybe you have a broken user in your %s file.\n",arq);
+              exit(1);
+           }
            strcpy(wuser,user+2);
            sprintf(user,"%s.%s",w,wuser);
         }
@@ -988,9 +1125,15 @@ int main(argc,argv)
         strlow(user);
         if(strncmp(NtlmUserFormat,"user",4) == 0) {
            if(strstr(user,"_") != 0)
-              getword(warea,user,'_');  
+              if (getword_multisep(warea,sizeof(warea),user,'_')<0){
+                 printf("SARG: Maybe you have a broken user in your %s file.\n",arq);
+                 exit(1);
+              }
            if(strstr(user,"+") != 0)
-              getword(warea,user,'+');  
+              if (getword_multisep(warea,sizeof(warea),user,'+')<0){
+                 printf("SARG: Maybe you have a broken user in your %s file.\n",arq);
+                 exit(1);
+              }
         }
 
         if(strstr(ReportType,"denied") != 0)
@@ -1010,19 +1153,31 @@ int main(argc,argv)
         }
          
         if (strchr(url,'/')) {
-           getword(w,url,'/');
-           getword(w,url,'/');
-          if (!strchr(url,'/')) {
+           if (getword(w,sizeof(w),url,'/')<0){
+              printf("SARG: Maybe you have a broken url in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword(w,sizeof(w),url,'/')<0){
+              printf("SARG: Maybe you have a broken url in your %s file.\n",arq);
+              exit(1);
+           }
+           if (!strchr(url,'/')) {
               totregsx++;
               continue;
           }
         }
 
         if(strcmp(LongUrl,"no") == 0) {
-           getword(w,url,'/');
+           if (getword_multisep(w,sizeof(w),url,'/')<0){
+              printf("SARG: Maybe you have a broken url in your %s file.\n",arq);
+              exit(1);
+           }
            strcpy(url,w);
            if(strlen(url) > 512 && strstr(url,"%") != 0) {
-              getword(w,url,'%');
+              if (getword_multisep(w,sizeof(w),url,'%')<0){
+                 printf("SARG: Maybe you have a broken url in your %s file.\n",arq);
+                 exit(1);
+              }
               strcpy(url,w);
            }
         }
@@ -1050,13 +1205,28 @@ int main(argc,argv)
               if(strncmp(df,"u",1)==0)
                  strftime(dia, 127, "%m/%d/%Y", t);
               sprintf(hora,"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);
-           } else {
-             strcpy(wtemp,data+1);
-             getword(data,wtemp,':');
-             getword(hora,wtemp,' ');
-             getword(dia,data,'/');
-             getword(mes,data,'/');
-             getword(ano,data,'/');
+              } else {
+                 strcpy(wtemp,data+1);
+                 if (getword_multisep(data,sizeof(data),wtemp,':')<0){
+                 printf("SARG: Maybe you have a broken date in your %s file.\n",arq);
+                 exit(1);
+              }
+              if (getword_multisep(hora,sizeof(hora),wtemp,' ')<0){
+                 printf("SARG: Maybe you have a broken date in your %s file.\n",arq);
+                 exit(1);
+              }
+              if (getword_multisep(dia,sizeof(dia),data,'/')<0){
+                 printf("SARG: Maybe you have a broken date in your %s file.\n",arq);
+                 exit(1);
+              }
+              if (getword_multisep(mes,sizeof(mes),data,'/')<0){
+                 printf("SARG: Maybe you have a broken date in your %s file.\n",arq);
+                 exit(1);
+              }
+              if (getword_multisep(ano,sizeof(ano),data,'/')<0){
+                 printf("SARG: Maybe you have a broken date in your %s file.\n",arq);
+                 exit(1);
+              }
 
               if(strcmp(df,"u") == 0)
                 sprintf(tbuf,"%s%s%s",ano,mes,dia);
@@ -1066,9 +1236,18 @@ int main(argc,argv)
               idata=atoi(wdata);
           }
         } else {
-          getword(mes,data,'/');
-          getword(dia,data,'/');
-          strcpy(ano,data);
+              if (getword_multisep(mes,sizeof(mes),data,'/')<0){
+              printf("SARG: Maybe you have a broken date in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword_multisep(dia,sizeof(dia),data,'/')<0){
+              printf("SARG: Maybe you have a broken date in your %s file.\n",arq);
+              exit(1);
+           }
+           if (getword_multisep(ano,sizeof(ano),data,0)<0){
+              printf("SARG: Maybe you have a broken date in your %s file.\n",arq);
+              exit(1);
+           }
         }
 
         if(debugm)
@@ -1105,7 +1284,10 @@ int main(argc,argv)
               bzero(hmr,15);
               chm++;
               while(chm) {
-                 getword(warea,whm,':');
+                 if (getword_multisep(warea,sizeof(warea),whm,':')<0){
+                    printf("SARG: Maybe you have a broken time in your %s file.\n",arq);
+                    exit(1);
+                 }
                  strncat(hmr,warea,2);
                  chm--;
               }
@@ -1370,8 +1552,14 @@ int main(argc,argv)
    if(strcmp(ParsedOutputLog, "no") != 0 && !sarglog) {
       fclose(fp_log); 
       strcpy(val1,period);
-      getword(val2,val1,'-');
-      getword(val3,per_hour,'-');
+      if (getword_multisep(val2,sizeof(val2),val1,'-')<0){
+         printf("SARG: Maybe you have a broken date range definition.\n");
+         exit(1);
+      }
+      if (getword_multisep(val3,sizeof(val3),per_hour,'-')<0){
+         printf("SARG: Maybe you have a broken date range definition.\n");
+         exit(1);
+      }
       sprintf(val4,"%s/sarg-%s_%s-%s_%s.log",ParsedOutputLog,val2,val3,val1,per_hour);
       rename(arq_log,val4);
       strcpy(arq_log,val4);
@@ -1463,7 +1651,10 @@ void getusers(char *pwdfile, int debug)
    sprintf(userfile,":");
 
    while(fgets(buf,255,fp_usr)!=NULL) {
-     getword(user,buf,':');
+     if (getword_multisep(user,sizeof(user),buf,':')<0){
+        printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",pwdfile);
+        exit(1);
+     }
      strncat(userfile,user,strlen(user));
      strncat(userfile,":",1);
    }