123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #!/usr/bin/env perl
- #***************************************************************************
- # _ _ ____ _
- # Project ___| | | | _ \| |
- # / __| | | | |_) | |
- # | (__| |_| | _ <| |___
- # \___|\___/|_| \_\_____|
- #
- # Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
- #
- # This software is licensed as described in the file COPYING, which
- # you should have received as part of this distribution. The terms
- # are also available at https://curl.se/docs/copyright.html.
- #
- # You may opt to use, copy, modify, merge, publish, distribute and/or sell
- # copies of the Software, and permit persons to whom the Software is
- # furnished to do so, under the terms of the COPYING file.
- #
- # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- # KIND, either express or implied.
- #
- # SPDX-License-Identifier: curl
- #
- ###########################################################################
- # This scripts scans the entire git repository for binary files.
- #
- # All files in the git repo that contain signs of being binary are then
- # collected and a sha256sum is generated for all of them. That summary is then
- # compared to the list of pre-vetted files so that only the exact copies of
- # already scrutinized files are deemed okay to "appear binary".
- #
- use strict;
- use warnings;
- my $root = ".";
- my $sumsfile = ".github/scripts/binarycheck.sums";
- if($ARGV[0]) {
- $root = $ARGV[0];
- }
- my @bin;
- my %known;
- my $error = 0;
- sub knownbins {
- open(my $mh, "<", "$sumsfile") ||
- die "can't read known binaries";
- while(<$mh>) {
- my $l = $_;
- chomp $l;
- if($l =~ /^([a-f0-9]+) (.*)/) {
- my ($sum, $file) = ($1, $2);
- $known{$file} = 1;
- }
- elsif($l =~ /^#/) {
- # skip comments
- }
- else {
- print STDERR "suspicious line in $sumsfile\n";
- $error++;
- }
- }
- close($mh);
- }
- sub checkfile {
- my ($file) = @_;
- open(my $mh, "<", "$file") || die "can't read $file";
- my $line = 0;
- while(<$mh>) {
- my $l = $_;
- $line++;
- if($l =~ /([\x00-\x08\x0b\x0c\x0e-\x1f\x7f])/) {
- push @bin, $file;
- if(!$known{$file}) {
- printf STDERR "$file:$line has unknown binary contents\n";
- $error++;
- }
- last;
- }
- }
- close($mh);
- }
- my @files = `git ls-files -- $root`;
- if(scalar(@files) < 3000) {
- # this means this is not the git source code repository or that git does
- # not work, error out!
- print STDERR "too few files in the git repository!\n";
- exit 1;
- }
- knownbins();
- if(scalar(keys %known) < 10) {
- print STDERR "too few known binaries in $sumsfile\n";
- exit 2;
- }
- for my $f (@files) {
- chomp $f;
- checkfile("$root/$f");
- }
- my $check=system("sha256sum -c $sumsfile");
- if($check) {
- print STDERR "sha256sum detected a problem\n";
- $error++;
- }
- exit $error;
|