Ondřej Vašík d3438c
diff -urNp coreutils-8.17-orig/src/extent-scan.c coreutils-8.17/src/extent-scan.c
Ondřej Vašík d3438c
--- coreutils-8.17-orig/src/extent-scan.c	2012-05-02 10:31:47.000000000 +0200
Ondřej Vašík d3438c
+++ coreutils-8.17/src/extent-scan.c	2012-11-05 12:05:36.732370966 +0100
Ondřej Vašík d3438c
@@ -89,7 +89,7 @@ extern bool
Ondřej Vašík d3438c
 extent_scan_read (struct extent_scan *scan)
Ondřej Vašík d3438c
 {
Ondřej Vašík d3438c
   unsigned int si = 0;
Ondřej Vašík d3438c
-  struct extent_info *last_ei IF_LINT ( = scan->ext_info);
Ondřej Vašík d3438c
+  struct extent_info *last_ei = scan->ext_info;
Ondřej Vašík d3438c
 
Ondřej Vašík d3438c
   while (true)
Ondřej Vašík d3438c
     {
Ondřej Vašík d3438c
@@ -127,8 +127,14 @@ extent_scan_read (struct extent_scan *sc
Ondřej Vašík d3438c
 
Ondřej Vašík d3438c
       assert (scan->ei_count <= SIZE_MAX - fiemap->fm_mapped_extents);
Ondřej Vašík d3438c
       scan->ei_count += fiemap->fm_mapped_extents;
Ondřej Vašík d3438c
-      scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count,
Ondřej Vašík d3438c
-                                  sizeof (struct extent_info));
Ondřej Vašík d3438c
+      {
Ondřej Vašík d3438c
+        /* last_ei points into a buffer that may be freed via xnrealloc.
Ondřej Vašík d3438c
+           Record its offset and adjust after allocation. */
Ondřej Vašík d3438c
+        size_t prev_idx = last_ei - scan->ext_info;
Ondřej Vašík d3438c
+        scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count,
Ondřej Vašík d3438c
+        sizeof (struct extent_info));
Ondřej Vašík d3438c
+        last_ei = scan->ext_info + prev_idx;
Ondřej Vašík d3438c
+      }
Ondřej Vašík d3438c
 
Ondřej Vašík d3438c
       unsigned int i = 0;
Ondřej Vašík d3438c
       for (i = 0; i < fiemap->fm_mapped_extents; i++)