[email protected] wrote at about 23:48:28 -0400 on Saturday, April 6, 2019:
> [email protected] wrote at about 23:12:32 -0400 on Saturday, April 6,
> 2019:
> > [email protected] 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
[email protected]
List: https://lists.sourceforge.net/lists/listinfo/backuppc-users
Wiki: http://backuppc.wiki.sourceforge.net
Project: http://backuppc.sourceforge.net/