Browse Source

FIX: MacCloud/DropBox: potential out-of-bounds issues in TStringUtil.stringToWidechars()

rich2014 5 months ago
parent
commit
f1b4f2204f

+ 4 - 5
plugins/wfx/MacCloud/src/maccloudfunc.pas

@@ -81,11 +81,10 @@ end;
 
 procedure wfxLogProc( const MsgType: Integer; const message: String );
 var
-  buffer: Array [1..1024*10] of widechar;
+  buffer: Array [0..1024*10-1] of widechar;
 begin
-  FillChar( buffer{%H-}, SizeOf(buffer), #0 );
-  TStringUtil.stringToWidechars( @buffer[1], 'MacCloud: ' + message );
-  LogProc( PluginNumber, MsgType, @buffer[1] );
+  TStringUtil.stringToWidechars( buffer, 'MacCloud: ' + message, sizeof(buffer) );
+  LogProc( PluginNumber, MsgType, buffer );
 end;
 
 function FsInitW(PluginNr:integer;pProgressProc:tProgressProcW;pLogProc:tLogProcW;
@@ -122,7 +121,7 @@ begin
   FindData.nFileSizeHigh:= li.HighPart;
   FindData.ftCreationTime:= DateTimeToFileTime( dbFile.clientModified );
   FindData.ftLastWriteTime:= DateTimeToFileTime( dbFile.serverModified );
-  TStringUtil.stringToWidechars( @FindData.cFileName[0], dbFile.name );
+  TStringUtil.stringToWidechars( FindData.cFileName, dbFile.name, sizeof(FindData.cFileName) );
   dbFile.Free;
 end;
 

+ 22 - 8
plugins/wfx/MacCloud/src/util/uminiutil.pas

@@ -54,8 +54,8 @@ type
   TStringUtil = class
   public
     class function generateRandomString( const length: Integer ): String;
-    class function widecharsToString(const S: pwidechar): String;
-    class procedure stringToWidechars(const buffer: pwidechar; const S: String);
+    class function widecharsToString(const p: pwidechar): String;
+    class procedure stringToWidechars(const buffer: pwidechar; const s: String; const maxLength: Integer);
   end;
 
   { TJsonUtil }
@@ -186,21 +186,35 @@ begin
   randomString.Free;
 end;
 
-class function TStringUtil.widecharsToString(const S: pwidechar): String;
+class function TStringUtil.widecharsToString(const p: pwidechar): String;
 var
   str: NSString;
 begin
-  str:= NSString.stringWithCharacters_length( @s[0], StrLen(s) );
+  str:= NSString.stringWithCharacters_length( @p[0], StrLen(p) );
   Result:= str.UTF8String;
 end;
 
-class procedure TStringUtil.stringToWidechars(const buffer: pwidechar;
-  const S: String);
+class procedure TStringUtil.stringToWidechars(
+  const buffer: pwidechar;
+  const s: String;
+  const maxLength: Integer );
 var
   str: NSString;
+  range: NSRange;
+  usedLength: Integer;
 begin
-  str:= StringToNSString( S );
-  str.getCharacters( unicharPtr(buffer) );
+  str:= StringToNSString( s );
+  range.location:= 0;
+  range.length:= str.length;
+  str.getBytes_maxLength_usedLength_encoding_options_range_remainingRange(
+    pchar(buffer),
+    maxLength - 2,
+    @usedLength,
+    NSUnicodeStringEncoding,
+    0,
+    range,
+    nil );
+  buffer[usedLength div 2]:= #0;
 end;
 
 { TJsonUtil }