From 805bb381d73c1eeb3c3da7bf2597f63ea7af2989 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 14 Apr 2017 15:59:46 -0400 Subject: [PATCH 1/3] 2453 prevent possible hang from cancelling add image inhumanly fast --- .../autopsy/casemodule/AddImageTask.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java index 05668a5087..6b6fa63e35 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java @@ -61,7 +61,7 @@ class AddImageTask implements Runnable { * TODO (AUT-2021): Merge SleuthkitJNI.AddImageProcess and AddImageTask */ private final Object tskAddImageProcessLock; - private boolean tskAddImageProcessStopped; + volatile private boolean tskAddImageProcessStopped; private SleuthkitJNI.CaseDbHandle.AddImageProcess tskAddImageProcess; /** @@ -77,8 +77,9 @@ class AddImageTask implements Runnable { * java.util.TimeZone.getID. * @param ignoreFatOrphanFiles Whether to parse orphans if the image has a * FAT filesystem. - * @param imageWriterPath Path that a copy of the image should be written to. - * Use empty string to disable image writing + * @param imageWriterPath Path that a copy of the image should be + * written to. Use empty string to disable image + * writing * @param progressMonitor Progress monitor to report progress during * processing. * @param callback Callback to call when processing is done. @@ -104,7 +105,7 @@ class AddImageTask implements Runnable { progressMonitor.setProgress(0); Case currentCase = Case.getCurrentCase(); String imageWriterPath = ""; - if(imageWriterSettings != null){ + if (imageWriterSettings != null) { imageWriterPath = imageWriterSettings.getPath(); } List errorMessages = new ArrayList<>(); @@ -112,8 +113,12 @@ class AddImageTask implements Runnable { try { currentCase.getSleuthkitCase().acquireExclusiveLock(); synchronized (tskAddImageProcessLock) { - tskAddImageProcess = currentCase.getSleuthkitCase().makeAddImageProcess(timeZone, true, - ignoreFatOrphanFiles, imageWriterPath); + if (!tskAddImageProcessStopped) { //if we have already cancelled don't bother making an addImageProcess + tskAddImageProcess = currentCase.getSleuthkitCase().makeAddImageProcess(timeZone, true, + ignoreFatOrphanFiles, imageWriterPath); + } else { + return; //we have already cancelled so we do not want to add the image, returning will execute the finally block + } } Thread progressUpdateThread = new Thread(new ProgressUpdater(progressMonitor, tskAddImageProcess)); progressUpdateThread.start(); @@ -142,6 +147,7 @@ class AddImageTask implements Runnable { */ public void cancelTask() { synchronized (tskAddImageProcessLock) { + tskAddImageProcessStopped = true; if (null != tskAddImageProcess) { try { /* @@ -153,7 +159,7 @@ class AddImageTask implements Runnable { * called. */ tskAddImageProcess.stop(); - tskAddImageProcessStopped = true; + } catch (TskCoreException ex) { logger.log(Level.SEVERE, String.format("Error cancelling adding image %s to the case database", imagePath), ex); //NON-NLS } @@ -213,13 +219,13 @@ class AddImageTask implements Runnable { if (!verificationError.isEmpty()) { errorMessages.add(verificationError); } - if(imageWriterSettings != null){ - ImageWriterService.createImageWriter(imageId, imageWriterSettings); + if (imageWriterSettings != null) { + ImageWriterService.createImageWriter(imageId, imageWriterSettings); } newDataSources.add(newImage); } else { String errorMessage = String.format("Error commiting adding image %s to the case database, no object id returned", imagePath); //NON-NLS - logger.log(Level.SEVERE, errorMessage); + logger.log(Level.SEVERE, errorMessage); errorMessages.add(errorMessage); criticalErrorOccurred = true; } From a1272ff548e0e47c446d490c49bedec8f7a8e559 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 19 Apr 2017 13:31:19 -0400 Subject: [PATCH 2/3] 2453 remove volatile add GuardedBy annotation for guarded boolean --- Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java index 6b6fa63e35..f667a75825 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageTask.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.casemodule; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; +import javax.annotation.concurrent.GuardedBy; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback.DataSourceProcessorResult; @@ -61,7 +62,9 @@ class AddImageTask implements Runnable { * TODO (AUT-2021): Merge SleuthkitJNI.AddImageProcess and AddImageTask */ private final Object tskAddImageProcessLock; - volatile private boolean tskAddImageProcessStopped; + + @GuardedBy("tskAddImageProcessLock") + private boolean tskAddImageProcessStopped; private SleuthkitJNI.CaseDbHandle.AddImageProcess tskAddImageProcess; /** From ec2c8d6abf05e3c6e1f8755b1d44f8aed97e41e6 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 19 Apr 2017 16:59:19 -0400 Subject: [PATCH 3/3] 2453 added wait cursor while cancelling addImage in case it takes a bit --- .../autopsy/casemodule/AddImageWizardAddingProgressPanel.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressPanel.java index 22a6ee9762..cf206a39d8 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardAddingProgressPanel.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.casemodule; import java.awt.Color; +import java.awt.Cursor; import java.awt.EventQueue; import java.awt.Window; import java.util.ArrayList; @@ -36,6 +37,7 @@ import org.openide.WizardDescriptor; import org.openide.util.HelpCtx; import org.openide.util.Lookup; import org.openide.util.NbBundle; +import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback; import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor; @@ -319,8 +321,10 @@ class AddImageWizardAddingProgressPanel extends ShortcutWizardDescriptorPanel { cleanupTask = addImageAction.new CleanupTask() { @Override void cleanup() throws Exception { + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); cancelDataSourceProcessing(dataSourceId); cancelled = true; + WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } };