Merge pull request #242 from adam-m/master

Fix bug when free disk space during ingest cannot be detected as is repo...
This commit is contained in:
Brian Carrier 2013-07-28 17:07:14 -07:00
commit c3466906c0
2 changed files with 27 additions and 7 deletions

View File

@ -43,6 +43,7 @@ public class IngestMonitor {
private Timer timer; private Timer timer;
private static final java.util.logging.Logger MONITOR_LOGGER = java.util.logging.Logger.getLogger("monitor"); private static final java.util.logging.Logger MONITOR_LOGGER = java.util.logging.Logger.getLogger("monitor");
private MonitorAction monitor; private MonitorAction monitor;
public static final int DISK_FREE_SPACE_UNKNOWN = -1;
IngestMonitor() { IngestMonitor() {
@ -101,7 +102,7 @@ public class IngestMonitor {
return monitor.getFreeSpace(); return monitor.getFreeSpace();
} catch (SecurityException e) { } catch (SecurityException e) {
logger.log(Level.WARNING, "Error checking for free disk space on ingest data drive", e); logger.log(Level.WARNING, "Error checking for free disk space on ingest data drive", e);
return -1; return DISK_FREE_SPACE_UNKNOWN;
} }
} }
@ -109,7 +110,7 @@ public class IngestMonitor {
private class MonitorAction implements ActionListener { private class MonitorAction implements ActionListener {
private final static long MIN_FREE_DISK_SPACE = 100L * 1024 * 1024; //100MB private final static long MIN_FREE_DISK_SPACE = 100L * 1024 * 1024; //100MB
private File root = new File(File.separator); //default, roto dir where autopsy runs private File root = new File(File.separator); //default, root dir where autopsy runs
MonitorAction() { MonitorAction() {
//find drive where case is located //find drive where case is located
@ -170,12 +171,25 @@ public class IngestMonitor {
} }
/** /**
* Get free space in bytes of the drive where case dir resides * Get free space in bytes of the drive where case dir resides, or -1 if
* unknown
* *
* @return free space in bytes * @return free space in bytes
*/ */
private long getFreeSpace() throws SecurityException { private long getFreeSpace() throws SecurityException {
return root.getFreeSpace(); final long freeSpace = root.getFreeSpace();
if (freeSpace == 0) {
//check if network drive, some network filesystems always return 0
final String monitoredPath = root.getAbsolutePath();
if (monitoredPath.startsWith("\\\\") || monitoredPath.startsWith("//")) {
return DISK_FREE_SPACE_UNKNOWN;
}
}
return freeSpace;
} }
/** /**
@ -191,9 +205,14 @@ public class IngestMonitor {
logger.log(Level.WARNING, "Unable to check for free disk space (permission issue)", e); logger.log(Level.WARNING, "Unable to check for free disk space (permission issue)", e);
return true; //OK return true; //OK
} }
if (freeSpace == DISK_FREE_SPACE_UNKNOWN) {
return true;
} else {
//logger.log(Level.INFO, "Checking free disk apce: " + freeSpace + " need: " + Long.toString(MIN_FREE_DISK_SPACE)); //logger.log(Level.INFO, "Checking free disk apce: " + freeSpace + " need: " + Long.toString(MIN_FREE_DISK_SPACE));
return freeSpace > MIN_FREE_DISK_SPACE; return freeSpace > MIN_FREE_DISK_SPACE;
} }
}
/** /**
* Monitor memory usage and print to memory log * Monitor memory usage and print to memory log

View File

@ -49,6 +49,7 @@ import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.services.FileManager; import org.sleuthkit.autopsy.casemodule.services.FileManager;
import org.sleuthkit.autopsy.ingest.PipelineContext; import org.sleuthkit.autopsy.ingest.PipelineContext;
import org.sleuthkit.autopsy.ingest.IngestMessage; import org.sleuthkit.autopsy.ingest.IngestMessage;
import org.sleuthkit.autopsy.ingest.IngestMonitor;
import org.sleuthkit.autopsy.ingest.ModuleContentEvent; import org.sleuthkit.autopsy.ingest.ModuleContentEvent;
import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
@ -426,7 +427,7 @@ public final class SevenZipIngestModule extends IngestModuleAbstractFile {
//check if unpacking this file will result in out of disk space //check if unpacking this file will result in out of disk space
//this is additional to zip bomb prevention mechanism //this is additional to zip bomb prevention mechanism
if (freeDiskSpace != -1 && size > 0) { //if known free space and file not empty if (freeDiskSpace != IngestMonitor.DISK_FREE_SPACE_UNKNOWN && size > 0) { //if known free space and file not empty
long newDiskSpace = freeDiskSpace - size; long newDiskSpace = freeDiskSpace - size;
if (newDiskSpace < MIN_FREE_DISK_SPACE) { if (newDiskSpace < MIN_FREE_DISK_SPACE) {
String msg = "Not enough disk space to unpack archive item: " + archiveFile.getName() + ", " + fileName; String msg = "Not enough disk space to unpack archive item: " + archiveFile.getName() + ", " + fileName;