VirtualBox

Changeset 92185 in vbox for trunk/src/bldprogs


Ignore:
Timestamp:
Nov 2, 2021 9:52:35 PM (3 years ago)
Author:
vboxsync
Message:

scm: Check UTF-8 encoding and reject files with bidirectional control codes in them.

Location:
trunk/src/bldprogs
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bldprogs/scm.cpp

    r82968 r92185  
    115115    SCMOPT_SKIP_SVN_SYNC_PROCESS,
    116116    SCMOPT_DONT_SKIP_SVN_SYNC_PROCESS,
     117    SCMOPT_SKIP_UNICODE_CHECKS,
     118    SCMOPT_DONT_SKIP_UNICODE_CHECKS,
    117119    SCMOPT_TAB_SIZE,
    118120    SCMOPT_WIDTH,
     
    203205    /* .fSetSvnKeywords = */                        false,
    204206    /* .fSkipSvnSyncProcess = */                    false,
     207    /* .fSkipUnicodeChecks = */                     false,
    205208    /* .cchTab = */                                 8,
    206209    /* .cchWidth = */                               130,
     
    266269    { "--skip-svn-sync-process",            SCMOPT_SKIP_SVN_SYNC_PROCESS,           RTGETOPT_REQ_NOTHING },
    267270    { "--dont-skip-svn-sync-process",       SCMOPT_DONT_SKIP_SVN_SYNC_PROCESS,      RTGETOPT_REQ_NOTHING },
     271    { "--skip-unicode-checks",              SCMOPT_SKIP_UNICODE_CHECKS,             RTGETOPT_REQ_NOTHING },
     272    { "--dont-skip-unicode-checks",         SCMOPT_DONT_SKIP_UNICODE_CHECKS,        RTGETOPT_REQ_NOTHING },
    268273    { "--tab-size",                         SCMOPT_TAB_SIZE,                        RTGETOPT_REQ_UINT8   },
    269274    { "--width",                            SCMOPT_WIDTH,                           RTGETOPT_REQ_UINT8   },
     
    305310SCM_REWRITER_CFG(g_SvnKeywords,                     "svn-keywords",                 rewrite_SvnKeywords);
    306311SCM_REWRITER_CFG(g_SvnSyncProcess,                  "svn-sync-process",             rewrite_SvnSyncProcess);
     312SCM_REWRITER_CFG(g_UnicodeChecks,                   "unicode-checks",               rewrite_UnicodeChecks);
    307313SCM_REWRITER_CFG(g_Copyright_CstyleComment,         "copyright-c-style",            rewrite_Copyright_CstyleComment);
    308314SCM_REWRITER_CFG(g_Copyright_HashComment,           "copyright-hash-style",         rewrite_Copyright_HashComment);
     
    348354    &g_Fix_C_and_CPP_Todos,
    349355    &g_Fix_Err_H,
     356    &g_UnicodeChecks,
    350357    &g_C_and_CPP,
    351358};
     
    356363    &g_SvnNoExecutable,
    357364    &g_SvnSyncProcess,
     365    &g_UnicodeChecks,
    358366    &g_Makefile_kup
    359367};
     
    367375    &g_SvnKeywords,
    368376    &g_SvnSyncProcess,
     377    &g_UnicodeChecks,
    369378    &g_Copyright_HashComment,
    370379    &g_Makefile_kmk
     
    379388    &g_SvnKeywords,
    380389    &g_SvnSyncProcess,
     390    &g_UnicodeChecks,
    381391    &g_Copyright_HashComment,
    382392};
     
    391401    &g_SvnKeywords,
    392402    &g_SvnSyncProcess,
     403    &g_UnicodeChecks,
    393404    &g_Copyright_CstyleComment,
    394405    &g_FixFlowerBoxMarkers,
    395406    &g_Fix_C_and_CPP_Todos,
    396407    &g_Fix_Err_H,
    397     &g_C_and_CPP
     408    &g_C_and_CPP,
    398409};
    399410
     
    407418    &g_SvnKeywords,
    408419    &g_SvnSyncProcess,
     420    &g_UnicodeChecks,
    409421    &g_Copyright_CstyleComment,
    410422    /// @todo &g_FixFlowerBoxMarkers,
     
    422434    &g_SvnKeywords,
    423435    &g_SvnSyncProcess,
     436    &g_UnicodeChecks,
    424437    &g_Copyright_CstyleComment,
    425438};
     
    433446    &g_SvnKeywords,
    434447    &g_SvnSyncProcess,
     448    &g_UnicodeChecks,
    435449    &g_Copyright_CstyleComment,
    436450};
     
    445459    &g_SvnKeywords,
    446460    &g_SvnSyncProcess,
     461    &g_UnicodeChecks,
    447462    &g_Copyright_CstyleComment,
    448463};
     
    457472    &g_SvnKeywords,
    458473    &g_SvnSyncProcess,
     474    &g_UnicodeChecks,
    459475    &g_Copyright_SemicolonComment,
    460476};
     
    469485    &g_SvnKeywords,
    470486    &g_SvnSyncProcess,
     487    &g_UnicodeChecks,
    471488    &g_Copyright_SemicolonComment,
    472489};
     
    478495    &g_StripTrailingBlanks,
    479496    &g_SvnSyncProcess,
     497    &g_UnicodeChecks,
    480498    &g_Copyright_HashComment,
    481499};
     
    487505    &g_StripTrailingBlanks,
    488506    &g_SvnSyncProcess,
     507    &g_UnicodeChecks,
    489508    &g_Copyright_RemComment,
    490509};
     
    496515    &g_StripTrailingBlanks,
    497516    &g_SvnSyncProcess,
     517    &g_UnicodeChecks,
    498518    &g_Copyright_TickComment,
    499519};
     
    505525    &g_StripTrailingBlanks,
    506526    &g_SvnSyncProcess,
     527    &g_UnicodeChecks,
    507528    &g_Copyright_HashComment,
    508529};
     
    516537    &g_SvnKeywords,
    517538    &g_SvnSyncProcess,
     539    &g_UnicodeChecks,
    518540    &g_Copyright_PythonComment,
    519541};
     
    527549    &g_SvnKeywords,
    528550    &g_SvnSyncProcess,
     551    &g_UnicodeChecks,
    529552    &g_Copyright_HashComment,
    530553};
     
    539562    &g_SvnNoExecutable,
    540563    &g_SvnSyncProcess,
     564    &g_UnicodeChecks,
    541565    &g_Copyright_SemicolonComment,
    542566};
     
    551575    &g_SvnNoExecutable,
    552576    &g_SvnSyncProcess,
     577    &g_UnicodeChecks,
    553578    &g_Copyright_SemicolonComment,
    554579};
     
    563588    &g_SvnKeywords,
    564589    &g_SvnSyncProcess,
     590    &g_UnicodeChecks,
    565591    &g_Copyright_CstyleComment,
    566592    &g_FixFlowerBoxMarkers,
     
    577603    &g_SvnKeywords,
    578604    &g_SvnSyncProcess,
     605    &g_UnicodeChecks,
    579606    &g_Copyright_HashComment,
    580607};
     
    596623    &g_SvnKeywords,
    597624    &g_SvnSyncProcess,
     625    &g_UnicodeChecks,
    598626    /** @todo copyright is in an XML comment. */
    599627};
     
    608636    &g_SvnKeywords,
    609637    &g_SvnSyncProcess,
     638    &g_UnicodeChecks,
    610639    /** @todo copyright is in an XML comment. */
    611640};
     
    620649    &g_SvnKeywords,
    621650    &g_SvnSyncProcess,
     651    &g_UnicodeChecks,
    622652    /** @todo copyright is in an XML comment. */
    623653};
     
    631661    &g_SvnKeywords,
    632662    &g_SvnSyncProcess,
     663    &g_UnicodeChecks,
    633664    &g_Copyright_HashComment,
    634665};
     
    640671    &g_SvnKeywords,
    641672    &g_SvnSyncProcess,
     673    &g_UnicodeChecks,
    642674    /** @todo figure out copyright for Qt resource XML files. */
    643675};
     
    655687    &g_SvnKeywords,
    656688    &g_SvnSyncProcess,
     689    &g_UnicodeChecks,
    657690    /** @todo copyright is in an XML 'comment' element. */
    658691};
     
    667700    &g_SvnNoExecutable,
    668701    &g_SvnSyncProcess,
     702    &g_UnicodeChecks,
    669703    &g_Copyright_SemicolonComment,
    670704};
     
    679713    &g_SvnNoExecutable,
    680714    &g_SvnSyncProcess,
     715    &g_UnicodeChecks,
    681716    &g_Copyright_SqlComment,
    682717};
     
    691726    &g_SvnNoExecutable,
    692727    &g_SvnSyncProcess,
     728    &g_UnicodeChecks,
    693729    &g_Copyright_CstyleComment,
    694730};
     
    701737    &g_SvnNoExecutable,
    702738    &g_SvnSyncProcess,
     739    &g_UnicodeChecks,
    703740    /** @todo check for plain copyright + license in text files. */
    704741};
     
    711748    &g_SvnNoExecutable,
    712749    &g_SvnSyncProcess,
     750    &g_UnicodeChecks,
    713751};
    714752
     
    726764    &g_AdjustTrailingLines,
    727765    &g_SvnSyncProcess,
     766    &g_UnicodeChecks,
    728767    &g_Copyright_HashComment,
    729768};
     
    12131252        case SCMOPT_DONT_SKIP_SVN_SYNC_PROCESS:
    12141253            pSettings->fSkipSvnSyncProcess = false;
     1254            return VINF_SUCCESS;
     1255
     1256        case SCMOPT_SKIP_UNICODE_CHECKS:
     1257            pSettings->fSkipUnicodeChecks = true;
     1258            return VINF_SUCCESS;
     1259        case SCMOPT_DONT_SKIP_UNICODE_CHECKS:
     1260            pSettings->fSkipUnicodeChecks = false;
    12151261            return VINF_SUCCESS;
    12161262
     
    28292875            case SCMOPT_SET_SVN_KEYWORDS:       RTPrintf("      Default: %RTbool\n", g_Defaults.fSetSvnKeywords); break;
    28302876            case SCMOPT_SKIP_SVN_SYNC_PROCESS:  RTPrintf("      Default: %RTbool\n", g_Defaults.fSkipSvnSyncProcess); break;
     2877            case SCMOPT_SKIP_UNICODE_CHECKS:    RTPrintf("      Default: %RTbool\n", g_Defaults.fSkipUnicodeChecks); break;
    28312878            case SCMOPT_TAB_SIZE:               RTPrintf("      Default: %u\n", g_Defaults.cchTab); break;
    28322879            case SCMOPT_WIDTH:                  RTPrintf("      Default: %u\n", g_Defaults.cchWidth); break;
  • trunk/src/bldprogs/scm.h

    r85121 r92185  
    250250FNSCMREWRITER rewrite_SvnKeywords;
    251251FNSCMREWRITER rewrite_SvnSyncProcess;
     252FNSCMREWRITER rewrite_UnicodeChecks;
    252253FNSCMREWRITER rewrite_Copyright_CstyleComment;
    253254FNSCMREWRITER rewrite_Copyright_HashComment;
     
    374375    /** Skip checking svn:sync-process. */
    375376    bool            fSkipSvnSyncProcess;
     377    /** Skip the unicode checks. */
     378    bool            fSkipUnicodeChecks;
    376379    /** Tab size. */
    377380    uint8_t         cchTab;
  • trunk/src/bldprogs/scmrw.cpp

    r82968 r92185  
    10591059    else if (rc != VERR_NOT_FOUND)
    10601060        ScmError(pState, rc, "ScmSvnQueryProperty: %Rrc\n", rc);
     1061
     1062    return false;
     1063}
     1064
     1065/**
     1066 * Checks the that there is no bidirectional unicode fun in the file.
     1067 *
     1068 * @returns false - the state carries these kinds of changes.
     1069 * @param   pState              The rewriter state.
     1070 * @param   pIn                 The input stream.
     1071 * @param   pOut                The output stream.
     1072 * @param   pSettings           The settings.
     1073 */
     1074bool rewrite_UnicodeChecks(PSCMRWSTATE pState, PSCMSTREAM pIn, PSCMSTREAM pOut, PCSCMSETTINGSBASE pSettings)
     1075{
     1076    RT_NOREF2(pIn, pOut);
     1077    if (pSettings->fSkipUnicodeChecks)
     1078        return false;
     1079
     1080    /*
     1081     * Just scan the input for weird stuff and fail if we find anything we don't like.
     1082     */
     1083    uint32_t    iLine = 0;
     1084    SCMEOL      enmEol;
     1085    size_t      cchLine;
     1086    const char *pchLine;
     1087    while ((pchLine = ScmStreamGetLine(pIn, &cchLine, &enmEol)) != NULL)
     1088    {
     1089        iLine++;
     1090        const char *pchCur  = pchLine;
     1091        size_t      cchLeft = cchLine;
     1092        while (cchLeft > 0)
     1093        {
     1094            RTUNICP uc = 0;
     1095            int rc = RTStrGetCpNEx(&pchCur, &cchLeft, &uc);
     1096            if (RT_SUCCESS(rc))
     1097            {
     1098                const char *pszWhat;
     1099                switch (uc)
     1100                {
     1101                    default:
     1102                        continue;
     1103
     1104                    /* Potentially evil bi-directional control codes (Table I, trojan-source.pdf):  */
     1105                    case 0x202a: pszWhat = "LRE - left-to-right embedding"; break;
     1106                    case 0x202b: pszWhat = "RLE - right-to-left embedding"; break;
     1107                    case 0x202d: pszWhat = "LRO - left-to-right override"; break;
     1108                    case 0x202e: pszWhat = "RLO - right-to-left override"; break;
     1109                    case 0x2066: pszWhat = "LRI - left-to-right isolate"; break;
     1110                    case 0x2067: pszWhat = "RLI - right-to-left isolate"; break;
     1111                    case 0x2068: pszWhat = "FSI - first strong isolate"; break;
     1112                    case 0x202c: pszWhat = "PDF - pop directional formatting (LRE, RLE, LRO, RLO)"; break;
     1113                    case 0x2069: pszWhat = "PDI - pop directional isolate (LRI, RLI)"; break;
     1114
     1115                    /** @todo add checks for homoglyphs too. */
     1116                }
     1117#if 1
     1118                ScmError(pState, rc, "%u:%zu: Evil unicode codepoint: %s\n", iLine, pchCur - pchLine, pszWhat);
     1119#else
     1120                ScmVerbose(pState, 0, "%u:%zu: Evil unicode codepoint: %s\n", iLine, pchCur - pchLine, pszWhat);
     1121#endif
     1122            }
     1123            else
     1124#if 1
     1125                ScmError(pState, rc, "%u:%zu: Invalid UTF-8 encoding: %Rrc\n", iLine, pchCur - pchLine, rc);
     1126#else
     1127                ScmVerbose(pState, 0, "%u:%zu: Invalid UTF-8 encoding: %Rrc\n", iLine, pchCur - pchLine, rc);
     1128#endif
     1129        }
     1130    }
    10611131
    10621132    return false;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette