From d26d67f5d679e1a887ff064c865c249cff7a33e1 Mon Sep 17 00:00:00 2001 From: Bernd Hufmann Date: Fri, 25 Sep 2015 15:55:43 -0400 Subject: [PATCH] tmf: Bug 478578: Add weak binary validation to text trace types Change-Id: I0e693ff8f03907b7b3fc4c2f2dafcf547c2db698 Signed-off-by: Bernd Hufmann Reviewed-on: https://git.eclipse.org/r/56936 Reviewed-by: Matthew Khouzam Tested-by: Matthew Khouzam Reviewed-by: Hudson CI --- .../tracecompass/btf/core/trace/BtfTrace.java | 9 +++++ .../core/parsers/custom/CustomTxtTrace.java | 10 ++++++ .../core/parsers/custom/CustomXmlTrace.java | 9 +++++ .../tmf/core/trace/TmfTraceUtils.java | 34 +++++++++++++++++++ .../tmf/core/trace/text/TextTrace.java | 9 +++++ 5 files changed, 71 insertions(+) diff --git a/btf/org.eclipse.tracecompass.btf.core/src/org/eclipse/tracecompass/btf/core/trace/BtfTrace.java b/btf/org.eclipse.tracecompass.btf.core/src/org/eclipse/tracecompass/btf/core/trace/BtfTrace.java index bffcbe1059..1dc22f6f4e 100644 --- a/btf/org.eclipse.tracecompass.btf.core/src/org/eclipse/tracecompass/btf/core/trace/BtfTrace.java +++ b/btf/org.eclipse.tracecompass.btf.core/src/org/eclipse/tracecompass/btf/core/trace/BtfTrace.java @@ -43,6 +43,7 @@ import org.eclipse.tracecompass.tmf.core.trace.ITmfContext; import org.eclipse.tracecompass.tmf.core.trace.ITmfTraceProperties; import org.eclipse.tracecompass.tmf.core.trace.TmfContext; import org.eclipse.tracecompass.tmf.core.trace.TmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.core.trace.TraceValidationStatus; import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfPersistentlyIndexable; import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfTraceIndexer; @@ -227,6 +228,14 @@ public class BtfTrace extends TmfTrace implements ITmfPersistentlyIndexable, ITm return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Not a file. It's a directory: " + path); //$NON-NLS-1$ } int confidence = 0; + try { + if (!TmfTraceUtils.isText(file)) { + return new TraceValidationStatus(confidence, Activator.PLUGIN_ID); + } + } catch (IOException e) { + Activator.logError("Error validating file: " + path, e); //$NON-NLS-1$ + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "IOException validating file: " + path, e); //$NON-NLS-1$ + } try (BufferedRandomAccessFile rafile = new BufferedRandomAccessFile(path, "r")) { //$NON-NLS-1$ int lineCount = 0; int matches = 0; diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomTxtTrace.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomTxtTrace.java index 3c85eeb37a..cf57aa41ff 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomTxtTrace.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomTxtTrace.java @@ -39,6 +39,7 @@ import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp; import org.eclipse.tracecompass.tmf.core.trace.ITmfContext; import org.eclipse.tracecompass.tmf.core.trace.TmfContext; import org.eclipse.tracecompass.tmf.core.trace.TmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.core.trace.TraceValidationStatus; import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfPersistentlyIndexable; import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfTraceIndexer; @@ -428,10 +429,19 @@ public class CustomTxtTrace extends TmfTrace implements ITmfPersistentlyIndexabl return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.CustomTrace_FileNotFound + ": " + path); //$NON-NLS-1$ } int confidence = 0; + try { + if (!TmfTraceUtils.isText(file)) { + return new TraceValidationStatus(confidence, Activator.PLUGIN_ID); + } + } catch (IOException e) { + Activator.logError("Error validating file: " + path, e); //$NON-NLS-1$ + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "IOException validating file: " + path, e); //$NON-NLS-1$ + } try (BufferedRandomAccessFile rafile = new BufferedRandomAccessFile(path, "r")) { //$NON-NLS-1$ int lineCount = 0; double matches = 0.0; String line = rafile.getNextLine(); + while ((line != null) && (lineCount++ < MAX_LINES)) { for (InputLine inputLine : fDefinition.inputs) { Matcher matcher = inputLine.getPattern().matcher(line); diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomXmlTrace.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomXmlTrace.java index 7da703416d..bf3aa66822 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomXmlTrace.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/parsers/custom/CustomXmlTrace.java @@ -38,6 +38,7 @@ import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp; import org.eclipse.tracecompass.tmf.core.trace.ITmfContext; import org.eclipse.tracecompass.tmf.core.trace.TmfContext; import org.eclipse.tracecompass.tmf.core.trace.TmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.core.trace.TraceValidationStatus; import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfPersistentlyIndexable; import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfTraceIndexer; @@ -546,6 +547,14 @@ public class CustomXmlTrace extends TmfTrace implements ITmfPersistentlyIndexabl if (!file.exists() || !file.isFile() || !file.canRead()) { return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.CustomTrace_FileNotFound + ": " + path); //$NON-NLS-1$ } + try { + if (!TmfTraceUtils.isText(file)) { + return new TraceValidationStatus(0, Activator.PLUGIN_ID); + } + } catch (IOException e) { + Activator.logError("Error validating file: " + path, e); //$NON-NLS-1$ + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "IOException validating file: " + path, e); //$NON-NLS-1$ + } try (BufferedRandomAccessFile rafile = new BufferedRandomAccessFile(path, "r")) { //$NON-NLS-1$ int lineCount = 0; long rawPos = 0; diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java index 3f810d9603..fc8baad479 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java @@ -12,6 +12,10 @@ package org.eclipse.tracecompass.tmf.core.trace; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.util.HashSet; import java.util.Set; @@ -29,6 +33,8 @@ import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect; @NonNullByDefault public final class TmfTraceUtils { + private static final int MAX_NB_BINARY_BYTES = 2048; + private TmfTraceUtils() { } @@ -105,4 +111,32 @@ public final class TmfTraceUtils { } return null; } + + /** + * Checks for text file. + * + * Note that it checks for binary value 0 in the first MAX_NB_BINARY_BYTES + * bytes to determine if the file is text. + * + * @param file + * the file to check. Caller has to make sure that file exists. + * @return true if it is binary else false + * @throws IOException + * if IOException occurs + * @since 2.0 + */ + public static boolean isText(File file) throws IOException { + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file))) { + int count = 0; + int val = bufferedInputStream.read(); + while ((count < MAX_NB_BINARY_BYTES) && (val >= 0)) { + if (val == 0) { + return false; + } + count++; + val = bufferedInputStream.read(); + } + } + return true; + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTrace.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTrace.java index 0fe75752d7..1e41e06688 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTrace.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/text/TextTrace.java @@ -33,6 +33,7 @@ import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp; import org.eclipse.tracecompass.tmf.core.trace.ITmfContext; import org.eclipse.tracecompass.tmf.core.trace.TmfTrace; +import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; import org.eclipse.tracecompass.tmf.core.trace.TraceValidationStatus; import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfPersistentlyIndexable; import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfTraceIndexer; @@ -87,6 +88,14 @@ public abstract class TextTrace extends TmfTrace imple if (!file.isFile()) { return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Not a file. It's a directory: " + path); //$NON-NLS-1$ } + try { + if (!TmfTraceUtils.isText(file)) { + return new TraceValidationStatus(0, Activator.PLUGIN_ID); + } + } catch (IOException e) { + Activator.logError("Error validating file: " + path, e); //$NON-NLS-1$ + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "IOException validating file: " + path, e); //$NON-NLS-1$ + } int confidence = 0; try (BufferedRandomAccessFile rafile = new BufferedRandomAccessFile(path, "r")) { //$NON-NLS-1$ int lineCount = 0; -- 2.34.1