From 5802fb0faa775bace54ac4b25eca80f9800b7eda Mon Sep 17 00:00:00 2001
From: apriestman <apriestman@basistech.com>
Date: Tue, 2 Mar 2021 09:38:35 -0500
Subject: [PATCH] Only hold controllersByCaseLock when using controllersByCase.
 Prevent NPE in DrawableFile.

---
 .../imagegallery/ImageGalleryController.java    |  7 +++++--
 .../imagegallery/datamodel/DrawableFile.java    | 17 +++++++++++++++--
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java
index 2f13a48fd2..d2c9ac5b36 100644
--- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java
+++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java
@@ -192,12 +192,15 @@ public static ImageGalleryController getController(Case theCase) {
      * @param theCase The case.
      */
     static void shutDownController(Case theCase) {
+        ImageGalleryController controller = null;
         synchronized (controllersByCaseLock) {
             if (controllersByCase.containsKey(theCase.getName())) {
-                ImageGalleryController controller = controllersByCase.remove(theCase.getName());
-                controller.shutDown();
+                controller = controllersByCase.remove(theCase.getName());
             }
         }
+        if (controller != null) {
+            controller.shutDown();
+        }
     }
 
     /**
diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java
index 112c7ab6ec..534bdfc8c8 100644
--- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java
+++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableFile.java
@@ -105,8 +105,15 @@ public static DrawableFile create(Long fileID, boolean analyzed) throws TskCoreE
     protected DrawableFile(AbstractFile file, Boolean analyzed) {
         this.analyzed = new SimpleBooleanProperty(analyzed);
         this.file = file;
-
-        categoryManager = ImageGalleryController.getController(Case.getCurrentCase()).getCategoryManager();
+  
+        ImageGalleryController controllerForCase = ImageGalleryController.getController(Case.getCurrentCase());
+        if (controllerForCase != null) {
+            categoryManager = ImageGalleryController.getController(Case.getCurrentCase()).getCategoryManager();
+        } else {
+            // If getting the controller fails it means the case is currently closing. No need to 
+            // print an error.
+            categoryManager = null;
+        }
     }
 
     public abstract boolean isVideo();
@@ -246,6 +253,12 @@ public SimpleObjectProperty<TagName> categoryProperty() {
      * Update the category property.
      */
     private void updateCategory() {
+        // This only happens when a DrawableFile is created while the case is closing. No need
+        // to display the error message.
+        if (categoryManager == null) {
+            return;
+        }
+        
         try {
             List<ContentTag> contentTags = getContentTags();
             TagName tag = null;
-- 
GitLab