Fix memory leak on error in db2 driver.
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Mon, 22 Apr 2013 03:21:53 +0000 (23:21 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Mon, 22 Apr 2013 03:27:48 +0000 (23:27 -0400)
src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c

index 4cde1ad..f4e4e3b 100644 (file)
@@ -42,6 +42,7 @@ typedef struct rlm_sql_conn {
        SQLHANDLE hdbc;
        SQLHANDLE henv;
        SQLHANDLE stmt;
+       char const *error;
 } rlm_sql_db2_conn_t;
 
 static int sql_socket_destructor(void *c)
@@ -252,25 +253,21 @@ static sql_rcode_t sql_free_result(rlm_sql_handle_t * handle, UNUSED rlm_sql_con
  *            connection
  *
  *************************************************************************/
-static char const *sql_error(rlm_sql_handle_t * handle, UNUSED rlm_sql_config_t *config)
+static char const *sql_error(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t *config)
 {
        /* this should really be enough, if not, you still got the sqlstate */
-#define MSGLEN 512
        char sqlstate[6];
-       char msg[MSGLEN];
+       char msg[1024];
        char *retval;
        SQLINTEGER err;
        SQLSMALLINT rl;
-       rlm_sql_db2_conn_t *conn;
-
-       conn = handle->conn;
+       rlm_sql_db2_conn_t *conn = handle->conn;
 
-       SQLGetDiagRec(SQL_HANDLE_STMT, conn->stmt, 1, (SQLCHAR *) sqlstate, &err, (SQLCHAR *) msg, MSGLEN, &rl);
-       
-       retval = rad_malloc(strlen(msg)+20);
-       sprintf(retval, "SQLSTATE %s: %s", sqlstate, msg);
+       TALLOC_FREE(conn->error);
+       SQLGetDiagRec(SQL_HANDLE_STMT, conn->stmt, 1, (SQLCHAR *) sqlstate, &err, (SQLCHAR *) msg, sizeof(msg), &rl);
+       conn->error = talloc_aprintf(conn, "sqlstate %s: %s", sqlstate, msg);
        
-       return retval;
+       return conn->error;
 }