Hi,
When using apt 2.3.8 (errors has occured on older versions as well) on
a 32bit arm android device, I am getting a checksum error when trying
to install a local deb. The issue only occurs if the package has a list
of conffiles, and if the control archive has been compressed with gzip,
i.e. to .tar.gz (took me a while figuring that out..). The error looks
like:
$ apt install ./tmp/foo.deb
Reading package lists... Error!
E: Tar checksum failed, archive corrupted
E: Could not read meta data from
/data/data/com.termux/files/home/tmp/foo.deb
E: The package lists or status file could not be parsed or opened.
Installing from the remote (apt install foo) works fine, but
downloading the deb first (apt download foo && apt install ./foo.deb)
gives the error.
By adding some debug messages to extracttar.cc:
--- ./apt-pkg/contrib/extracttar.cc.orig 2021-09-05
10:25:03.346706695 +0200
+++ ./apt-pkg/contrib/extracttar.cc 2021-09-05 10:30:45.406741064
+0200
@@ -152,11 +152,13 @@
memset(Tar->Checksum,' ',sizeof(Tar->Checksum));
for (int I = 0; I != sizeof(Block); I++)
NewSum += Block[I];
-
+ printf("Tar->Checksum: %s, NewSum: %lu CheckSum: %lu\n", Tar-
>Checksum, NewSum, CheckSum);
/* Check for a block of nulls - in this case we kill gzip, GNU
tar
does this.. */
- if (NewSum == ' '*sizeof(Tar->Checksum))
+ if (NewSum == ' '*sizeof(Tar->Checksum)) {
+ printf("Returning Done()\n");
return Done();
+ }
if (NewSum != CheckSum)
return _error->Error(_("Tar checksum failed, archive
corrupted"));
I get this with a non-working deb:
$ apt install ./tmp/foo.deb
Tar->Checksum: 5, NewSum: 4177 CheckSum: 4177
Tar->Checksum: 0, NewSum: 4949 CheckSum: 4949
Tar->Checksum: 0, NewSum: 5131 CheckSum: 5131
Tar->Checksum: , NewSum: 4182 CheckSum: 0
Reading package lists... Error!
E: Tar checksum failed, archive corrupted
E: Could not read meta data from
/data/data/com.termux/files/home/tmp/foo.deb
E: The package lists or status file could not be parsed or opened.
While for a working deb (everything the same, but with control.tar.xz
instead of control.tar.gz):
$ apt install ./tmp/foo.deb
Tar->Checksum: 5, NewSum: 4184 CheckSum: 4184
Tar->Checksum: 0, NewSum: 4956 CheckSum: 4956
Tar->Checksum: 0, NewSum: 5138 CheckSum: 5138
Tar->Checksum: , NewSum: 256 CheckSum: 0
Returning Done()
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Note, selecting 'foo' instead of './tmp/foo.deb'
Tar->Checksum: 5, NewSum: 4184 CheckSum: 4184
Tar->Checksum: 0, NewSum: 4956 CheckSum: 4956
Tar->Checksum: 0, NewSum: 5138 CheckSum: 5138
Tar->Checksum: , NewSum: 256 CheckSum: 0
Returning Done()
The following NEW packages will be installed:
foo
0 upgraded, 1 newly installed, 0 to remove and 4 not upgraded.
Need to get 0 B/804 B of archives.
After this operation, 1024 B of additional disk space will be used.
Get:1 /data/data/com.termux/files/home/tmp/foo.deb foo arm 1.0 [804 B]
Selecting previously unselected package foo.
(Reading database ... 74483 files and directories currently installed.)
Preparing to unpack .../data/data/com.termux/files/home/tmp/foo.deb ...
Unpacking foo (1.0) ...
Setting up foo (1.0) ...
As mentioned, this is on android 32bit arm where apt runs in the
terminal emulator termux [1]. A bunch of patches are applied to apt
[2], but nothing that (clearly) should affect the extraction. I tried
reproducing the issue on an arm raspberry pi, but there the issue does
not occur.
I have attached the script I used for generating a minimal deb for
debugging this. Skip the conffile, or change to
tar -cJf ../control.tar.xz -H gnu .
and the deb installs without issues. dpkg -i ./tmp/foo.deb also works
without issues, for all debs.
Does anyone have any suggestions for other things to try for debugging
this further?
Best regards
Henrik Grimler
[1] https://termux.com/
[2] https://github.com/termux/termux-packages/tree/master/packages/apt
Attachment:
minimal_deb.sh
Description: application/shellscript