Browse Source

* Use StrLCopy for copying string into buffer to prevent buffer overflow.
* Fixed Erase().

git-svn-id: branches/unicodertl@12187 -

yury 17 years ago
parent
commit
a81ed93beb
6 changed files with 39 additions and 22 deletions
  1. 2 10
      rtl/inc/file.inc
  2. 18 0
      rtl/inc/system.inc
  3. 2 10
      rtl/inc/text.inc
  4. 1 1
      rtl/inc/typefile.inc
  5. 11 1
      rtl/win/sysfile.inc
  6. 5 0
      rtl/win32/system.pp

+ 2 - 10
rtl/inc/file.inc

@@ -26,7 +26,7 @@ Begin
   FillChar(f,SizeOf(FileRec),0);
   FillChar(f,SizeOf(FileRec),0);
   FileRec(f).Handle:=UnusedHandle;
   FileRec(f).Handle:=UnusedHandle;
   FileRec(f).mode:=fmClosed;
   FileRec(f).mode:=fmClosed;
-  Move(Name[1],FileRec(f).Name,Length(Name)*SizeOf(RtlChar));
+  StrLCopy(FileRec(f).Name, PRtlChar(Name), SizeOf(FileRec(f).Name) div SizeOf(RtlChar));
 End;
 End;
 
 
 
 
@@ -370,8 +370,6 @@ End;
 
 
 
 
 Procedure Rename(var f : File;p:PRtlChar);[IOCheck];
 Procedure Rename(var f : File;p:PRtlChar);[IOCheck];
-var
-  len: longint;
 Begin
 Begin
   If InOutRes <> 0 then
   If InOutRes <> 0 then
    exit;
    exit;
@@ -380,13 +378,7 @@ Begin
      Do_Rename(PRtlChar(@FileRec(f).Name),p);
      Do_Rename(PRtlChar(@FileRec(f).Name),p);
      { check error code of do_rename }
      { check error code of do_rename }
      If InOutRes = 0 then
      If InOutRes = 0 then
-      begin
-        len:=StrLen(p)*SizeOf(RtlChar);
-        if len >= SizeOf(FileRec(f).Name) then
-          len:=SizeOf(FileRec(f).Name) - SizeOf(RtlChar);
-        Move(p^,FileRec(f).Name,len);
-        FileRec(f).Name[len]:=#0;
-      end;
+       StrLCopy(FileRec(f).Name, p, SizeOf(FileRec(f).Name) div SizeOf(RtlChar));
    End;
    End;
 End;
 End;
 
 

+ 18 - 0
rtl/inc/system.inc

@@ -215,6 +215,24 @@ begin
 end;
 end;
 
 
 
 
+Function StrLCopy(Dest,Source: PRtlChar; MaxLen: SizeInt): PRtlChar;
+var
+  counter: SizeInt;
+Begin
+  counter := 0;
+  while (Source^ <> #0) and (counter < MaxLen) do
+  Begin
+     Dest^ := Source^;
+     Inc(Dest);
+     Inc(Source);
+     Inc(counter);
+  end;
+  { terminate the string }
+  Dest^ := #0;
+  StrLCopy := Dest;
+end;
+
+
 { Include generic pascal only routines which are not defined in the processor
 { Include generic pascal only routines which are not defined in the processor
   specific include file }
   specific include file }
 {$I generic.inc}
 {$I generic.inc}

+ 2 - 10
rtl/inc/text.inc

@@ -89,7 +89,7 @@ Begin
     tlbsCRLF: TextRec(t).LineEnd := #13#10;
     tlbsCRLF: TextRec(t).LineEnd := #13#10;
     tlbsCR: TextRec(t).LineEnd := #13;
     tlbsCR: TextRec(t).LineEnd := #13;
   End;
   End;
-  Move(s[1],TextRec(t).Name,Length(s)*SizeOf(RtlChar));
+  StrLCopy(TextRec(t).Name, PRtlChar(s), SizeOf(TextRec(t).Name) div SizeOf(RtlChar));
 End;
 End;
 
 
 
 
@@ -191,8 +191,6 @@ End;
 
 
 
 
 Procedure Rename(var t : text;p:PRtlChar);[IOCheck];
 Procedure Rename(var t : text;p:PRtlChar);[IOCheck];
-var
-  len: longint;
 Begin
 Begin
   If InOutRes <> 0 then
   If InOutRes <> 0 then
    exit;
    exit;
@@ -201,13 +199,7 @@ Begin
      Do_Rename(PRtlChar(@TextRec(t).Name),p);
      Do_Rename(PRtlChar(@TextRec(t).Name),p);
      { check error code of do_rename }
      { check error code of do_rename }
      If InOutRes = 0 then
      If InOutRes = 0 then
-      begin
-        len:=StrLen(p)*SizeOf(RtlChar);
-        if len >= SizeOf(TextRec(t).Name) then
-          len:=SizeOf(TextRec(t).Name) - SizeOf(RtlChar);
-        Move(p^,TextRec(t).Name,len);
-        TextRec(t).Name[len]:=#0;
-      end;
+       StrLCopy(TextRec(t).Name, p, SizeOf(TextRec(t).Name) div SizeOf(RtlChar));
    End;
    End;
 End;
 End;
 
 

+ 1 - 1
rtl/inc/typefile.inc

@@ -23,7 +23,7 @@ Begin
   FillChar(f,SizeOF(FileRec),0);
   FillChar(f,SizeOF(FileRec),0);
   FileRec(f).Handle:=UnusedHandle;
   FileRec(f).Handle:=UnusedHandle;
   FileRec(f).mode:=fmClosed;
   FileRec(f).mode:=fmClosed;
-  Move(Name[1],FileRec(f).Name,Length(Name)*SizeOf(RtlChar));
+  StrLCopy(FileRec(f).Name, PRtlChar(Name), SizeOf(FileRec(f).Name) div SizeOf(RtlChar));
 End;
 End;
 
 
 
 

+ 11 - 1
rtl/win/sysfile.inc

@@ -53,10 +53,20 @@ end;
 
 
 
 
 procedure do_rename(p1,p2 : PRtlChar);
 procedure do_rename(p1,p2 : PRtlChar);
+{$if SizeOf(RtlChar)<>2}
+var
+  s1, s2: UnicodeString;
+{$endif}
 begin
 begin
   DoDirSeparators(p1);
   DoDirSeparators(p1);
   DoDirSeparators(p2);
   DoDirSeparators(p2);
-  if MoveFile(_W(p1),_W(p2))=0 then
+{$if SizeOf(RtlChar)<>2}
+  s1:=p1;
+  s2:=p2;
+  if MoveFile(PWideChar(s1),PWideChar(s2))=0 then
+{$else}
+  if MoveFile(p1,p2)=0 then
+{$endif}
    Begin
    Begin
       errno:=GetLastError;
       errno:=GetLastError;
       Errno2InoutRes;
       Errno2InoutRes;

+ 5 - 0
rtl/win32/system.pp

@@ -126,6 +126,11 @@ begin
   Result:=PWideChar(UnicodeString(s));
   Result:=PWideChar(UnicodeString(s));
 end;
 end;
 
 
+function _W(p: PWideChar): PWideChar; inline;
+begin
+  Result:=p;
+end;
+
 var
 var
   EntryInformation : TEntryInformation;
   EntryInformation : TEntryInformation;
   SysInstance : Longint;public name '_FPC_SysInstance';
   SysInstance : Longint;public name '_FPC_SysInstance';