X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fvaluepair.c;h=96d76c30476927a19e5c665bd43005ed8b8036e8;hb=06abdefb5b1f70a21af63dc369aaf6116565ec9b;hp=bbcac46bb6bf6f5872582a78446fb12a72317d20;hpb=dccdfcc4d4e420674acd6bf76c022a0c121c5f4e;p=freeradius.git diff --git a/src/main/valuepair.c b/src/main/valuepair.c index bbcac46..96d76c3 100644 --- a/src/main/valuepair.c +++ b/src/main/valuepair.c @@ -46,8 +46,8 @@ RCSID("$Id$") #endif struct cmp { - int attribute; - int otherattr; + unsigned int attribute; + unsigned int otherattr; void *instance; /* module instance */ RAD_COMPARE_FUNC compare; struct cmp *next; @@ -80,8 +80,15 @@ int radius_compare_vps(REQUEST *request, VALUE_PAIR *check, VALUE_PAIR *vp) /* * Include substring matches. */ - regcomp(®, (char *)check->vp_strvalue, - REG_EXTENDED); + compare = regcomp(®, check->vp_strvalue, REG_EXTENDED); + if (compare != 0) { + char buffer[256]; + regerror(compare, ®, buffer, sizeof(buffer)); + + RDEBUG("Invalid regular expression %s: %s", + check->vp_strvalue, buffer); + return -1; + } compare = regexec(®, value, REQUEST_MAX_REGEX + 1, rxmatch, 0); regfree(®); @@ -150,8 +157,16 @@ int radius_compare_vps(REQUEST *request, VALUE_PAIR *check, VALUE_PAIR *vp) /* * Include substring matches. */ - regcomp(®, (char *)check->vp_strvalue, - REG_EXTENDED); + compare = regcomp(®, (char *)check->vp_strvalue, + REG_EXTENDED); + if (compare != 0) { + char buffer[256]; + regerror(compare, ®, buffer, sizeof(buffer)); + + RDEBUG("Invalid regular expression %s: %s", + check->vp_strvalue, buffer); + return -1; + } compare = regexec(®, value, REQUEST_MAX_REGEX + 1, rxmatch, 0); regfree(®); @@ -166,7 +181,7 @@ int radius_compare_vps(REQUEST *request, VALUE_PAIR *check, VALUE_PAIR *vp) * Tagged attributes are equal if and only if both the * tag AND value match. */ - if ((ret == 0) && check->flags.has_tag) { + if (check->flags.has_tag) { ret = ((int) vp->flags.tag) - ((int) check->flags.tag); if (ret != 0) return ret; } @@ -251,7 +266,8 @@ int radius_callback_compare(REQUEST *req, VALUE_PAIR *request, * FIXME: use new RB-Tree code. */ for (c = cmp; c; c = c->next) - if (c->attribute == check->attribute) { + if ((c->attribute == check->attribute) && + (check->vendor == 0)) { return (c->compare)(c->instance, req, request, check, check_pairs, reply_pairs); } @@ -263,9 +279,26 @@ int radius_callback_compare(REQUEST *req, VALUE_PAIR *request, /* + * Find a comparison function for two attributes. + */ +int radius_find_compare(unsigned int attribute) +{ + struct cmp *c; + + for (c = cmp; c; c = c->next) { + if (c->attribute == attribute) { + return TRUE; + } + } + + return FALSE; +} + + +/* * See what attribute we want to compare with. */ -static int otherattr(int attr) +static int otherattr(unsigned int attr) { struct cmp *c; @@ -290,7 +323,7 @@ static int otherattr(int attr) * For example, PW_GROUP in a check item needs to be compared * with PW_USER_NAME in the incoming request. */ -int paircompare_register(int attr, int compare_attr, RAD_COMPARE_FUNC fun, void *instance) +int paircompare_register(unsigned int attr, int compare_attr, RAD_COMPARE_FUNC fun, void *instance) { struct cmp *c; @@ -311,7 +344,7 @@ int paircompare_register(int attr, int compare_attr, RAD_COMPARE_FUNC fun, void /* * Unregister a function. */ -void paircompare_unregister(int attr, RAD_COMPARE_FUNC fun) +void paircompare_unregister(unsigned int attr, RAD_COMPARE_FUNC fun) { struct cmp *c, *last; @@ -387,7 +420,7 @@ int paircompare(REQUEST *req, VALUE_PAIR *request, VALUE_PAIR *check, VALUE_PAIR DEBUG("WARNING: Are you sure you don't mean Cleartext-Password?"); DEBUG("WARNING: See \"man rlm_pap\" for more information."); } - if (pairfind(request, PW_USER_PASSWORD) == NULL) { + if (pairfind(request, PW_USER_PASSWORD, 0) == NULL) { continue; } break; @@ -402,7 +435,7 @@ int paircompare(REQUEST *req, VALUE_PAIR *request, VALUE_PAIR *check, VALUE_PAIR try_again: if (other >= 0) { for (; auth_item != NULL; auth_item = auth_item->next) { - if (auth_item->attribute == other || other == 0) + if (auth_item->attribute == (unsigned int) other || other == 0) break; } } @@ -540,6 +573,7 @@ void pairxlatmove(REQUEST *req, VALUE_PAIR **to, VALUE_PAIR **from) * Don't move 'fallthrough' over. */ if (i->attribute == PW_FALL_THROUGH) { + tailfrom = i; continue; } @@ -562,7 +596,7 @@ void pairxlatmove(REQUEST *req, VALUE_PAIR **to, VALUE_PAIR **from) pairparsevalue(i, buffer); } - found = pairfind(*to, i->attribute); + found = pairfind(*to, i->attribute, i->vendor); switch (i->operator) { /* @@ -574,7 +608,7 @@ void pairxlatmove(REQUEST *req, VALUE_PAIR **to, VALUE_PAIR **from) if (!i->vp_strvalue[0] || (strcmp((char *)found->vp_strvalue, (char *)i->vp_strvalue) == 0)){ - pairdelete(to, found->attribute); + pairdelete(to, found->attribute, found->vendor); /* * 'tailto' may have been @@ -612,6 +646,7 @@ void pairxlatmove(REQUEST *req, VALUE_PAIR **to, VALUE_PAIR **from) vp = found->next; memcpy(found, i, sizeof(*found)); found->next = vp; + tailfrom = i; continue; } break; @@ -660,13 +695,13 @@ void pairxlatmove(REQUEST *req, VALUE_PAIR **to, VALUE_PAIR **from) * it causes the server to exit! */ VALUE_PAIR *radius_paircreate(REQUEST *request, VALUE_PAIR **vps, - int attribute, int type) + unsigned int attribute, unsigned int vendor, int type) { VALUE_PAIR *vp; request = request; /* -Wunused */ - vp = paircreate(attribute, type); + vp = paircreate(attribute, vendor, type); if (!vp) { radlog(L_ERR, "No memory!"); rad_assert("No memory" == NULL); @@ -719,4 +754,5 @@ void debug_pair_list(VALUE_PAIR *vp) fputc('\n', fr_log_fp); vp = vp->next; } + fflush(fr_log_fp); }