From 218ce57b5b590b40893fa05dbf2e2b65e73659c6 Mon Sep 17 00:00:00 2001 From: michael Date: Tue, 29 Sep 2020 15:45:27 +0000 Subject: [PATCH] * More strict behaviour for identifiers, patch by Benito van der Zander (bug ID 37841) git-svn-id: trunk@47006 - --- packages/fcl-json/src/jsonscanner.pp | 37 ++++++++++++++++++---------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/packages/fcl-json/src/jsonscanner.pp b/packages/fcl-json/src/jsonscanner.pp index 700f5d0453..45ef299ac2 100644 --- a/packages/fcl-json/src/jsonscanner.pp +++ b/packages/fcl-json/src/jsonscanner.pp @@ -373,8 +373,9 @@ begin end else if u1<>0 then MaybeAppendUnicode; - if FTokenStr^ = #0 then - Error(SErrOpenString,[FCurRow]); + if FTokenStr^ < #$20 then + if FTokenStr^ = #0 then Error(SErrOpenString,[FCurRow]) + else if joStrict in Options then Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]); Inc(FTokenStr); end; if FTokenStr^ = #0 then @@ -530,23 +531,33 @@ begin tstart:=CurRow; Tcol:=CurColumn; TokenStart := FTokenStr; + Result:=tkIdentifier; + case TokenStart^ of + 't': if (TokenStart[1] = 'r') and (TokenStart[2] = 'u') and (TokenStart[3] = 'e') then + Result:=tkTrue; + 'f': if (TokenStart[1] = 'a') and (TokenStart[2] = 'l') and (TokenStart[3] = 's') and (TokenStart[4] = 'e') then + Result:=tkFalse; + 'n': if (TokenStart[1] = 'u') and (TokenStart[2] = 'l') and (TokenStart[3] = 'l') then + Result:=tkNull; + end; + if result <> tkIdentifier then inc(FTokenStr, length(TokenInfos[result]) - 1); repeat Inc(FTokenStr); until not (FTokenStr^ in ['A'..'Z', 'a'..'z', '0'..'9', '_']); SectionLength := FTokenStr - TokenStart; FCurTokenString:=''; SetString(FCurTokenString, TokenStart, SectionLength); - for it := tkTrue to tkNull do - if CompareText(CurTokenString, TokenInfos[it]) = 0 then - begin - Result := it; - FCurToken := Result; - exit; - end; - if (joStrict in Options) then - Error(SErrInvalidCharacter, [tStart,tcol,TokenStart[0]]) - else - Result:=tkIdentifier; + if (result = tkIdentifier) or (SectionLength <> length(TokenInfos[result])) then begin + if (joStrict in Options) then + Error(SErrInvalidCharacter, [tStart,tcol,TokenStart[0]]); + for it := tkTrue to tkNull do + if CompareText(CurTokenString, TokenInfos[it]) = 0 then + begin + Result := it; + FCurToken := Result; + exit; + end; + end; end; else Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);