java/src/org/openantivirus/engine/credo StringsParser.java,1.6,1.7

Kurt Huwig <[email protected]> Sat, 22 May 2004 12:22:29 +0000
Newsgroups gmane.comp.security.virus.openantivirus.cvs
Message-ID <[email protected]>
Update of /cvsroot/openantivirus/java/src/org/openantivirus/engine/credo
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9747/src/org/openantivirus/engine/credo

Modified Files:
	StringsParser.java 
Log Message:
Bugfix: some patterns were not detected due to bad optimizing
Speed improvements on multipart patterns

Index: StringsParser.java
===================================================================
RCS file: /cvsroot/openantivirus/java/src/org/openantivirus/engine/credo/StringsParser.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- StringsParser.java	20 May 2004 13:19:45 -0000	1.6
+++ StringsParser.java	22 May 2004 12:22:26 -0000	1.7
@@ -27,7 +27,6 @@
 package org.openantivirus.engine.credo;
 
 import java.io.*;
-import java.util.*;
 
 import org.openantivirus.engine.censor.*;
 
@@ -51,51 +50,47 @@
         final BufferedReader br = new BufferedReader(patternReader);
         String sLine;
         while ((sLine = br.readLine()) != null) {
-            int equalsPos = sLine.indexOf('=');
-            if (equalsPos == -1) {
-                System.err.println("Malformed pattern line: " + sLine);
-                continue;
-            }
-            
-            final int offsetStart = sLine.lastIndexOf('[');
-            final String sVirusName =
-                new String(sLine.substring(0, offsetStart));
-            final String sPattern   = sLine.substring(equalsPos + 1);
-            
-            try {
-                if (sPattern.indexOf('*') != -1) {
-                    final StringTokenizer stOffsets = new StringTokenizer(
-                            sLine.substring(offsetStart + 1, equalsPos - 1),
-                            "*");
-                    
-                    final int partCount = stOffsets.countTokens();
-                    int part = 0;
-                    for (StringTokenizer stPatterns = new StringTokenizer(
-                            sPattern, "*");
-                         stPatterns.hasMoreTokens();
-                         part++) {
-                        stringFinder.addString(
-                                new WildcardPattern(stPatterns.nextToken()),
-                                Integer.parseInt(stOffsets.nextToken()),
-                                new StringPartFoundListener(sVirusName,
-                                                            part,
-                                                            partCount));
-                    }
-                } else {
-                    stringFinder.addString(
+            parseLine(sLine);
+        }
+        // br may not be closed!
+    }
+    
+    private void parseLine(String line) {
+        final int equalsPos = line.indexOf('=');
+        if (equalsPos == -1) {
+            System.err.println("Malformed pattern line: " + line);
+            return;
+        }
+        
+        final int offsetStart = line.lastIndexOf('[');
+        final String sPattern = line.substring(equalsPos + 1);
+        final PositionFoundListener pfl = new StringFoundListener(
+                new String(line.substring(0, offsetStart)));
+        
+        try {
+            if (sPattern.indexOf('*') != -1) {
+                stringFinder.addMultipartString(
+                        sPattern,
+                        line.substring(offsetStart + 1, equalsPos - 1),
+                        pfl);
+            } else {
+                final int offset = Integer.parseInt(
+                        line.substring(offsetStart + 1, equalsPos - 1));
+                if (sPattern.indexOf('?') != -1) {
+                    stringFinder.addWildcardString(
                             new WildcardPattern(sPattern),
-                            Integer.parseInt(
-                                    sLine.substring(offsetStart + 1, equalsPos - 1)),
-                            new StringFoundListener(sVirusName));
+                            offset,
+                            pfl);
+                } else {
+                    stringFinder.addString(sPattern, offset, pfl);
                 }
-            } catch (Exception e) {
-                System.err.println(sLine);
-                e.printStackTrace();
             }
+        } catch (Exception e) {
+            System.err.println("Malformed pattern line: " + line);
+            e.printStackTrace();
         }
-        // br may not be closed!
     }
-    
+
     private static class StringFoundListener implements PositionFoundListener {
         private final String virusName;
         
@@ -109,43 +104,4 @@
         }
     }
     
-    private static class StringPartFoundListener
-    implements PositionFoundListener {
-        private static final Integer ZERO = new Integer(0);
-        
-        private final String virusName;
-        private final int part, partCount;
-
-        public StringPartFoundListener(String virusName,
-                                       int part,
-                                       int partCount) {
-            this.virusName = virusName;
-            this.part = part;
-            this.partCount = partCount;
-        }
-
-        public void positionFound(PositionFoundEvent pfe)
-        throws MalwareFoundException {
-            final Integer foundPart =
-                (Integer) pfe.entry.attributes.get(virusName);
-            
-            if (foundPart == null) {
-                if (part != 0) {
-                    return;
-                } else {
-                    pfe.entry.attributes.put(virusName, ZERO);
-                }
-            } else {
-                if (foundPart.intValue() == part - 1) {
-                    if (part == partCount - 1) {
-                        throw new MalwareFoundException(virusName, pfe.entry);
-                    } else {
-                        pfe.entry.attributes.put(virusName, new Integer(part));
-                    }
-                }
-            }
-            
-            
-        }
-    }
 }



-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g. 
Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click