/*@-onlytrans@*/ /* XXX miRE array, not refcounted. */ int mireAppend(rpmMireMode mode, int tag, const char * pattern, const unsigned char * table, miRE * mirep, int * nmirep) { miRE mire; int xx; if (*mirep == NULL) { (*mirep) = mireGetPool(_mirePool); mire = (*mirep); } else { void *use = (*mirep)->_item.use; void *pool = (*mirep)->_item.pool; /* XXX only the 1st element in the array has a usage mutex. */ (*mirep) = xrealloc((*mirep), ((*nmirep) + 1) * sizeof(*mire)); mire = (*mirep) + (*nmirep); memset(mire, 0, sizeof(*mire)); /* XXX ensure no segfault, copy the use/pool from 1st item. */ /*@-assignexpose@*/ mire->_item.use = use; mire->_item.pool = pool; /*@=assignexpose@*/ } (*nmirep)++; xx = mireSetCOptions(mire, mode, tag, 0, table); /*@-usereleased@*/ return mireRegcomp(mire, pattern); /*@=usereleased@*/ }
static rpmRC tagValidate(Spec spec, rpmTag tag, const char * value) /*@*/ { const char * tagN = tagName(tag); const char * pattern = rpmExpand("%{?pattern_", tagN, "}", NULL); rpmRC ec = RPMRC_OK; if (pattern && *pattern) { miRE mire; int xx; mire = mireNew(RPMMIRE_REGEX, tag); xx = mireSetCOptions(mire, RPMMIRE_REGEX, 0, 0, NULL); if (!xx) xx = mireRegcomp(mire, pattern); if (!xx) xx = mireRegexec(mire, value, strlen(value)); if (!xx) ec = RPMRC_OK; else { rpmlog(RPMLOG_ERR, _("line %d: invalid tag value(\"%s\") %s: %s\n"), spec->lineNum, pattern, tagN, spec->line); ec = RPMRC_FAIL; } mire = mireFree(mire); } pattern = _free(pattern); return ec; }
static void compileFiletriggersRegexp(/*@only@*/ char * raw, miRE mire) /*@modifies raw, mire @*/ { static int options = REG_NOSUB | REG_EXTENDED | REG_NEWLINE; int xx; xx = mireSetCOptions(mire, RPMMIRE_REGEX, 0, options, NULL); if (mireRegcomp(mire, raw) != 0) { rpmlog(RPMLOG_ERR, "failed to compile filetrigger filter: %s\n", raw); mire = mireFree(mire); } raw = _free(raw); }