Browse Source

* avoid crashes with negative len counts on fills/moves
* movechar0 was wrong and did not do the behavior as
described in docs

carl 23 years ago
parent
commit
c5783607c3
1 changed files with 20 additions and 18 deletions
  1. 20 18
      rtl/inc/generic.inc

+ 20 - 18
rtl/inc/generic.inc

@@ -29,6 +29,7 @@ type
 var
   i,size : longint;
 begin
+  if count <= 0 then exit;
   Dec(count);
   for i:=0 to count do
          bytearray(dest)[i]:=bytearray(source)[i];
@@ -44,7 +45,7 @@ type
 var
   i,v : longint;
 begin
-  if count = 0 then exit;
+  if count <= 0 then exit;
   v := 0;
   v:=(value shl 8) or (value and $FF);
   v:=(v shl 16) or (v and $ffff);
@@ -72,6 +73,7 @@ type
 var
   i,v : longint;
 begin
+  if Count <= 0 then exit;
   v:=value*$10000+value;
   for i:=0 to (count div 2) -1 do
     longintarray(x)[i]:=v;
@@ -85,18 +87,13 @@ end;
 procedure FillDWord(var x;count : longint;value : DWord);
 type
   longintarray = array [0..maxlongint div 4] of longint;
-var
-  i : longint;
 begin
-  if Count<>0 then
+  if count <= 0 then exit;
+  while Count<>0 do
    begin
-     i:=Count;
-     while i<>0 do
-      begin
-        { range checking must be disabled here }
-        longintarray(x)[i-1]:=value;
-        Dec(i);
-      end;
+     { range checking must be disabled here }
+     longintarray(x)[count-1]:=longint(value);
+     Dec(count);
    end;
 end;
 {$endif FPC_SYSTEM_HAS_FILLDWORD}
@@ -260,12 +257,12 @@ procedure MoveChar0(Const buf1;var buf2;len:longint);
 var
   I : longint;
 begin
-  if Len<> 0 then
-   begin
-     I:=IndexByte(Buf1,Len,0);
-     if I<>0 then
-      Move(Buf1,Buf2,I);
-   end;
+  if Len = 0 then exit;
+  I:=IndexByte(Buf1,Len,0);
+  if I<>-1 then
+    Move(Buf1,Buf2,I)
+  else
+    Move(Buf1,Buf2,len);
 end;
 {$endif ndef FPC_SYSTEM_HAS_MOVECHAR0}
 
@@ -951,7 +948,12 @@ end;
 
 {
   $Log$
-  Revision 1.42  2002-10-14 19:39:17  peter
+  Revision 1.43  2002-10-20 11:51:54  carl
+   * avoid crashes with negative len counts on fills/moves
+   * movechar0 was wrong and did not do the behavior as
+     described in docs
+
+  Revision 1.42  2002/10/14 19:39:17  peter
     * threads unit added for thread support
 
   Revision 1.41  2002/10/12 20:32:41  carl