static int SelectModeMatch(struct stat *lstatptr, Rlist *list) { mode_t newperm, plus, minus; Rlist *rp; for (rp = list; rp != NULL; rp = rp->next) { plus = 0; minus = 0; if (!ParseModeString(RlistScalarValue(rp), &plus, &minus)) { Log(LOG_LEVEL_ERR, "Problem validating a mode string '%s' in search filter", RlistScalarValue(rp)); continue; } newperm = (lstatptr->st_mode & 07777); newperm |= plus; newperm &= ~minus; if ((newperm & 07777) == (lstatptr->st_mode & 07777)) { return true; } } return false; }
static int SelectModeMatch(struct stat *lstatptr, Rlist *list) { mode_t newperm, plus, minus; Rlist *rp; for (rp = list; rp != NULL; rp = rp->next) { plus = 0; minus = 0; if (!ParseModeString(rp->item, &plus, &minus)) { CfOut(cf_error, "", " !! Problem validating a mode string \"%s\" in search filter", ScalarValue(rp)); continue; } newperm = (lstatptr->st_mode & 07777); newperm |= plus; newperm &= ~minus; if ((newperm & 07777) == (lstatptr->st_mode & 07777)) { return true; } } return false; }
static int CheckParseString(char *lval, char *s, const char *range) { char output[CF_BUFSIZE]; CfDebug("\nCheckParseString(%s => %s/%s)\n", lval, s, range); if (s == NULL) { return true; } if (strlen(range) == 0) { return true; } if (IsNakedVar(s, '@') || IsNakedVar(s, '$')) { CfDebug("Validation: Unable to verify variable expansion of %s at this stage\n", s); return false; } /* Deal with complex strings as special cases */ if (strcmp(lval, "mode") == 0 || strcmp(lval, "search_mode") == 0) { mode_t plus, minus; if (!ParseModeString(s, &plus, &minus)) { snprintf(output, CF_BUFSIZE, "Error parsing Unix permission string %s)", s); ReportError(output); return false; } } if (FullTextMatch(range, s)) { return true; } if (IsCf3VarString(s)) { CfDebug("Validation: Unable to verify syntax of %s due to variable expansion at this stage\n", s); } else { snprintf(output, CF_BUFSIZE, "Scalar item in %s => { %s } in rvalue is out of bounds (value should match pattern %s)", lval, s, range); ReportError(output); return false; } return true; }
static SyntaxTypeMatch CheckParseString(const char *lval, const char *s, const char *range) { if (s == NULL) { return SYNTAX_TYPE_MATCH_OK; } if (strlen(range) == 0) { return SYNTAX_TYPE_MATCH_OK; } if (IsNakedVar(s, '@') || IsNakedVar(s, '$')) { return SYNTAX_TYPE_MATCH_ERROR_UNEXPANDED; } /* Deal with complex strings as special cases */ if (strcmp(lval, "mode") == 0 || strcmp(lval, "search_mode") == 0) { mode_t plus, minus; if (!ParseModeString(s, &plus, &minus)) { return SYNTAX_TYPE_MATCH_ERROR_STRING_UNIX_PERMISSION; } } /* FIXME: review this strcmp. Moved out from StringMatch */ if (!strcmp(range, s) || StringMatchFull(range, s)) { return SYNTAX_TYPE_MATCH_OK; } if (IsCf3VarString(s)) { return SYNTAX_TYPE_MATCH_ERROR_UNEXPANDED; } else if ('\0' == s[0]) { return SYNTAX_TYPE_MATCH_ERROR_EMPTY_SCALAR_OUT_OF_RANGE; } else if (!strcmp(range, CF_ABSPATHRANGE)) { return SYNTAX_TYPE_MATCH_ERROR_ABSOLUTE_PATH; } else { return SYNTAX_TYPE_MATCH_ERROR_SCALAR_OUT_OF_RANGE; } return SYNTAX_TYPE_MATCH_OK; }
void test_validation(void) { int ret = false; mode_t minus = 0; mode_t plus = 0; int mode = 0; do { ret = ParseModeString( validation_modes[mode].string, &plus, &minus); assert_int_equal(validation_modes[mode].valid, ret); } while (validation_modes[mode++].string); }
void test_mode(void) { int ret = false; mode_t plus = 0; mode_t minus = 0; int mode = 0; do { ret = ParseModeString(modes[mode].string, &plus, &minus); assert_true(ret); assert_int_equal(modes[mode].plus, plus); assert_int_equal(modes[mode].minus, minus); } while (modes[mode++].string); }
static SyntaxTypeMatch CheckParseString(const char *lval, const char *s, const char *range) { CfDebug("\nCheckParseString(%s => %s/%s)\n", lval, s, range); if (s == NULL) { return SYNTAX_TYPE_MATCH_OK; } if (strlen(range) == 0) { return SYNTAX_TYPE_MATCH_OK; } if (IsNakedVar(s, '@') || IsNakedVar(s, '$')) { return SYNTAX_TYPE_MATCH_ERROR_UNEXPANDED; } /* Deal with complex strings as special cases */ if (strcmp(lval, "mode") == 0 || strcmp(lval, "search_mode") == 0) { mode_t plus, minus; if (!ParseModeString(s, &plus, &minus)) { return SYNTAX_TYPE_MATCH_ERROR_STRING_UNIX_PERMISSION; } } if (FullTextMatch(range, s)) { return SYNTAX_TYPE_MATCH_OK; } if (IsCf3VarString(s)) { return SYNTAX_TYPE_MATCH_ERROR_UNEXPANDED; } else { return SYNTAX_TYPE_MATCH_ERROR_SCALAR_OUT_OF_RANGE; } return SYNTAX_TYPE_MATCH_OK; }