diff --git a/CHANGES.txt b/CHANGES.txt
index 82f35f041589165deded8df5e13d526b46331dda..fd801989110bf3800f271bbc54d67b493eb4f30a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -80,6 +80,9 @@ space is shown if slack space is requested.
 5/8/09: Update: Resolved issue 2596153 by changing arguments to the
 img_open functions.
 
+5/26/09: Bug Fix. Resolved issue 2796945 for inifite loop in fs_attr. 
+Reported by Simson Garfinkel.
+
 
 ---------------- VERSION 3.0.1 -------------- 
 11/11/08: Bug Fix: Fixed crashing bug in ifind on FAT file system.
diff --git a/tsk3/fs/fs_attr.c b/tsk3/fs/fs_attr.c
index 47785f75a3731a45998ca2ac215d7ac5204798ae..6d31ee8fd37b5b3647d1968c6e3549ad86b49f19 100644
--- a/tsk3/fs/fs_attr.c
+++ b/tsk3/fs/fs_attr.c
@@ -431,8 +431,8 @@ tsk_fs_attr_add_run(TSK_FS_INFO * a_fs, TSK_FS_ATTR * a_fs_attr,
             tsk_fprintf(stderr,
                 "tsk_fs_attr_add: %" PRIuOFF "@%" PRIuOFF
                 " (Filler: %s)\n", data_run_cur->offset, data_run_cur->len,
-                (data_run_cur->
-                    flags & TSK_FS_ATTR_RUN_FLAG_FILLER) ? "Yes" : "No");
+                (data_run_cur->flags & TSK_FS_ATTR_RUN_FLAG_FILLER) ? "Yes"
+                : "No");
 
         /* Do we replace this filler spot? */
         if (data_run_cur->flags & TSK_FS_ATTR_RUN_FLAG_FILLER) {
@@ -677,11 +677,11 @@ tsk_fs_attr_walk_res(const TSK_FS_ATTR * fs_attr,
     }
 
     /* Allocate a buffer that is at most a block size in length */
-    if ((a_flags & TSK_FS_FILE_WALK_FLAG_AONLY) == 0) {
-        buf_len = (size_t) fs_attr->size;
-        if (buf_len > fs->block_size)
-            buf_len = fs->block_size;
+    buf_len = (size_t) fs_attr->size;
+    if (buf_len > fs->block_size)
+        buf_len = fs->block_size;
 
+    if ((a_flags & TSK_FS_FILE_WALK_FLAG_AONLY) == 0) {
         if ((buf = tsk_malloc(buf_len)) == NULL) {
             return 1;
         }
@@ -786,8 +786,8 @@ tsk_fs_attr_walk_nonres(const TSK_FS_ATTR * fs_attr,
 
             /* If the address is too large then give an error */
             if (addr + len_idx > fs->last_block) {
-                if (fs_attr->fs_file->meta->
-                    flags & TSK_FS_META_FLAG_UNALLOC)
+                if (fs_attr->fs_file->
+                    meta->flags & TSK_FS_META_FLAG_UNALLOC)
                     tsk_errno = TSK_ERR_FS_RECOVER;
                 else
                     tsk_errno = TSK_ERR_FS_BLK_NUM;
@@ -839,8 +839,8 @@ tsk_fs_attr_walk_nonres(const TSK_FS_ATTR * fs_attr,
                     if ((off + fs->block_size > fs_attr->nrd.initsize)
                         && ((a_flags & TSK_FS_FILE_READ_FLAG_SLACK) == 0)) {
                         memset(&buf[fs_attr->nrd.initsize - off], 0,
-                            fs->block_size - (size_t)(fs_attr->nrd.initsize -
-                                off));
+                            fs->block_size -
+                            (size_t) (fs_attr->nrd.initsize - off));
                     }
                 }
             }
@@ -1112,21 +1112,22 @@ tsk_fs_attr_read(const TSK_FS_ATTR * a_fs_attr, TSK_OFF_T a_offset,
                     fprintf(stderr,
                         "tsk_fs_attr_read_type: File %" PRIuINUM
                         " has FILLER entry, using 0s\n",
-                        (a_fs_attr->fs_file->meta) ? a_fs_attr->fs_file->
-                        meta->addr : 0);
+                        (a_fs_attr->fs_file->meta) ? a_fs_attr->
+                        fs_file->meta->addr : 0);
             }
             // we return 0s for reads past the initsize (unless they want slack space)
-            else if (((TSK_OFF_T)((data_run_cur->offset +
-                        blkoffset_inrun) * fs->block_size +
-                    byteoffset_toread) >= a_fs_attr->nrd.initsize)
+            else if (((TSK_OFF_T) ((data_run_cur->offset +
+                            blkoffset_inrun) * fs->block_size +
+                        byteoffset_toread) >= a_fs_attr->nrd.initsize)
                 && ((a_flags & TSK_FS_FILE_READ_FLAG_SLACK) == 0)) {
                 memset(&a_buf[len_toread - len_remain], 0, len_inrun);
                 if (tsk_verbose)
                     fprintf(stderr,
                         "tsk_fs_attr_read: Returning 0s for read past end of initsize (%"
                         PRIuINUM ")\n", ((a_fs_attr->fs_file)
-                            && (a_fs_attr->fs_file->meta)) ? a_fs_attr->
-                        fs_file->meta->addr : 0);
+                            && (a_fs_attr->fs_file->
+                                meta)) ? a_fs_attr->fs_file->meta->
+                        addr : 0);
             }
             else {
                 TSK_OFF_T fs_offset_b;
@@ -1158,14 +1159,14 @@ tsk_fs_attr_read(const TSK_FS_ATTR * a_fs_attr, TSK_OFF_T a_offset,
                 }
 
                 // see if part of the data is in the non-initialized space
-                if (((TSK_OFF_T)((data_run_cur->offset +
-                            blkoffset_inrun) * fs->block_size +
-                        byteoffset_toread + len_inrun) >
+                if (((TSK_OFF_T) ((data_run_cur->offset +
+                                blkoffset_inrun) * fs->block_size +
+                            byteoffset_toread + len_inrun) >
                         a_fs_attr->nrd.initsize)
                     && ((a_flags & TSK_FS_FILE_READ_FLAG_SLACK) == 0)) {
                     size_t off =
-                        (size_t)((data_run_cur->offset +
-                        blkoffset_inrun) * fs->block_size +
+                        (size_t) ((data_run_cur->offset +
+                            blkoffset_inrun) * fs->block_size +
                         byteoffset_toread + len_inrun -
                         a_fs_attr->nrd.initsize);
                     memset(&a_buf[len_toread - len_remain + off], 0,