From 2e5758d8a322f611839c505992f1017a9b848bda Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Tue, 18 Dec 2012 13:37:01 +0100 Subject: [PATCH] support RETURN of the last two globals :) --- misc/tools/progs-analyzer.pl | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/misc/tools/progs-analyzer.pl b/misc/tools/progs-analyzer.pl index 282b6c1d..a713d775 100644 --- a/misc/tools/progs-analyzer.pl +++ b/misc/tools/progs-analyzer.pl @@ -898,7 +898,7 @@ sub detect_constants($) use constant GLOBALFLAG_U => 64; # unused use constant GLOBALFLAG_P => 128; # possibly parameter passing use constant GLOBALFLAG_D => 256; # has a def - my @globalflags = (GLOBALFLAG_Q | GLOBALFLAG_U) x @{$progs->{globals}}; + my @globalflags = (GLOBALFLAG_Q | GLOBALFLAG_U) x (@{$progs->{globals}} + 2); for(@{$progs->{functions}}) { @@ -1181,7 +1181,7 @@ sub parse_progs($) die "Out of range name in globaldef $_" if $g->{s_name} < 0 || $g->{s_name} >= length $p{strings}; my $name = $p{getstring}->($g->{s_name}); - die "Out of range ofs in globaldef $_ (name: \"$name\")" + die "Out of range ofs $g->{ofs} in globaldef $_ (name: \"$name\")" if $g->{ofs} >= $p{globals}; } @@ -1195,7 +1195,7 @@ sub parse_progs($) die "Out of range name in fielddef $_" if $g->{s_name} < 0 || $g->{s_name} >= length $p{strings}; my $name = $p{getstring}->($g->{s_name}); - die "Out of range ofs in globaldef $_ (name: \"$name\")" + die "Out of range ofs $g->{ofs} in fielddef $_ (name: \"$name\")" if $g->{ofs} >= $p{header}{entityfields}; } @@ -1249,6 +1249,7 @@ sub parse_progs($) next unless defined $type; + use Data::Dumper; warn Dumper $s; if($type eq 'inglobal' || $type eq 'inglobalfunc') { $s->{$_} &= 0xFFFF; @@ -1258,8 +1259,18 @@ sub parse_progs($) elsif($type eq 'inglobalvec') { $s->{$_} &= 0xFFFF; - die "Out of range global offset in statement $ip - cannot continue" - if $s->{$_} >= @{$p{globals}}-2; + if($c->{isreturn}) + { + die "Out of range global offset in statement $ip - cannot continue" + if $s->{$_} >= @{$p{globals}}; + print "Potentially out of range global offset in statement $ip - may crash engines" + if $s->{$_} >= @{$p{globals}}-2; + } + else + { + die "Out of range global offset in statement $ip - cannot continue" + if $s->{$_} >= @{$p{globals}}-2; + } } elsif($type eq 'outglobal') { -- 2.39.2