[syslinux] [PATCH] NTFS: fix incorrect file->offset usage in ntfs_readdir

Andy Alex andy at r-tt.com
Mon Jun 2 10:28:22 PDT 2014


file->offset is used to store position in index root between 
ntfs_readdir calls.
Previously, pointer to buffer was stored in this field. However this 
buffer is reallocated and read each ntfs_readdir call so the pointer may 
become incorrect.
Now offset in index root rather than pointer is stored in this field.

Signed-off-by: Andy Alex <andy at r-tt.com>
---
diff -uprN syslinux-6.03-pre12.orig/core/fs/ntfs/ntfs.c 
syslinux-6.03-pre12/core/fs/ntfs/ntfs.c
--- syslinux-6.03-pre12.orig/core/fs/ntfs/ntfs.c    2014-05-26 
20:30:30.000000000 -0400
+++ syslinux-6.03-pre12/core/fs/ntfs/ntfs.c    2014-06-02 
13:16:03.000000000 -0400
@@ -1058,14 +1058,13 @@ static int ntfs_readdir(struct file *fil
                              attr->data.resident.value_offset);

      if (!file->offset && readdir_state->in_idx_root) {
-        file->offset = (uint32_t)((uint8_t *)&ir->index +
-                                        ir->index.entries_offset);
+        file->offset = ir->index.entries_offset;
      }

  idx_root_next_entry:
      if (readdir_state->in_idx_root) {
-        ie = (struct ntfs_idx_entry *)(uint8_t *)file->offset;
-        if (ie->flags & INDEX_ENTRY_END) {
+        ie = (struct ntfs_idx_entry *)((uint8_t *)&ir->index + 
file->offset);
+        if (ie->flags & INDEX_ENTRY_END) {
              file->offset = 0;
              readdir_state->in_idx_root = false;
              readdir_state->idx_blks_count = 1;
@@ -1074,7 +1073,7 @@ idx_root_next_entry:
              goto descend_into_child_node;
          }

-        file->offset = (uint32_t)((uint8_t *)ie + ie->len);
+        file->offset += ie->len;
          len = ntfs_cvt_filename(filename, ie);
          if (!is_filename_printable(filename))
              goto idx_root_next_entry;




More information about the Syslinux mailing list