From 7b3400bd1c99cfd700b342a3563bd04ce6d5156e Mon Sep 17 00:00:00 2001 From: Patrick Tasse Date: Thu, 2 Jun 2016 17:10:00 -0400 Subject: [PATCH] tmf: Bug 495219: Fix NPE in checkpoint indexer seeking on disposed trace In BTree, if it is disposed (file is null), return -1 (insertion point 0) in the binary search. This will correspond to checkpoint 0 in the flat array. In FlatArray, if it is disposed (file is null) return null as checkpoint in get(long). In TmfCheckpointIndexer, if the returned checkpoint is null in restoreCheckpoint(long), return the context given by the trace implementation of seekEvent((ITmfLocation) null). It should properly handle a disposed trace. Change-Id: I3148d2e10118628e387d206054de55d5238a9807 Signed-off-by: Patrick Tasse Reviewed-on: https://git.eclipse.org/r/74474 Reviewed-by: Hudson CI Reviewed-by: Matthew Khouzam Tested-by: Matthew Khouzam Reviewed-by: Marc-Andre Laperle Tested-by: Marc-Andre Laperle --- .../tracecompass/internal/tmf/core/trace/indexer/BTree.java | 4 ++-- .../internal/tmf/core/trace/indexer/FlatArray.java | 5 ++++- .../core/trace/indexer/checkpoint/TmfCheckpointIndexer.java | 5 ++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/trace/indexer/BTree.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/trace/indexer/BTree.java index 32ae555876..e3a1ad1abc 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/trace/indexer/BTree.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/trace/indexer/BTree.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013, 2014 Ericsson + * Copyright (c) 2013, 2016 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -290,7 +290,7 @@ public class BTree extends AbstractFileCheckpointCollection { private void accept(long nodeOffset, IBTreeVisitor visitor) { - if (nodeOffset == BTreeNode.NULL_CHILD) { + if (nodeOffset == BTreeNode.NULL_CHILD || getRandomAccessFile() == null) { return; } diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/trace/indexer/FlatArray.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/trace/indexer/FlatArray.java index a404a2c9ab..4df395d7db 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/trace/indexer/FlatArray.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/tmf/core/trace/indexer/FlatArray.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013, 2014 Ericsson + * Copyright (c) 2013, 2016 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -90,6 +90,9 @@ public class FlatArray extends AbstractFileCheckpointCollection { ITmfCheckpoint checkpoint = null; try { long pos = getHeader().getSize() + fCheckpointSize * rank; + if (getRandomAccessFile() == null) { + return null; + } getRandomAccessFile().seek(pos); fByteBuffer.clear(); getRandomAccessFile().read(fByteBuffer.array()); diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/indexer/checkpoint/TmfCheckpointIndexer.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/indexer/checkpoint/TmfCheckpointIndexer.java index 8e806307f1..355f67e041 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/indexer/checkpoint/TmfCheckpointIndexer.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/indexer/checkpoint/TmfCheckpointIndexer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012, 2014 Ericsson + * Copyright (c) 2012, 2016 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -323,6 +323,9 @@ public class TmfCheckpointIndexer implements ITmfTraceIndexer { } ITmfCheckpoint checkpoint = fTraceIndex.get(index); TmfCoreTracer.traceIndexer("Restored checkpoint: " + checkpoint); //$NON-NLS-1$ + if (checkpoint == null) { + return fTrace.seekEvent((ITmfLocation) null); + } location = checkpoint.getLocation(); } } -- 2.34.1