On Tue, Sep 22, 2020 at 08:37:22PM +0300, Juha Erkkilä wrote:

> 
> > On 22. Sep 2020, at 15.04, Juha Erkkilä <juha...@icloud.com> wrote:
> > 
> >> On 22. Sep 2020, at 9.00, Otto Moerbeek <o...@drijf.net> wrote:
> >> Maybe by hand, but not by using patch(1), the context differs a bit.
> >> 
> >> Next obvious question: did you test if it fixes your problem? That
> >> means, do you get a dump that can be restored again?
> >> 
> >>    -Otto
> > 
> > Thanks Otto for a very good question!  So no,
> > do not use that patch as is, it breaks restore
> > as it can not be used to restore any files.
> 
> Actually, I tested this again and now it appears
> dump and restore both work correctly. Previously,
> I first tested dump/restore with an empty filesystem,
> then with some files, and it may be that the second
> time I was accidentally testing restore with the first
> dump file.
> 
> My tests were only with a small amount of files,
> I will do a better test with proper data (about
> 0.5 terabytes and over 100000 files) and will
> report again here in a next few days.

Lookin through FreeBSD commits I think you want the main.c one as
well, otherwise silent corruption of the dump is still possible.

        -Otto

Index: main.c
===================================================================
RCS file: /cvs/src/sbin/dump/main.c,v
retrieving revision 1.61
diff -u -p -r1.61 main.c
--- main.c      28 Jun 2019 13:32:43 -0000      1.61
+++ main.c      24 Sep 2020 10:24:45 -0000
@@ -92,7 +92,7 @@ main(int argc, char *argv[])
        int ch, mode;
        struct tm then;
        struct statfs fsbuf;
-       int i, anydirskipped, bflag = 0, Tflag = 0, honorlevel = 1;
+       int i, anydirskipped, c_count, bflag = 0, Tflag = 0, honorlevel = 1;
        ino_t maxino;
        time_t t;
        int dirlist;
@@ -442,6 +442,9 @@ main(int argc, char *argv[])
 #endif
        maxino = (ino_t)sblock->fs_ipg * sblock->fs_ncg;
        mapsize = roundup(howmany(maxino, NBBY), TP_BSIZE);
+       c_count = howmany(mapsize * sizeof(char), TP_BSIZE);
+       if (c_count > TP_NINDIR)
+               quit("fs is too large for dump!");
        usedinomap = calloc((unsigned) mapsize, sizeof(char));
        dumpdirmap = calloc((unsigned) mapsize, sizeof(char));
        dumpinomap = calloc((unsigned) mapsize, sizeof(char));
Index: tape.c
===================================================================
RCS file: /cvs/src/sbin/dump/tape.c,v
retrieving revision 1.45
diff -u -p -r1.45 tape.c
--- tape.c      28 Jun 2019 13:32:43 -0000      1.45
+++ tape.c      24 Sep 2020 10:24:45 -0000
@@ -330,7 +330,8 @@ flushtape(void)
        }
 
        blks = 0;
-       if (spcl.c_type != TS_END) {
+       if (spcl.c_type != TS_END && spcl.c_type != TS_CLRI &&
+           spcl.c_type != TS_BITS) {
                for (i = 0; i < spcl.c_count; i++)
                        if (spcl.c_addr[i] != 0)
                                blks++;

Reply via email to