@@ -207,6 +207,16 @@ my $installed_schema = [
207
207
[ ' b*' , ' packages' , undef , \&installed_postprocess ],
208
208
];
209
209
210
+ my $pkg_info_schema_zerochksum = [
211
+ [ undef ],
212
+ [ undef ],
213
+ [ ' !' , ' apkchksum' , undef , sub { substr ($_ [0], $_ [1] + 1, 20, " \0\0\0\0 " x 5 ) if $_ [2] == 8 && substr ($_ [0], $_ [1], 1) eq " \x14 " } ],
214
+ ];
215
+
216
+ my $pkg_schema_zerochksum = [
217
+ [ ' o' , ' ' , $pkg_info_schema_zerochksum ],
218
+ ];
219
+
210
220
sub installed_postprocess {
211
221
my ($v ) = @_ ;
212
222
substr ($v , 0, 4, ' ' );
@@ -255,10 +265,13 @@ sub walk {
255
265
$v = $name eq ' ' ? $_ [1]: {};
256
266
walk($_ [0], $v , $s -> [2], \@v );
257
267
next if $name eq ' ' ;
268
+ } elsif ($st eq ' !' ) {
269
+ $cvt -> ($_ [0], $v , $t , $_ [1], $name , $multi );
270
+ next ;
258
271
} else {
259
272
die (" unsupported type $st in schema\n " );
260
273
}
261
- $v = $s -> [3] -> ($v ) if $cvt ;
274
+ $v = $cvt -> ($v ) if $cvt ;
262
275
if ($multi ) {
263
276
push @{$_ [1]-> {$name }}, $v ;
264
277
} else {
@@ -455,6 +468,13 @@ sub verifyapkchksum_adb {
455
468
die (" unsupported apk checksum $chksum \n " ) unless $chksum =~ / ^([QX][12])/ ;
456
469
return 1 if calcapkchksum_adb($_ [0], $1 ) eq $chksum ;
457
470
return 1 if $chksum =~ / ^([QX])1/ && trunc_apkchksum(calcapkchksum_adb($_ [0], " ${1}2" )) eq $chksum ;
471
+ # last resort: check for old style package identifier
472
+ if ($chksum =~ / ^([QX])1/ ) {
473
+ my $adb_cpy = $_ [0];
474
+ walk_root($adb_cpy , $pkg_schema_zerochksum );
475
+ return 1 if calcapkchksum_adb($adb_cpy , substr ($chksum , 0, 2)) eq $chksum ;
476
+ return 1 if trunc_apkchksum(calcapkchksum_adb($adb_cpy , substr ($chksum , 0, 1).' 2' )) eq $chksum ;
477
+ }
458
478
return 0;
459
479
}
460
480
0 commit comments