diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-04-04 21:59:36 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-04-04 21:59:36 +0000 |
commit | 4a14b8567777befff21dc7fed4a9cd6ee1d0f186 (patch) | |
tree | e460ee7726720403f1fc32a1b28986db4c2dcb06 /pam_sql/pam_mysql.c | |
parent | 8e3f1518fcfb36385532bfd5463e85a209e0ba67 (diff) | |
download | pam-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.c | 21 |
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); } } |