What happens when mysql_fetch_rows() returns a valid pointer to free'd memory?

Is this a bug in the library or ??

To reproduce this I'm running freeradius with about 10 different background
test clients repeatively testing a login feature, at the same time running
a script that randomly sleeps between stop'ing and start'ing the database.

SuSE 7.3# rpm -qa | grep mysql
mysql-shared-3.23.44-5
mysql-client-3.23.44-5

The expectation is that mysql_fetch_row() should either return NULL, as the
documentation suggests, or a valid pointer to valid memory.

I had to run this with electric fence, btw, to catch this.
-- 
Todd Fries .. [EMAIL PROTECTED]

(last updated $ToddFries: signature.p,v 1.2 2002/03/19 15:10:18 todd Exp $)

----- Forwarded message from "Todd T. Fries" <[EMAIL PROTECTED]> -----

Date: Wed, 21 Aug 2002 14:36:08 -0500
From: "Todd T. Fries" <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Cc: [EMAIL PROTECTED]
Subject: Re: Error: CHILD: exit on signal (11)
In-Reply-To: <[EMAIL PROTECTED]>
X-Operating-System: OpenBSD shadow.fries.net 3.1 GENERIC
X-tra-email: [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]
X-IM: toddfries@AIM, toddfries@Yahoo, 115268457@ICQ, 
{toddfries,fr[1i]es}@*.irc.fries.net
Precedence: bulk

The code path this follows is ..

rlm_sql.c:static int rlm_sql_authorize(void *instance, REQUEST * request) {
[..]
  ret = rlm_sql_fetch_row(sqlsocket, inst);
    .... sql_mysql.c:int sql_fetch_row(SQLSOCK * sqlsocket, SQL_CONFIG *config) {
            rlm_sql_mysql_sock *mysql_sock = sqlsocket->conn;

            sqlsocket->row = mysql_fetch_row(mysql_sock->result);

            if (sqlsocket->row == NULL) {
                    return sql_check_error(mysql_errno(mysql_sock->sock));
            }
            return 0;
         }
    ....

   if (ret) {
            radlog(L_ERR, "rlm_sql_authorize: query failed");
            return RLM_MODULE_FAIL;
   }

   row = sqlsocket->row;
   if (row == NULL) {
            radlog(L_ERR, "rlm_sql_authorize: no rows returned from query (no such 
user)");
            return RLM_MODULE_OK;
   }

   if (row[0] == NULL) {
            radlog(L_ERR, "rlm_sql_authorize: row[0] returned NULL.");
            return RLM_MODULE_OK;
   }
   if ((passwd_item = pairmake("User-Password",row[0],T_OP_SET)) != NULL)
            pairadd(&request->config_items,passwd_item);


Now please help me understand if I'm understanding this right.  It would
appear some kindof failure is happening in the mysql_fetch_row, and it is
instead of returning NULL, returning free'ed memory.  At least my research
suggests it SHOULD return NULL on any failure or valid, allocated memory
on success ...

        http://www.mysql.com/doc/en/mysql_fetch_row.html

On a side note, perhaps I should release the socket only when the access of
the 'row' pointer is done?  Or perhaps the api should be altered (again) to
pass a pointer array into fetch_row so that the socket can be released without
the potential for over-writing prior results?
-- 
Todd Fries .. [EMAIL PROTECTED]

(last updated $ToddFries: signature.p,v 1.2 2002/03/19 15:10:18 todd Exp $)

Penned by Todd T. Fries on Wed, Aug 21, 2002 at 01:54:34PM -0500, we have:
| ..more..
| 
| (gdb) bt full
| #0  rlm_sql_authorize (instance=0x42735fd0, request=0x42a5bf74)
|     at rlm_sql.c:492
|         check_tmp = (VALUE_PAIR *) 0x0
|         reply_tmp = (VALUE_PAIR *) 0x0
|         passwd_item = (VALUE_PAIR *) 0x42a81034
|         found = 1
|         sqlsocket = (SQLSOCK *) 0x427d1fe8
|         row = 0x42a81034
|         querystr = "SELECT Value,Attribute FROM radcheck WHERE UserName = 'toddtest' 
|AND ( Attribute = 'User-Password' OR Attribute = 'Password' OR Attribute = 
|'Crypt-Password' ) ORDER BY Attribute DESC\000ergroup.GroupName"...
|         ret = 0
|         sqlusername = "toddtest", '\000' <repeats 509 times>
| #1  0x080569f0 in call_modsingle (component=1, sp=0x42729fcc, 
|     request=0x42a5bf74, default_result=6) at modcall.c:211
|         component = 1
|         sp = (modsingle *) 0x42729fcc
|         request = (REQUEST *) 0x42a5bf74
|         myresult = 1118158708
| #2  0x08056b68 in modcall (component=1, c=0x42729fcc, request=0x42a5bf74)
|     at modcall.c:315
|         sp = (modsingle *) 0x42a81034
|         c = (modcallable *) 0x42729fcc
| ---Type <return> to continue, or q <return> to quit---q
| Quit
| (gdb) print row
| $1 = 0x42a81034
| (gdb) print *row
| $2 = 0x42a81040 "XKgM9N6tR3Xw2"
| (gdb) print row[0]
| $3 = 0x42a81040 "XKgM9N6tR3Xw2"
| (gdb) 
| 
| -- 
| Todd Fries .. [EMAIL PROTECTED]
| 
| (last updated $ToddFries: signature.p,v 1.2 2002/03/19 15:10:18 todd Exp $)
| 
| Penned by Alan DeKok on Mon, Aug 19, 2002 at 02:42:19PM -0400, we have:
| | "Todd T. Fries" <[EMAIL PROTECTED]> wrote:
| | > It seems to happen when the database is doing a hot-backup and is
| | > unresponsive/slow for a few (10-15) minutes.
| | 
| |   If authorization depends on that database, and it goes down for
| | 10-15 minutes, then there's not much point in running the server
| | during that time.
| | 
| |   If the MySQL server really does disappear during backups, I'd
| | suggest doing something else to keep the RADIUS alive...
| | 
| | 
| | > Mon Aug 19 00:16:47 2002 : Error: rlm_sql:  There are no DB handles to use!
| | > Mon Aug 19 00:17:37 2002 : Error: CHILD: exit on signal (11)
| | 
| |   Hmm.. that's an unchecked de-referencing of a NULL pointer
| | somewhere.  Without more information, it's hard to know where.
| | 
| |   Alan DeKok.
| | 
| | - 
| | List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html
| 
| - 
| List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html

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

----- End forwarded message -----

---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to