Magellan Linux

Contents of /trunk/mkinitrd-magellan/isolinux/checkov.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (show annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 7 months ago) by niro
File MIME type: text/plain
File size: 1746 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

1 #!/usr/bin/perl
2 #
3 # checkov.pl
4 #
5 # Check NASM map output for overflow
6 #
7 # This assumes that a section for which start != vstart, both
8 # ranges need to be checked for overflow (true for SYSLINUX)
9 #
10
11 ($in, $target) = @ARGV;
12
13 sub overlap($$$$) {
14 my($s1,$e1,$s2,$e2) = @_;
15
16 return 1 if ( $s2 < $e1 && $e2 > $s1 );
17 return 1 if ( $s1 < $e2 && $e1 > $s2 );
18
19 return 0;
20 }
21
22 open(IN, '<', $in) or die "$0: Cannot open input file: $in\n";
23
24 $section = undef;
25 while ( $line = <IN> ) {
26 if ( $line =~ /^-/ ) {
27 if ( $line =~ /^\-\-\-\- Section (\S+) / ) {
28 $section = $1;
29 } else {
30 $section = undef;
31 }
32 } elsif ( defined($section) ) {
33 if ( $line =~ /^length\:\s*(\S+)/ ) {
34 $length{$section} = hex $1;
35 } elsif ( $line =~ /^start\:\s*(\S+)/ ) {
36 $start{$section} = hex $1;
37 } elsif ( $line =~ /^vstart\:\s*(\S+)/ ) {
38 $vstart{$section} = hex $1;
39 }
40 }
41 }
42 close(IN);
43
44 $err = 0;
45
46 foreach $s ( keys(%start) ) {
47 $sstart = $start{$s};
48 $svstart = $vstart{$s};
49 $send = $sstart + $length{$s};
50 $svend = $svstart + $length{$s};
51
52 if ( $send > 0x10000 || $svend > 0x10000 ) {
53 print STDERR "$target: 16-bit overflow on section $s\n";
54 $err++;
55 }
56
57 foreach $o ( keys(%start) ) {
58 next if ( $s ge $o );
59
60 $ostart = $start{$o};
61 $ovstart = $vstart{$o};
62 $oend = $ostart + $length{$o};
63 $ovend = $ovstart + $length{$o};
64
65 if ( overlap($sstart, $send, $ostart, $oend) ||
66 overlap($svstart, $svend, $ostart, $oend) ||
67 overlap($sstart, $send, $ovstart, $ovend) ||
68 overlap($svstart, $svend, $ovstart, $ovend) ) {
69 print STDERR "$target: section $s overlaps section $o\n";
70 $err++;
71 }
72 }
73 }
74
75 if ( $err ) {
76 unlink($target);
77 exit(1);
78 } else {
79 exit(0);
80 }