diff --git a/tsk/fs/iso9660.c b/tsk/fs/iso9660.c
index 7dce80237c2e676d14212fa36f43c4cc3f74f899..66735b942725c2a870c0a5ab667e506524a8e102 100644
--- a/tsk/fs/iso9660.c
+++ b/tsk/fs/iso9660.c
@@ -507,6 +507,7 @@ iso9660_load_inodes_dir(TSK_FS_INFO * fs, TSK_OFF_T a_offs, int count,
                     tsk_error_set_errno(TSK_ERR_FS_ARG);
                     tsk_error_set_errstr
                         ("iso9660_load_inodes_dir: Name argument specified is too long");
+                    free(in_node);
                     return -1;
                 }
                 strncpy(in_node->inode.fn, a_fn, ISO9660_MAXNAMLEN_STD + 1);
@@ -616,6 +617,7 @@ iso9660_load_inodes_dir(TSK_FS_INFO * fs, TSK_OFF_T a_offs, int count,
                     if (tsk_verbose)
                         tsk_fprintf(stderr,
                                     "iso9660_load_inodes_dir: length of name after processing is 0. bailing\n");
+                    free(in_node);
                     break;
                     
                 }
@@ -634,6 +636,7 @@ iso9660_load_inodes_dir(TSK_FS_INFO * fs, TSK_OFF_T a_offs, int count,
                     tsk_fprintf(stderr,
                                 "iso9660_load_inodes_dir: file starts past end of image (%"PRIu32"). bailing\n",
                                 tsk_getu32(fs->endian, dentry->ext_loc_m));
+                free(in_node);
                 break;
             }
             in_node->offset =
@@ -644,6 +647,7 @@ iso9660_load_inodes_dir(TSK_FS_INFO * fs, TSK_OFF_T a_offs, int count,
                     tsk_fprintf(stderr,
                                 "iso9660_load_inodes_dir: file ends past end of image (%"PRIu32" bytes). bailing\n",
                                 tsk_getu32(fs->endian, in_node->inode.dr.data_len_m) + in_node->offset);
+                free(in_node);
                 break;
             }
             /* record size to make sure fifos show up as unique files */
@@ -676,6 +680,7 @@ iso9660_load_inodes_dir(TSK_FS_INFO * fs, TSK_OFF_T a_offs, int count,
                     if (tsk_verbose)
                         tsk_fprintf(stderr,
                                     "iso9660_load_inodes_dir: parse_susp returned error (%s). bailing\n", tsk_error_get());
+                    free(in_node);
                     break;
                 }
                 
@@ -1141,6 +1146,15 @@ iso9660_close(TSK_FS_INFO * fs)
         free(s);
     }
 
+    while (iso->in_list != NULL) {
+        iso9660_inode_node *in = iso->in_list;
+        iso->in_list = iso->in_list->next;
+        if (in->inode.rr != NULL) {
+            free(in->inode.rr);
+        }
+        free(in);
+    }
+
     tsk_fs_free(fs);
 }