浏览代码

* Fix anumval wrong overwriting as found out by Sergey

git-svn-id: trunk@17861 -
pierre 14 年之前
父节点
当前提交
c07bcefb6b
共有 1 个文件被更改,包括 23 次插入16 次删除
  1. 23 16
      compiler/ogbase.pas

+ 23 - 16
compiler/ogbase.pas

@@ -1805,27 +1805,34 @@ implementation
           if oneval<>'' then
           if oneval<>'' then
             begin
             begin
               if oneval[1]='-' then
               if oneval[1]='-' then
-                val(oneval,signedval,code)
+                begin
+                  val(oneval,signedval,code);
+                  anumval:=qword(signedval);
+                end
               else
               else
                 val(oneval,anumval,code);
                 val(oneval,anumval,code);
               if code<>0 then
               if code<>0 then
                 Comment(V_Error,'Invalid number '+avalue)
                 Comment(V_Error,'Invalid number '+avalue)
-              else if (indexpos<MAXVAL) then
+              else
                 begin
                 begin
-                  anumval:=qword(signedval);
-                  if source_info.endian<>target_info.endian then
-                    swapendian(anumval);
-                  { No range checking here }
-
-                  if bytesize=1 then
-                    bytevalues[indexpos]:=byte(anumval)
-                  else if bytesize=2 then
-                    twobytevalues[indexpos]:=word(anumval)
-                  else if bytesize=4 then
-                    fourbytevalues[indexpos]:=dword(anumval)
-                  else if bytesize=8 then
-                    eightbytevalues[indexpos]:=anumval;
-                  inc(indexpos);
+                  if (indexpos<MAXVAL) then
+                    begin
+                      if source_info.endian<>target_info.endian then
+                        swapendian(anumval);
+                      { No range checking here }
+
+                      if bytesize=1 then
+                        bytevalues[indexpos]:=byte(anumval)
+                      else if bytesize=2 then
+                        twobytevalues[indexpos]:=word(anumval)
+                      else if bytesize=4 then
+                        fourbytevalues[indexpos]:=dword(anumval)
+                      else if bytesize=8 then
+                        eightbytevalues[indexpos]:=anumval;
+                      inc(indexpos);
+                    end
+                  else
+                    Comment(V_Error,'Buffer overrun in Order_values');
                 end;
                 end;
             end;
             end;
         until allvals='';
         until allvals='';