aboutsummaryrefslogtreecommitdiff
path: root/pam_sql/pam_mysql.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-04-04 21:59:36 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2011-04-04 21:59:36 +0000
commit4a14b8567777befff21dc7fed4a9cd6ee1d0f186 (patch)
treee460ee7726720403f1fc32a1b28986db4c2dcb06 /pam_sql/pam_mysql.c
parent8e3f1518fcfb36385532bfd5463e85a209e0ba67 (diff)
downloadpam-modules-4a14b8567777befff21dc7fed4a9cd6ee1d0f186.tar.gz
pam-modules-4a14b8567777befff21dc7fed4a9cd6ee1d0f186.tar.bz2
Allow for the use of `CALL proc' in MySQL queries.
* pam_sql/pam_mysql.c (flush_result): New static. (mysql_do_query): Call mysql_real_connect with the CLIENT_MULTI_RESULTS flag. (check_query_result, mysql_setenv, gpam_sql_acct): Call flush_result after freeing the result. git-svn-id: file:///svnroot/pam-modules/trunk@111 56984be4-0537-0410-a56c-fcb268c96130
Diffstat (limited to 'pam_sql/pam_mysql.c')
-rw-r--r--pam_sql/pam_mysql.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/pam_sql/pam_mysql.c b/pam_sql/pam_mysql.c
index 739e1ad..9b86759 100644
--- a/pam_sql/pam_mysql.c
+++ b/pam_sql/pam_mysql.c
@@ -191,6 +191,20 @@ check_md5_pass(const char *sqlpass, const char *userpass)
return PAM_AUTH_ERR;
}
+static void
+flush_result(MYSQL *mysql)
+{
+ while (mysql_next_result(mysql) == 0) {
+ MYSQL_RES *result = mysql_store_result(mysql);
+ if (!result)
+ break;
+ if (mysql_field_count(mysql))
+ while (mysql_fetch_row(result))
+ ;
+ mysql_free_result(result);
+ }
+}
+
static int
check_query_result(MYSQL *mysql, const char *pass)
{
@@ -209,6 +223,7 @@ check_query_result(MYSQL *mysql, const char *pass)
"MySQL: query returned %d tuples", n);
if (n == 0) {
mysql_free_result(result);
+ flush_result(mysql);
return PAM_AUTH_ERR;
}
}
@@ -239,7 +254,7 @@ check_query_result(MYSQL *mysql, const char *pass)
}
}
mysql_free_result(result);
-
+ flush_result(mysql);
return rc;
}
@@ -286,7 +301,7 @@ mysql_do_query(MYSQL *mysql, const char *query)
if (!mysql_real_connect(mysql, hostname,
login, pass, db,
- portno, socket_path, 0)) {
+ portno, socket_path, CLIENT_MULTI_RESULTS)) {
_pam_log(LOG_ERR, "cannot connect to MySQL");
return PAM_SERVICE_ERR;
}
@@ -326,6 +341,7 @@ mysql_setenv(pam_handle_t *pamh, MYSQL *mysql, const char *query)
row[i], 0);
}
mysql_free_result(result);
+ flush_result(mysql);
return PAM_SUCCESS;
#else
_pam_log(LOG_ERR, "MySQL: PAM setenv is not available.");
@@ -377,6 +393,7 @@ gpam_sql_acct(pam_handle_t *pamh, const char *query)
} else {
size_t n = mysql_num_rows(result);
mysql_free_result(result);
+ flush_result(&mysql);
_pam_debug("query affected %lu tuples", n);
}
}

Return to:

Send suggestions and report system problems to the System administrator.