diff --git a/tsk/fs/xfs.cpp b/tsk/fs/xfs.cpp
index 90495e3b6625d862793179136884ebd671e0c986..1820e237977068349b7c5a5e6d819e3d9c3abe07 100644
--- a/tsk/fs/xfs.cpp
+++ b/tsk/fs/xfs.cpp
@@ -58,7 +58,6 @@ TSK_FS_META_FLAG_ENUM xfs_inode_getallocflag(XFSFS_INFO * xfsfs, TSK_INUM_T dino
 
     if ((cur_inobt_block = (xfs_inobt_block_t *) tsk_malloc(sizeof(xfs_inobt_block_t))) == NULL)
     {
-        // TODO: free other allocated structures
         return (TSK_FS_META_FLAG_ENUM) NULL;
     }
 
@@ -78,6 +77,7 @@ TSK_FS_META_FLAG_ENUM xfs_inode_getallocflag(XFSFS_INFO * xfsfs, TSK_INUM_T dino
         }
         tsk_error_set_errstr2("xfs_inode_getallocflag: Inode %" PRIuINUM
             ", AGI from block %" PRIuOFF, dino_inum, cur_block_num);
+        free(cur_inobt_block)
         return (TSK_FS_META_FLAG_ENUM) NULL;
     }
 
@@ -102,6 +102,7 @@ TSK_FS_META_FLAG_ENUM xfs_inode_getallocflag(XFSFS_INFO * xfsfs, TSK_INUM_T dino
             }
             tsk_error_set_errstr2("%s: Inode %" PRIuINUM, myname,
                 dino_inum);
+            free(cur_inobt_block);
             return (TSK_FS_META_FLAG_ENUM) NULL;
         }
 
@@ -115,6 +116,7 @@ TSK_FS_META_FLAG_ENUM xfs_inode_getallocflag(XFSFS_INFO * xfsfs, TSK_INUM_T dino
             }
             tsk_error_set_errstr2("%s: Inode %" PRIuINUM, myname,
                 dino_inum);
+            free(cur_inobt_block);
             return (TSK_FS_META_FLAG_ENUM) NULL;
         }
 
@@ -142,6 +144,7 @@ TSK_FS_META_FLAG_ENUM xfs_inode_getallocflag(XFSFS_INFO * xfsfs, TSK_INUM_T dino
                     }
                     tsk_error_set_errstr2("%s: Inode %" PRIuINUM, myname,
                         dino_inum);
+                    free(cur_inobt_block);
                     return (TSK_FS_META_FLAG_ENUM) NULL;
                 }
 
@@ -715,7 +718,7 @@ xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum,
     if ((fs_file->meta =
             tsk_fs_meta_alloc(xfsfs->inode_size)) == NULL)
     {
-        // TODO: free fs_file?
+        tsk_fs_file_close(fs_file);
         return 1;
     }
 
@@ -726,6 +729,8 @@ xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum,
         xfsfs->fs->sb_inodesize >
         sizeof(xfs_dinode) ? xfsfs->fs->sb_inodesize : sizeof(xfs_dinode);
     if ((dino_buf = (xfs_dinode_t *) tsk_malloc(size)) == NULL) {
+        tsk_fs_file_close(fs_file);
+        tsk_fs_meta_close(fs_file->meta);
         return 1;
     }
 
@@ -737,6 +742,7 @@ xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum,
 
         if (xfs_dinode_load(xfsfs, inum, dino_buf)) {
             tsk_fs_file_close(fs_file);
+            tsk_fs_meta_close(fs_file->meta);
             free(dino_buf);
             return 1;
         }
@@ -768,6 +774,7 @@ xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum,
          * to the application.
          */
         if (xfs_dinode_copy(xfsfs, fs_file->meta, inum, dino_buf)) {
+            tsk_fs_meta_close(fs_file->meta);
             tsk_fs_meta_close(fs_file->meta);
             free(dino_buf);
             return 1;
@@ -776,11 +783,13 @@ xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum,
         retval = a_action(fs_file, a_ptr);
         if (retval == TSK_WALK_STOP) {
             tsk_fs_file_close(fs_file);
+            tsk_fs_meta_close(fs_file->meta);
             free(dino_buf);
             return 0;
         }
         else if (retval == TSK_WALK_ERROR) {
             tsk_fs_file_close(fs_file);
+            tsk_fs_meta_close(fs_file->meta);
             free(dino_buf);
             return 1;
         }
@@ -790,6 +799,7 @@ xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum,
      * Cleanup.
      */
     tsk_fs_file_close(fs_file);
+    tsk_fs_meta_close(fs_file->meta);
     free(dino_buf);
 
     return 0;
@@ -856,7 +866,6 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
         }
         tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
         free(agf);
-        tsk_fs_free((TSK_FS_INFO *)xfsfs);
         return (TSK_FS_BLOCK_FLAG_ENUM) NULL;
     }
 
@@ -884,7 +893,10 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
     // agfl is one sector and 4 blocks
     len = (xfsfs->fs->sb_blocksize * 4 + xfsfs->fs->sb_sectsize) * sizeof(xfs_agblock_t);
     if ((agfl = (xfs_agblock_t *) tsk_malloc(len)) == NULL)
+    {
+        free(agf);
         return (TSK_FS_BLOCK_FLAG_ENUM) NULL;
+    }
 
     offset = ag_start_off + (TSK_OFF_T) xfsfs->fs->sb_sectsize * 3;
     len = xfsfs->fs->sb_sectsize;
@@ -894,7 +906,8 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
         {
             // free other structures
             tsk_error_set_errstr2("xfs_block_getflags: sb_sectsize = %" PRId64 " < sizeof(xfs_agfl) = %" PRId64 "", xfsfs->fs->sb_sectsize, sizeof(xfs_agfl));
-            tsk_fs_free((TSK_FS_INFO *)xfsfs);
+            free(agf);
+            free(agfl);
             return (TSK_FS_BLOCK_FLAG_ENUM) NULL;
         }
 
@@ -911,7 +924,7 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
         }
         tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
         free(agf);
-        tsk_fs_free((TSK_FS_INFO *)xfsfs);
+        free(agfl);
         return (TSK_FS_BLOCK_FLAG_ENUM) NULL;
     }
 
@@ -929,7 +942,7 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
         }
         tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
         free(agf);
-        tsk_fs_free((TSK_FS_INFO *)xfsfs);
+        free(agfl);
         return (TSK_FS_BLOCK_FLAG_ENUM) NULL;
     }
 
@@ -937,7 +950,8 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
     {
         if (rel_blk == tsk_getu32(TSK_BIG_ENDIAN, &agfl[cur_key]))
         {
-            // free
+            free(agf);
+            free(agfl);
             return (TSK_FS_BLOCK_FLAG_ENUM) (TSK_FS_BLOCK_FLAG_META | TSK_FS_BLOCK_FLAG_UNALLOC);
         }
     }
@@ -953,7 +967,9 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
         xfs_inode_getallocflag(xfsfs, inode_num, NULL);
     if (inode_flag)
     {
-        // free
+        free(agf);
+        free(agfl);
+        
         if (inode_flag == TSK_FS_META_FLAG_ALLOC)
             return (TSK_FS_BLOCK_FLAG_ENUM) (TSK_FS_BLOCK_FLAG_META | TSK_FS_BLOCK_FLAG_ALLOC);
         else if (inode_flag == TSK_FS_META_FLAG_UNALLOC)
@@ -969,8 +985,8 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
 
     if ((cur_btree_sblock = (xfs_btree_sblock_t *) tsk_malloc(sizeof(xfs_btree_sblock_t))) == NULL)
     {
-        // TODO: free other allocated structures
         free(agf);
+        free(agfl);
         return (TSK_FS_BLOCK_FLAG_ENUM) NULL;
     }
 
@@ -986,7 +1002,8 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
         }
         tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
         free(agf);
-        tsk_fs_free((TSK_FS_INFO *)xfsfs);
+        free(agfl);
+        free(cur_btree_sblock);
         return (TSK_FS_BLOCK_FLAG_ENUM) NULL;
     }
 
@@ -1010,7 +1027,8 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
             }
             tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
             free(agf);
-            tsk_fs_free((TSK_FS_INFO *)xfsfs);
+            free(agfl);
+            free(cur_btree_sblock);
             return (TSK_FS_BLOCK_FLAG_ENUM) NULL;
         }
 
@@ -1025,7 +1043,8 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
             }
             tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
             free(agf);
-            tsk_fs_free((TSK_FS_INFO *)xfsfs);
+            free(agfl);
+            free(cur_btree_sblock);
             return (TSK_FS_BLOCK_FLAG_ENUM) NULL;
         }
 
@@ -1052,7 +1071,8 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
                     }
                     tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
                     free(agf);
-                    tsk_fs_free((TSK_FS_INFO *)xfsfs);
+                    free(agfl);
+                    free(cur_btree_sblock);
                     return (TSK_FS_BLOCK_FLAG_ENUM) NULL;
                 }
 
@@ -1068,6 +1088,7 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
             // The block is not in a free list, means it's allocated
             if (tsk_verbose) { tsk_fprintf(stderr, "didn't find a_addr at level cur_btree_sblock->bb_level = %" PRId64 " \n", cur_btree_sblock->bb_level); }
             free(agf);
+            free(agfl);
             free(cur_btree_sblock);
             return (TSK_FS_BLOCK_FLAG_ENUM) (TSK_FS_BLOCK_FLAG_CONT | TSK_FS_BLOCK_FLAG_ALLOC);
         }
@@ -1092,12 +1113,14 @@ xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr)
             if (tsk_verbose) { tsk_fprintf(stderr, "found at cur_btree_sblock->bb_level = %" PRId64 ", cur_key = %" PRId64 ", recs[cur_key].ar_startblock = %" PRId64 ", recs[cur_key].ar_blockcount = %" PRId64 " \n",
                 cur_btree_sblock->bb_level, cur_key, recs[cur_key].ar_startblock, recs[cur_key].ar_blockcount); }
             free(agf);
+            free(agfl);
             free(cur_btree_sblock);
             return (TSK_FS_BLOCK_FLAG_ENUM) (TSK_FS_BLOCK_FLAG_CONT | TSK_FS_BLOCK_FLAG_UNALLOC);
         }
     }
 
     free(agf);
+    free(agfl);
     free(cur_btree_sblock);
 
     // The block is neither metadata, nor in a free list, therefore it's allocated
@@ -1743,6 +1766,7 @@ parse_dir_block(TSK_FS_INFO *a_fs, TSK_FS_DIR *fs_dir, TSK_FS_META *fs_meta, xfs
                     tsk_error_set_errstr
                     ("xfs_dir_open_meta: Error reading directory contents: %"
                         PRIuINUM "\n", fs_meta->addr);
+                    free(dirbuf);
                     return TSK_COR;
                 }
 
@@ -1759,6 +1783,7 @@ parse_dir_block(TSK_FS_INFO *a_fs, TSK_FS_DIR *fs_dir, TSK_FS_META *fs_meta, xfs
                     tsk_error_set_errstr
                     ("xfs_dir_open_meta: Error reading directory contents: %"
                         PRIuINUM "\n", fs_meta->addr);
+                    free(dirbuf);
                     return TSK_COR;
                 }
 
@@ -1779,10 +1804,12 @@ parse_dir_block(TSK_FS_INFO *a_fs, TSK_FS_DIR *fs_dir, TSK_FS_META *fs_meta, xfs
                         xfs->fs->sb_inodesize >
                         sizeof(xfs_dinode) ? xfs->fs->sb_inodesize : sizeof(xfs_dinode);
                     if ((dino_buf = (xfs_dinode_t *) tsk_malloc(dinodesize)) == NULL) {
+                        free(dirbuf);
                         return TSK_ERR;
                     }
 
                     if (xfs_dinode_load(xfs, fs_name->meta_addr, dino_buf)) {
+                        free(dirbuf);
                         free(dino_buf);
                         return TSK_ERR;
                     }
@@ -1824,7 +1851,8 @@ parse_dir_block(TSK_FS_INFO *a_fs, TSK_FS_DIR *fs_dir, TSK_FS_META *fs_meta, xfs
                 if (tsk_verbose) { tsk_fprintf(stderr, "namelen = %d, fs_name->name = %s, fs_meta->type = %d, fs_name->meta_addr = %" PRId64  " fs_name->flags = \n", data_entry.namelen, fs_name->name, fs_meta->type, fs_name->meta_addr, fs_name->flags); }
 
                 if (tsk_fs_dir_add(fs_dir, fs_name)) {
-                    tsk_fs_name_free(fs_name);
+                    free(dirbuf);
+                    free(dino_buf);
                     return TSK_ERR;
                 }
 
@@ -1867,6 +1895,7 @@ visit_btree_node(TSK_FS_INFO *a_fs, TSK_FS_DIR *fs_dir, TSK_FS_META *fs_meta, xf
                 tsk_error_set_errno(TSK_ERR_FS_READ);
             }
             tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
+            free(cur_bmdr_block);
             return TSK_ERR;
         }
 
@@ -1892,6 +1921,7 @@ visit_btree_node(TSK_FS_INFO *a_fs, TSK_FS_DIR *fs_dir, TSK_FS_META *fs_meta, xf
                 tsk_error_set_errno(TSK_ERR_FS_READ);
             }
             tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
+            free(cur_bmdr_block);
             return TSK_ERR;
         }
 
@@ -1924,6 +1954,7 @@ visit_btree_node(TSK_FS_INFO *a_fs, TSK_FS_DIR *fs_dir, TSK_FS_META *fs_meta, xf
                 tsk_error_set_errno(TSK_ERR_FS_READ);
             }
             tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
+            free(node_recs);
             return TSK_ERR;
         }
 
@@ -1931,6 +1962,7 @@ visit_btree_node(TSK_FS_INFO *a_fs, TSK_FS_DIR *fs_dir, TSK_FS_META *fs_meta, xf
         len = bb_numrecs * sizeof(xfs_bmbt_ptr_t);
         if ((node_ptrs = (xfs_bmbt_ptr_t *) tsk_malloc(len)) == NULL)
         {
+            free(node_recs);
             return TSK_ERR;
         }
 
@@ -1943,6 +1975,8 @@ visit_btree_node(TSK_FS_INFO *a_fs, TSK_FS_DIR *fs_dir, TSK_FS_META *fs_meta, xf
                 tsk_error_set_errno(TSK_ERR_FS_READ);
             }
             tsk_error_set_errstr2("xfs_block_getflags: xfs_agf, cnt = %" PRId64 ", len = %" PRId64 "", cnt, len);
+            free(node_recs);
+            free(node_ptrs);
             return TSK_ERR;
         }
 
@@ -2147,6 +2181,8 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
                 }
 
                 ftype = dino_buf->di_core.di_mode & XFS_IN_FMT;
+                
+                free(dino_buf);
             }
 
             uint32_t ftype32 = (uint32_t) ftype << 12;
@@ -2268,6 +2304,7 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
                 tsk_error_set_errstr
                 ("xfs_dir_open_meta: Error reading directory contents: %"
                     PRIuINUM "\n", a_addr);
+                free(dirbuf);
                 return TSK_COR;
             }
 
@@ -2301,6 +2338,7 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
                         tsk_error_set_errstr
                         ("xfs_dir_open_meta: Error reading directory contents: %"
                             PRIuINUM "\n", a_addr);
+                        free(dirbuf);
                         return TSK_COR;
                     }
 
@@ -2317,6 +2355,7 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
                         tsk_error_set_errstr
                         ("xfs_dir_open_meta: Error reading directory contents: %"
                             PRIuINUM "\n", a_addr);
+                        free(dirbuf);
                         return TSK_COR;
                     }
 
@@ -2341,11 +2380,13 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
                         }
 
                         if (xfs_dinode_load(xfs, fs_name->meta_addr, dino_buf)) {
+                            free(dirbuf);
                             free(dino_buf);
                             return TSK_ERR;
                         }
 
                         ftype = dino_buf->di_core.di_mode & XFS_IN_FMT;
+                        free(dino_buf);
                     }
 
                     uint32_t ftype32 = (uint32_t) ftype << 12;
@@ -2382,6 +2423,7 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
                     if (tsk_verbose) { tsk_fprintf(stderr, "namelen = %d, fs_name->name = %s, fs_meta->type = %d, fs_name->meta_addr = %" PRId64  " fs_name->flags = \n", data_entry.namelen, fs_name->name, fs_meta->type, fs_name->meta_addr, fs_name->flags); }
 
                     if (tsk_fs_dir_add(fs_dir, fs_name)) {
+                        free(dirbuf);
                         tsk_fs_name_free(fs_name);
                         return TSK_ERR;
                     }
@@ -2447,7 +2489,7 @@ static void
 {
     if(fs != NULL){
         XFSFS_INFO *xfsfs = (XFSFS_INFO *)fs;
-        free(xfsfs->fs    );
+        free(xfsfs->fs);
         free(xfsfs->agi);
         tsk_fs_free(fs);
     }