Annotation of /tags/mkinitrd-6_1_5/isolinux/checkov.pl
Parent Directory | Revision Log
Revision 532 -
(hide annotations)
(download)
Sat Sep 1 22:45:15 2007 UTC (17 years ago) by niro
Original Path: trunk/mkinitrd-magellan/isolinux/checkov.pl
File MIME type: text/plain
File size: 1746 byte(s)
Sat Sep 1 22:45:15 2007 UTC (17 years ago) by niro
Original Path: trunk/mkinitrd-magellan/isolinux/checkov.pl
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 | niro | 532 | #!/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 | } |