瀏覽代碼

* Merging revisions 47342 from trunk:
------------------------------------------------------------------------
r47342 | michael | 2020-11-08 17:42:06 +0100 (Sun, 08 Nov 2020) | 1 line

* Fail with trailing garbage in joStrict mode, bug ID #0037837
------------------------------------------------------------------------

git-svn-id: branches/fixes_3_2@49319 -

michael 4 年之前
父節點
當前提交
c6175fdd3a
共有 2 個文件被更改,包括 24 次插入1 次删除
  1. 10 1
      packages/fcl-json/src/jsonreader.pp
  2. 14 0
      packages/fcl-json/tests/testjsonreader.pp

+ 10 - 1
packages/fcl-json/src/jsonreader.pp

@@ -179,7 +179,8 @@ Resourcestring
   SErrInvalidNumber          = 'Number is not an integer or real number: %s';
   SErrInvalidNumber          = 'Number is not an integer or real number: %s';
   SErrNoScanner = 'No scanner. No source specified ?';
   SErrNoScanner = 'No scanner. No source specified ?';
   SErrorAt = 'Error at line %d, Pos %d: ';
   SErrorAt = 'Error at line %d, Pos %d: ';
-  
+  SErrGarbageFound = 'Expected EOF, but got %s';
+
 { TBaseJSONReader }
 { TBaseJSONReader }
 
 
 
 
@@ -189,6 +190,14 @@ begin
   if (FScanner=Nil) then
   if (FScanner=Nil) then
     DoError(SErrNoScanner);
     DoError(SErrNoScanner);
   DoParse(False,True);
   DoParse(False,True);
+  if joStrict in Options then
+    begin
+    Repeat
+       GetNextToken;
+    Until CurrentToken<>tkWhiteSpace;
+    If CurrentToken<>tkEOF then
+      DoError(Format(SErrGarbageFound,[CurrentTokenString]));
+   end;
 end;
 end;
 
 
 {
 {

+ 14 - 0
packages/fcl-json/tests/testjsonreader.pp

@@ -75,6 +75,8 @@ type
     procedure TestMixed;
     procedure TestMixed;
     Procedure TestComment;
     Procedure TestComment;
     procedure TestErrors;
     procedure TestErrors;
+    procedure TestGarbageOK;
+    procedure TestGarbageFail;
   end;
   end;
 
 
   TTestReader = Class(TBaseTestReader)
   TTestReader = Class(TBaseTestReader)
@@ -450,6 +452,18 @@ begin
 
 
 end;
 end;
 
 
+procedure TBaseTestReader.TestGarbageOK;
+begin
+  TestRead('"a"sss',['string:a']);
+  TestRead('[null]xxx',['sa','null','ea']);
+end;
+
+procedure TBaseTestReader.TestGarbageFail;
+begin
+  DoTestError('"a"sss',[joStrict]);
+  DoTestError('[null]aaa',[joStrict]);
+end;
+
 
 
 procedure TBaseTestReader.CallNoHandlerStream;
 procedure TBaseTestReader.CallNoHandlerStream;