diff options
-rw-r--r-- | Master/tlpkg/TeXLive/TLCrypto.pm | 31 | ||||
-rw-r--r-- | Master/tlpkg/TeXLive/TLPDB.pm | 2 | ||||
-rw-r--r-- | Master/tlpkg/TeXLive/TLUtils.pm | 3 |
3 files changed, 34 insertions, 2 deletions
diff --git a/Master/tlpkg/TeXLive/TLCrypto.pm b/Master/tlpkg/TeXLive/TLCrypto.pm index 07b67ad6654..66da491b5dc 100644 --- a/Master/tlpkg/TeXLive/TLCrypto.pm +++ b/Master/tlpkg/TeXLive/TLCrypto.pm @@ -252,6 +252,17 @@ sub verify_checksum { debug("verify_checksum: download did not succeed for $checksum_url\n"); return($VS_CONNECTION_ERROR, "download did not succeed: $checksum_url"); } + + # check that we have a non-trivial size for the checksum file + # the size should be at least 128 + 1 + length(filename) > 129 + { + my $css = -s $checksum_file; + if ($css <= 128) { + debug("verify_checksum: size of checksum file suspicious: $css\n"); + return($VS_CONNECTION_ERROR, "download corrupted: $checksum_url"); + } + } + # check the signature my ($ret, $msg) = verify_signature($checksum_file, $checksum_url); @@ -418,6 +429,26 @@ sub verify_signature { my $signature_file = TeXLive::TLUtils::download_to_temp_or_file($signature_url); if ($signature_file) { + { + # we expect a signature to be at least + # 30 header line + 30 footer line + 256 > 300 + my $sigsize = -s $signature_file; + if ($sigsize < 300) { + debug("cryptographic signature seems to be corrupted (size $sigsize<300): $signature_url, $signature_file\n"); + return($VS_UNSIGNED, "cryptographic signature download seems to be corrupted (size $sigsize<300)"); + } + } + # check also the first line of the signature file for + # -----BEGIN PGP SIGNATURE----- + { + open my $file, '<', $signature_file; + chomp(my $firstLine = <$file>); + close $file; + if ($firstLine !~ m/^-----BEGIN PGP SIGNATURE-----/) { + debug("cryptographic signature seems to be corrupted (first line not signature): $signature_url, $signature_file, $firstLine\n"); + return($VS_UNSIGNED, "cryptographic signature download seems to be corrupted (first line of $signature_url not signature: $firstLine)"); + } + } my ($ret, $out) = gpg_verify_signature($file, $signature_file); if ($ret == 1) { # no need to show the output diff --git a/Master/tlpkg/TeXLive/TLPDB.pm b/Master/tlpkg/TeXLive/TLPDB.pm index 07ad80c6169..25423f1a7b4 100644 --- a/Master/tlpkg/TeXLive/TLPDB.pm +++ b/Master/tlpkg/TeXLive/TLPDB.pm @@ -370,7 +370,7 @@ sub from_file { } elsif ($r == $VS_CONNECTION_ERROR) { tldie("$0: cannot download: $m\n"); } elsif ($r == $VS_UNSIGNED) { - debug("$0: remote database checksum is not signed, continuing anyway!\n"); + debug("$0: remote database checksum is not signed, continuing anyway: $m\n"); $self->verification_status($r); } elsif ($r == $VS_GPG_UNAVAILABLE) { debug("$0: TLPDB: no gpg available, continuing anyway!\n"); diff --git a/Master/tlpkg/TeXLive/TLUtils.pm b/Master/tlpkg/TeXLive/TLUtils.pm index 48606687501..c4d21e26cb9 100644 --- a/Master/tlpkg/TeXLive/TLUtils.pm +++ b/Master/tlpkg/TeXLive/TLUtils.pm @@ -3908,7 +3908,8 @@ sub slurp_file { =item C<< download_to_temp_or_file($url) >> -If C<$url> tries to download the file into a temporary file. +If C<$url> is a url, tries to download the file into a temporary file. +Otherwise assume that C<$url> is a local file. In both cases returns the local file. Returns the local file name if succeeded, otherwise undef. |