Ignore:
Timestamp:
Feb 1, 2018, 5:55:09 PM (23 months ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCmMetadata: Fixed skipping values of unknown fields. Detect garbages after '|' and '>' before string block.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdbin/ROCmBinaries.cpp

    r3693 r3694  
    327327        // multiline
    328328        bool newLineFold = *ptr=='>';
    329         while (ptr != end && *ptr!='\n') ptr++;
     329        ptr++;
     330        skipSpacesToLineEnd(ptr, end);
     331        if (ptr!=end && *ptr!='\n')
     332            throw ParseException(lineNo, "Garbages at string block");
    330333        if (ptr == end)
    331334            return ""; // end
     
    569572};
    570573
    571 static void skipYAMLValue(const char* ptr, const char* end, size_t& lineNo,
    572                 cxuint prevIndent)
     574static void skipYAMLValue(const char*& ptr, const char* end, size_t& lineNo,
     575                cxuint prevIndent, bool singleValue = true)
    573576{
    574577    skipSpacesToLineEnd(ptr, end);
    575     if (ptr == end || *ptr=='\n')
    576         return;
    577     if (ptr==end || (*ptr!='\'' && *ptr!='"' && *ptr!='|' && *ptr!='>' && *ptr !='['))
    578     {
    579         skipSpacesToLineEnd(ptr, end);
    580         if (ptr!=end) ptr++;
     578    if (ptr==end || (*ptr!='\'' && *ptr!='"' && *ptr!='|' && *ptr!='>' && *ptr !='[' &&
     579                *ptr!='#' && *ptr!='\n'))
     580    {
     581        while (ptr!=end && *ptr!='\n') ptr++;
     582        skipSpacesToNextLine(ptr, end, lineNo);
    581583        return;
    582584    }
     
    598600            throw ParseException(lineNo, "Unterminated string");
    599601        ptr++;
    600         skipSpacesToNextLine(ptr, end, lineNo);
     602        if (singleValue)
     603            skipSpacesToNextLine(ptr, end, lineNo);
    601604    }
    602605    else if (*ptr=='[')
     
    607610        {
    608611            // parse in line
    609             skipYAMLValue(ptr, end, lineNo, 0);
    610             if (ptr!=end && *ptr==',')
    611                 throw ParseException(lineNo, "Expected ','");
    612             else if (ptr!=end && *ptr==']')
     612            if (ptr!=end && (*ptr=='\'' || *ptr=='"'))
     613                skipYAMLValue(ptr, end, lineNo, 0, false);
     614            else
     615                while (ptr!=end && *ptr!='\n' &&
     616                            *ptr!='#' && *ptr!=',' && *ptr!=']') ptr++;
     617            skipSpacesAndComments(ptr, end, lineNo);
     618           
     619            if (ptr!=end && *ptr==']')
    613620                // just end
    614621                break;
     622            else if (ptr!=end && *ptr!=',')
     623                throw ParseException(lineNo, "Expected ','");
    615624            ptr++;
    616625            skipSpacesAndComments(ptr, end, lineNo);
     
    625634        if (ptr!=end && (*ptr=='|' || *ptr=='>'))
    626635            ptr++; // skip '|' or '>'
    627         skipSpacesToLineEnd(ptr, end);
     636        if (ptr!=end && *ptr=='#')
     637            while (ptr!=end && *ptr!='\n') ptr++;
     638        else
     639            skipSpacesToLineEnd(ptr, end);
    628640        if (ptr!=end && *ptr!='\n')
    629641            throw ParseException(lineNo, "Garbages before block or children");
     
    641653                continue;
    642654            }
    643             if (ptr-lineStart < prevIndent)
     655            if (ptr-lineStart <= prevIndent)
    644656            {
    645657                ptr = lineStart;
    646658                break;
     659            }
     660           
     661            while (ptr!=end && *ptr!='\n') ptr++;
     662            if (ptr!=end)
     663            {
     664                lineNo++;
     665                ptr++;
    647666            }
    648667        }
Note: See TracChangeset for help on using the changeset viewer.