]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
fsr: fix uninitialized fs usage after timeout
authorJeff Mahoney <jeffm@suse.com>
Tue, 22 Aug 2017 15:01:30 +0000 (10:01 -0500)
committerEric Sandeen <sandeen@redhat.com>
Tue, 22 Aug 2017 15:01:30 +0000 (10:01 -0500)
In the main loop of fsrallfs, we exit when we've hit the timeout but
we increment fs before we get there.  If we're operating on the last
file system in the array, we'll hit an uninitialized fsdesc and
crash in fsrall_cleanup.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
[sandeen: change Jeff's for(; loop]
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
fsr/xfs_fsr.c

index d4846a320c64d599bc4118fc637426f016741eda..2a18ce082b93a7ca17407e2a1740f6f7fa9c1c81 100644 (file)
@@ -600,12 +600,7 @@ fsrallfs(char *mtab, int howlong, char *leftofffile)
        /* reorg for 'howlong' -- checked in 'fsrfs' */
        while (endtime > time(0)) {
                pid_t pid;
-               if (fs == fsend)
-                       fs = fsbase;
-               if (fs->npass == npasses) {
-                       fsrprintf(_("Completed all %d passes\n"), npasses);
-                       break;
-               }
+
                if (npasses > 1 && !fs->npass)
                        Mflag = 1;
                else
@@ -631,6 +626,12 @@ fsrallfs(char *mtab, int howlong, char *leftofffile)
                startino = 0;  /* reset after the first time through */
                fs->npass++;
                fs++;
+               if (fs == fsend)
+                       fs = fsbase;
+               if (fs->npass == npasses) {
+                       fsrprintf(_("Completed all %d passes\n"), npasses);
+                       break;
+               }
        }
        fsrall_cleanup(endtime <= time(0));
 }