Hi All,
I've attached a patch for the src/modules/rlm_sql/sql.c file.
This patch fixes (I hope) 2 related problems. First, as pointed out by
[EMAIL PROTECTED] back in mid December, the logic in the
sql_userparse subroutine does not allow for multiple reply pairs for a
single attribute from the radgroupreply table. This patch fixes this by
explicitly checking to see if the attribute in question has an op value of
"+=".
Second, the Ascend Binary Filter attribute types could not be added because
the wrong(??) DEFINE value was being checked. I'm guessing that the name
used to be BINARY_FILTERS, but was later changed to ASCEND_BINARY
everywhere but here? The string BINARY_FILTERS does not seem to appear
anywhere else in the distribution but this one subroutine.
This patch also splits a variable "mode" that was serving two different
functions in this subroutine into two separate variables "querymode" and
"pairmode". Hopefully, this makes the code more understandable.
In testing this change, I noticed another small problem with handling reply
items from SQL. According to the docs, the "==" operator is not allowed as
a reply item. This is being permitted, probably to keep everyone sane
since the ability to add anything but the default '==' was just
added. From the "radreply" table, it seems that the operator "==" should
probably be treated as if it were just "=", but it is behaving like "+="
instead. This is pretty trivial, but I thought I'd mention it.
Hope this is useful.
--- sql.c.orig Sun Jan 13 14:04:20 2002
+++ sql.c Sun Jan 13 16:56:02 2002
@@ -240,38 +240,37 @@
* Purpose: Read entries from the database and fill VALUE_PAIR structures
*
*************************************************************************/
-int sql_userparse(VALUE_PAIR ** first_pair, SQL_ROW row, int mode) {
+int sql_userparse(VALUE_PAIR ** first_pair, SQL_ROW row, int querymode) {
DICT_ATTR *attr;
VALUE_PAIR *pair, *check;
char *ptr;
char buf[128];
+ int pairmode = T_EOL;
if ((attr = dict_attrbyname(row[2])) == (DICT_ATTR *) NULL) {
radlog(L_ERR | L_CONS, "rlm_sql: unknown attribute %s", row[2]);
return (-1);
}
+ if (row[4] != NULL && strlen(row[4]) > 0) {
+ ptr = row[4];
+ pairmode = gettoken(&ptr, buf, sizeof(buf));
+ }
+ if (pairmode <= T_EOL) pairmode = T_OP_CMP_EQ;
+
/*
* If attribute is already there, skip it because we checked usercheck
first
* and we want user settings to over ride group settings
*/
- if ((check = pairfind(*first_pair, attr->attr)) != NULL &&
-#if defined( BINARY_FILTERS )
+ if (pairmode != T_OP_ADD && (check = pairfind(*first_pair, attr->attr))
!= NULL &&
+#ifdef ASCEND_BINARY
attr->type != PW_TYPE_ABINARY &&
#endif
- mode == PW_VP_GROUPDATA)
+ querymode == PW_VP_GROUPDATA)
return 0;
- if (row[4] != NULL && strlen(row[4]) > 0) {
- ptr = row[4];
- if ((mode = gettoken(&ptr, buf, sizeof(buf))) <= T_EOL)
- mode = T_OP_CMP_EQ;
- } else {
- mode = T_OP_CMP_EQ;
- }
-
- pair = pairmake(row[2], row[3], mode);
+ pair = pairmake(row[2], row[3], pairmode);
pairadd(first_pair, pair);
return 0;
Randy Moore
Axion Information Technologies, Inc.
email [EMAIL PROTECTED]
phone 301-408-1200
fax 301-445-3947
-
List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html