OK,

I found a bug that stoped sqlcounters working for me.

Basically sql_xlat in rlm_sql is doing
  rlm_sql_select_query(sqlsocket,ins...
  ...
  rlm_sql_fetch_row(sqlsocket, inst)
  (inst->module->sql_finish_select_query)(sqlsocket, inst->config);
  ...
  row = sqlsocket->row;

The problem is sqlsocket->row is freed by sql_finish_select.

Below is a patch to fix this.  It is against snapshot from 20021104.  I
checked cvs and this does not seem to fixed.  

--- rlm_sql.c.20021104  Mon Nov 11 11:52:25 2002
+++ rlm_sql.c   Mon Nov 11 12:02:04 2002
@@ -136,39 +136,42 @@
                return 0;
        }
 
        ret = rlm_sql_fetch_row(sqlsocket, inst);
-       (inst->module->sql_finish_select_query)(sqlsocket, inst->config);
 
        if (ret) {
                DEBUG("rlm_sql: SQL query did not succeed");
+               (inst->module->sql_finish_select_query)(sqlsocket, inst->config);
                sql_release_socket(inst,sqlsocket);
                return 0;
        }
 
        row = sqlsocket->row;
        if (row == NULL) {
                DEBUG("rlm_sql: SQL query did not return any results");
+               (inst->module->sql_finish_select_query)(sqlsocket, inst->config);
                sql_release_socket(inst,sqlsocket);
                return 0;
        }
 
        if (row[0] == NULL){
                DEBUG("rlm_sql: row[0] returned NULL");
+               (inst->module->sql_finish_select_query)(sqlsocket, inst->config);
                sql_release_socket(inst,sqlsocket);
                return 0;
        }
        ret = strlen(row[0]);
        if (ret > freespace){
                DEBUG("rlm_sql: sql_xlat:: Insufficient string space");
+               (inst->module->sql_finish_select_query)(sqlsocket, inst->config);
                sql_release_socket(inst,sqlsocket);
                return 0;
        }
 
        strncpy(out,row[0],ret);
 
        DEBUG("rlm_sql: - sql_xlat finished");
-
+               (inst->module->sql_finish_select_query)(sqlsocket, inst->config);
        sql_release_socket(inst,sqlsocket);
        return ret;
 }
 




>Hello,
>
>I am trying to use sqlcounter and oracle to implement download
>limits/quotas.
>
>I have:
>sqlcounter testquota {
>              counter-name = Test-Quota-Input-Octets
>              check-name = Test-Quota
>              sqlmod-inst = sql
>              key = User-Name
>              reset = daily
>
>              query = "SELECT SUM(acctinputoctets) FROM radacct WHERE 
>UserName='%{%k}'"
>           }
>
>And:
>DEFAULT User-Name =~ "^s[0-9]+$", Test-Quota-Input-Octets > 1000, Auth-Type = Reject
>         Reply-Message = "You have used up your quota"
>
>
>Output with -XX I get:
>sqlcounter_expand:  'SELECT SUM(acctinputoctets) FROM radacct WHERE 
>UserName='%{User-Name}''
>radius_xlat:  'SELECT SUM(acctinputoctets) FROM radacct WHERE UserName='s111111''
>sqlcounter_expand:  '%{sql:SELECT SUM(acctinputoctets) FROM radacct WHERE  
>UserName='s111111'}'
>radius_xlat: Running registered xlat function of module sql for string 'SELECT 
>SUM(acctinputoctets) FROM radacct WHERE UserName='s111111''
>rlm_sql: - sql_xlat
>radius_xlat:  'SELECT SUM(acctinputoctets) FROM radacct WHERE UserName='s111111''
>rlm_sql: Reserving sql socket id: 4
>SELECT SUM(acctinputoctets) FROM radacct WHERE UserName='s111111'
>rlm_sql: - sql_xlat finished
>rlm_sql: Released sql socket id: 4
>radius_xlat:  
>'?�???�?@�~??�~??��?@��?@��?@��?@��?@��?@��?@��?@x~??x~??��?@��?@��?@��?@��?@��?@��?@��?@��?@��?@'
>
>This is then repeated a few times.



- 
List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html

________________________________________________________________________


- 
List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html

Reply via email to