default:
if ((p[1] >= '0') && (p[1] <= '9') &&
- (sscanf(p, "%3o", &x) == 1)) {
+ (sscanf(p + 1, "%3o", &x) == 1)) {
*q++ = x;
p += 2;
} else {
};
-static int radius_get_vp(REQUEST *request, const char *name, VALUE_PAIR **vp_p)
-
+int radius_get_vp(REQUEST *request, const char *name, VALUE_PAIR **vp_p)
{
const char *vp_name = name;
REQUEST *myrequest = request;
/*
* May not may not be found, but it *is* a known name.
*/
- *vp_p = pairfind(vps, da->attr);
+ *vp_p = pairfind(vps, da->attr, da->vendor);
return TRUE;
}
int cflags, int modreturn)
{
int result;
- int lint, rint;
+ uint32_t lint, rint;
VALUE_PAIR *vp = NULL;
#ifdef HAVE_REGEX_H
char buffer[1024];
* If so, try looking for it.
*/
da = dict_attrbyname(pleft);
- if (da && radius_find_compare(da->attr)) {
+ if (da && (da->vendor == 0) && radius_find_compare(da->attr)) {
VALUE_PAIR *check = pairmake(pleft, pright, token);
*presult = (radius_callback_compare(request, NULL, check, NULL, NULL) == 0);
+ RDEBUG3(" Callback returns %d",
+ *presult);
pairfree(&check);
- if (*presult) return TRUE;
- return FALSE;
+ return TRUE;
}
RDEBUG2(" (Attribute %s was not found)",
pleft);
- return FALSE;
+ *presult = 0;
+ return TRUE;
}
#ifdef HAVE_REGEX_H
myvp.operator = token;
*presult = paircmp(&myvp, vp);
+ RDEBUG3(" paircmp -> %d", *presult);
return TRUE;
} /* else it's not a VP in a list */
}
RDEBUG2(" (Right field is not a number at: %s)", pright);
return FALSE;
}
- rint = atoi(pright);
+ rint = strtoul(pright, NULL, 0);
if (!all_digits(pleft)) {
RDEBUG2(" (Left field is not a number at: %s)", pleft);
return FALSE;
}
- lint = atoi(pleft);
+ lint = strtoul(pleft, NULL, 0);
break;
default:
* Check for truth or falsehood.
*/
if (all_digits(pleft)) {
- lint = atoi(pleft);
+ lint = strtoul(pleft, NULL, 0);
result = (lint != 0);
} else {
* ! EXPR
*/
if (!found_condition && (*p == '!')) {
- RDEBUG4(">>> INVERT");
- invert = TRUE;
+ /*
+ * Don't change the results if we're not
+ * evaluating the condition.
+ */
+ if (evaluate_next_condition) {
+ RDEBUG4(">>> INVERT");
+ invert = TRUE;
+ }
p++;
while ((*p == ' ') || (*p == '\t')) p++;
}
if (invert) {
- if (evaluate_next_condition)
- RDEBUG2("%.*s Converting !%s -> %s",
- depth, filler,
- (result != FALSE) ? "TRUE" : "FALSE",
- (result == FALSE) ? "TRUE" : "FALSE");
-
- result = (result == FALSE);
+ if (evaluate_next_condition) {
+ RDEBUG2("%.*s Converting !%s -> %s",
+ depth, filler,
+ (result != FALSE) ? "TRUE" : "FALSE",
+ (result == FALSE) ? "TRUE" : "FALSE");
+ result = (result == FALSE);
+ }
invert = FALSE;
}
*/
token = gettoken(&p, comp, sizeof(comp));
if ((token < T_OP_NE) || (token > T_OP_CMP_EQ) ||
- (token == T_OP_CMP_TRUE) ||
- (token == T_OP_CMP_FALSE)) {
+ (token == T_OP_CMP_TRUE)) {
radlog(L_ERR, "Expected comparison at: %s", comp);
return FALSE;
}
rt, pright, cflags, modreturn)) {
return FALSE;
}
+ RDEBUG4(">>> Comparison returned %d", result);
if (invert) {
RDEBUG4(">>> INVERTING result");
found = FALSE;
for (j = 0; j < to_count; j++) {
- if (edited[j] || !to_list[j]) continue;
+ if (edited[j] || !to_list[j] || !from_list[i]) continue;
/*
* Attributes aren't the same, skip them.
cp = cf_itemtopair(ci);
+#ifndef NDEBUG
+ if (debug_flag && radius_find_compare(vp->attribute)) {
+ DEBUG("WARNING: You are modifying the value of virtual attribute %s. This is not supported.", vp->name);
+ }
+#endif
+
/*
* The VP && CF lists should be in sync. If they're
* not, panic.