projects
/
freeradius.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Keep track of "last in list" properly.
[freeradius.git]
/
src
/
main
/
valuepair.c
diff --git
a/src/main/valuepair.c
b/src/main/valuepair.c
index
bbcac46
..
96d76c3
100644
(file)
--- a/
src/main/valuepair.c
+++ b/
src/main/valuepair.c
@@
-46,8
+46,8
@@
RCSID("$Id$")
#endif
struct cmp {
#endif
struct cmp {
- int attribute;
- int otherattr;
+
unsigned
int attribute;
+
unsigned
int otherattr;
void *instance; /* module instance */
RAD_COMPARE_FUNC compare;
struct cmp *next;
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.
*/
/*
* 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(®);
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.
*/
/*
* 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(®);
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.
*/
* 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;
}
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)
* 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);
}
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.
*/
* See what attribute we want to compare with.
*/
-static int otherattr(int attr)
+static int otherattr(
unsigned
int attr)
{
struct cmp *c;
{
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.
*/
* 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;
{
struct cmp *c;
@@
-311,7
+344,7
@@
int paircompare_register(int attr, int compare_attr, RAD_COMPARE_FUNC fun, void
/*
* Unregister a function.
*/
/*
* 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;
{
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.");
}
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;
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) {
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;
}
}
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) {
* Don't move 'fallthrough' over.
*/
if (i->attribute == PW_FALL_THROUGH) {
+ tailfrom = i;
continue;
}
continue;
}
@@
-562,7
+596,7
@@
void pairxlatmove(REQUEST *req, VALUE_PAIR **to, VALUE_PAIR **from)
pairparsevalue(i, buffer);
}
pairparsevalue(i, buffer);
}
- found = pairfind(*to, i->attribute);
+ found = pairfind(*to, i->attribute
, i->vendor
);
switch (i->operator) {
/*
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)){
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
/*
* '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;
vp = found->next;
memcpy(found, i, sizeof(*found));
found->next = vp;
+ tailfrom = i;
continue;
}
break;
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,
* 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 */
{
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);
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;
}
fputc('\n', fr_log_fp);
vp = vp->next;
}
+ fflush(fr_log_fp);
}
}