backu...@kosowsky.org wrote at about 23:48:28 -0400 on Saturday, April 6, 2019:
 > backu...@kosowsky.org wrote at about 23:12:32 -0400 on Saturday, April 6, 
 > 2019:
 >  > backu...@kosowsky.org wrote at about 14:58:10 -0400 on Sunday, March 31, 
 > 2019:
 >  >  > 
 >  >  > When I run 'BackupPC_migrateV3toV4' (v4.3.0), I get occasional errors
 >  >  > of form:
 >  >  >    BackupPC_migrateV3toV4: can't read attribute file 
 > ./f%2fdata/fmedia/f0/fAndroid/fdata/fcom.ebay.redlaser/fcache/fhttp/attrib
 >  >  > 
 >  >  > Plus an associated error:
 >  >  >      bpc_attrib_dirRead: got unreasonable file name length 852354
 >  >  > 
 >  >  > Similarly if I try to read the attrib file directly using 
 > BackupPC_attribPrint, I get:
 >  >  >          BackupPC_attribPrint: cannot read attrib file 
 > <path-to-file>/f%2fdata/fmedia/f0/fAndroid/fdata/fcom.ebay.redlaser/fcache/fhttp/attrib
 >  >  > 
 >  >  > HOWEVER, if I use the v3.1 version of BackupPC_attribPrint, the attrib 
 > file prints out just fine!!!
 >  >  > SO, the issue seems to be with how v4.x reads attrib files
 >  >  > 
 >  >  > And none of the filenames are longer than 255 characters...
 >  >  > For example the longest is:
 >  >  >     
 > fcache_http%253A%252F%252Fwww.swap.com%252Fi%252FM%252FAMIfv95PqwhrAhpZvHMI9wTeAMmp74SepSA1FcgE-HwOBvARxlhxJ2MNyBqHSNkxbLWiKa50yAM6dEAP7CA_DpByvhW4MB4wp6KPcmAzKpcUSgAliHCnZ4OTQ8NbA3xOUfehqKnpdFXq-xHdSJ3aU09RXP-0pfnFVDH9YnkSDLTv8IeTU3tbAvE-1000%254080.jpg
 >  >  > 
 >  >  > In other cases, I get the same error even though the longest filename 
 > is less than 100 chars. So that is not the issue...
 >  >  > 
 >  >  > NOTE: that the error is rare -- I migrated about 2 million pool files 
 > repeated across 100 backups... yet I only encountered about a dozen 
 > "unreadable" attrib files
 >  >  > Also, the "got unreasonable file name length" error is always 
 > associated with the "can't read attribute file" error (and vice-versa)
 >  >  > 
 >  >  > I tried to troubleshoot, but the problem seems to be in the
 >  >  > BackupPC::XS:Attrib read C-code...
 >  >  > 
 >  > 
 >  > OK... I dug into the C-code a bit...
 >  > 
 >  > The problem occurs in bpc_attrib.c in the lines:
 >  >  } else if ( magic == BPC_ATTRIB_TYPE_UNIX ) {
 >  >          while ( bufP < buf + nRead ) {
 >  >              uint fileNameLen;
 >  >              char *fileName;
 >  >              bpc_attrib_file *file;
 >  >              int64 sizeDiv4GB;
 >  >              uint type;
 >  > 
 >  >             if ( nRead == sizeof(buf) && bufP > buf + nRead - 2 * 
 > BPC_MAXPATHLEN
 >  >                     && read_more_data(&fd, buf, sizeof(buf), &nRead, 
 > &bufP, attribPath) ) {
 >  >                bpc_fileZIO_close(&fd);
 >  >                printf("JJK: magic 2\n");
 >  >                return -1;
 >  >             }
 >  > 
 >  >             fileNameLen = getVarInt(&bufP, buf + nRead);
 >  >             if ( fileNameLen > 2 * BPC_MAXPATHLEN - 16 ) {
 >  >                 bpc_logErrf("bpc_attrib_dirRead: got unreasonable file 
 > name length %d\n", fileNameLen);
 >  >                 bpc_fileZIO_close(&fd);
 >  >                 return -1;
 >  >       }
 >  > 
 >  > 
 >  > For example, fileNameLen comes back as 852354 which is obviously a 
 > ridiculous number.
 >  > 
 >  > I also played with the attrib file itself and found the following:
 >  > Specifically, when I break the attrib file into parts:
 >  > 1. Every file is individually readable when broken into separate attrib 
 > files with just one entry
 >  > 2. Only certain combinations of files reconstructed into an attrib file 
 > are not readable. For example, in one case, files 7-118 are not readable but 
 > files 6-117 or 8-118 are readable.
 >  > 2. In v3.x is always readable.
 >  > 
 >  > I suspect that Perl is storing longer hashes in a way that is not 
 > readable by the C-code in v4.x.
 >  > 
 >  > Happy to share the above examples if anyone is willing to help me 
 > troubleshoot...
 >  > 
 >  > Jeff
 > 
 > Here is a test attrib hash that is readable in 3.x but not 4.x
 > 
 > $VAR1 = {
 >   'temp' => {
 >     'uid' => 1023,
 >     'mtime' => 1386359561,
 >     'sizeDiv4GB' => 0,
 >     'size' => 24090,
 >     'sizeMod4GB' => 24090,
 >     'mode' => 33204,
 >     'gid' => 1023,
 >     'type' => 0
 >   },
 >   
 > 'c.shld.net%2Frpx%2Fi%2Fs%2Fpi%2Fmp%2F3962%2F7417620111p%3Fsrc%3Dhttp%253A%252F%252Fwww.petraimages.com%252F500x500%252FBSH260224.jpg'
 >  => {
 >     'mode' => 33204,
 >     'gid' => 1023,
 >     'type' => 0,
 >     'mtime' => 1385712394,
 >     'uid' => 1023,
 >     'sizeDiv4GB' => 0,
 >     'size' => 0,
 >     'sizeMod4GB' => 3330
 >   }
 > };
 > 
 > 
 > Perhaps the problem is with the non-ascii encoding in the second file
 > that causes the filename read to fail in the c-code in attrib.c??
 > 

I believe the problem is that getVarInt is used instead of
getVarInt_v3 in bpc_attrib_dirRead in places where we are reading a v3
rather than v4 file.
Specifically:
 } else if ( magic == BPC_ATTRIB_TYPE_UNIX ) {
         while ( bufP < buf + nRead ) {
             uint fileNameLen;
             char *fileName;
             bpc_attrib_file *file;
             int64 sizeDiv4GB;
             uint type;

            if ( nRead == sizeof(buf) && bufP > buf + nRead - 2 * BPC_MAXPATHLEN
                    && read_more_data(&fd, buf, sizeof(buf), &nRead, &bufP, 
attribPath) ) {
               bpc_fileZIO_close(&fd);
               return -1;
            }

            fileNameLen = getVarInt(&bufP, buf + nRead);
            if ( fileNameLen > 2 * BPC_MAXPATHLEN - 16 ) {
                bpc_logErrf("bpc_attrib_dirRead: got unreasonable file name 
length %d\n", fileNameLen);
                bpc_fileZIO_close(&fd);
                return -1;
            }


_______________________________________________
BackupPC-users mailing list
BackupPC-users@lists.sourceforge.net
List:    https://lists.sourceforge.net/lists/listinfo/backuppc-users
Wiki:    http://backuppc.wiki.sourceforge.net
Project: http://backuppc.sourceforge.net/

Reply via email to