OpenPKG CVS Repository http://cvs.openpkg.org/ ____________________________________________________________________________
Server: cvs.openpkg.org Name: Ralf S. Engelschall Root: /v/openpkg/cvs Email: r...@openpkg.org Module: openpkg-src Date: 25-Dec-2008 13:31:57 Branch: HEAD Handle: 2008122512315600 Modified files: openpkg-src/sasl sasl.patch sasl.spec Log: OK, break everything in SASL related to SQL lookups by changing the code to IMHO correctly retrieve BLOBs from MySQL/PgSQL/SQLite Summary: Revision Changes Path 1.25 +167 -11 openpkg-src/sasl/sasl.patch 1.164 +1 -1 openpkg-src/sasl/sasl.spec ____________________________________________________________________________ patch -p0 <<'@@ .' Index: openpkg-src/sasl/sasl.patch ============================================================================ $ cvs diff -u -r1.24 -r1.25 sasl.patch --- openpkg-src/sasl/sasl.patch 23 Dec 2008 19:58:59 -0000 1.24 +++ openpkg-src/sasl/sasl.patch 25 Dec 2008 12:31:56 -0000 1.25 @@ -223,8 +223,52 @@ Index: plugins/sql.c --- plugins/sql.c.orig 2006-04-07 15:42:16 +0200 -+++ plugins/sql.c 2007-01-08 18:49:07 +0100 -@@ -342,7 +342,7 @@ ++++ plugins/sql.c 2008-12-25 13:24:00 +0100 +@@ -150,9 +150,15 @@ + return -1; + } + if (value) { +- strncpy(value, row[0], size-2); +- value[size-1] = '\0'; +- if (value_len) *value_len = strlen(value); ++ unsigned long *col_lens; ++ size_t col_len; ++ col_lens = mysql_fetch_lengths(result); ++ col_len = (size_t)col_lens[0]; ++ if (col_len > size - 1); ++ col_len = size - 1; ++ memcpy(value, row[0], col_len); ++ value[col_len] = '\0'; ++ if (value_len) *value_len = col_len; + } + + /* free result */ +@@ -298,6 +304,7 @@ + row_count = PQntuples(result); + if (!row_count) { + /* umm nothing found */ ++ utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: no result found for query %s", cmd); + utils->log(NULL, SASL_LOG_NOTE, "sql plugin: no result found"); + PQclear(result); + return -1; +@@ -310,9 +317,13 @@ + /* now get the result set value and value_len */ + /* we only fetch one because we don't care about the rest */ + if (value) { +- strncpy(value, PQgetvalue(result,0,0), size-2); +- value[size-1] = '\0'; +- if (value_len) *value_len = strlen(value); ++ size_t col_len; ++ col_len = (size_t)PQgetlength(result, 0, 0); ++ if (col_len > size - 1); ++ col_len = size - 1; ++ memcpy(value, PQgetvalue(result, 0, 0), col_len); ++ value[col_len] = '\0'; ++ if (value_len) *value_len = col_len; + } + + /* free result */ +@@ -342,7 +353,7 @@ #endif /* HAVE_PGSQL */ #ifdef HAVE_SQLITE @@ -233,7 +277,7 @@ static void *_sqlite_open(char *host __attribute__((unused)), char *port __attribute__((unused)), -@@ -352,21 +352,23 @@ +@@ -352,21 +363,23 @@ const char *database, const sasl_utils_t *utils) { int rc; @@ -264,20 +308,116 @@ return NULL; } -@@ -412,10 +414,10 @@ - char *result = NULL; - char *zErrMsg = NULL; +@@ -388,62 +401,67 @@ + return 0; + } + +-static int sqlite_my_callback(void *pArg, int argc __attribute__((unused)), +- char **argv, +- char **columnNames __attribute__((unused))) +-{ +- char **result = (char**)pArg; +- +- if (argv == NULL) { +- *result = NULL; /* no record */ +- } else if (argv[0] == NULL) { +- *result = strdup(SQL_NULL_VALUE); /* NULL IS SQL_NULL_VALUE */ +- } else { +- *result = strdup(argv[0]); +- } +- +- return /*ABORT*/1; +-} +- + static int _sqlite_exec(void *db, const char *cmd, char *value, size_t size, + size_t *value_len, const sasl_utils_t *utils) + { + int rc; +- char *result = NULL; +- char *zErrMsg = NULL; ++ sqlite3_stmt *stmt; ++ const char *todo; ++ size_t len; - rc = sqlite_exec((sqlite*)db, cmd, sqlite_my_callback, (void*)&result, &zErrMsg); -+ rc = sqlite3_exec((sqlite3*)db, cmd, sqlite_my_callback, (void*)&result, &zErrMsg); - if (rc != SQLITE_OK && rc != SQLITE_ABORT) { - utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: %s ", zErrMsg); +- if (rc != SQLITE_OK && rc != SQLITE_ABORT) { +- utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: %s ", zErrMsg); - sqlite_freemem (zErrMsg); -+ sqlite3_free (zErrMsg); ++ rc = sqlite3_prepare((sqlite3*)db, cmd, (int)strlen(cmd), &stmt, &todo); ++ if (rc != SQLITE_OK) { ++ utils->log(NULL, SASL_LOG_DEBUG, "sql plugin error: %s", sqlite3_errmsg((sqlite3*)db)); return -1; } +- +- if (rc == SQLITE_OK) { ++ rc = sqlite3_step(stmt); ++ if (rc != SQLITE_ROW && rc != SQLITE_DONE) { ++ utils->log(NULL, SASL_LOG_DEBUG, "sql plugin error: %s", sqlite3_errmsg((sqlite3*)db)); ++ sqlite3_finalize(stmt); ++ return -1; ++ } ++ if (sqlite3_column_count(stmt) == 0) { + /* no results (BEGIN, COMMIT, DELETE, INSERT, UPDATE) */ ++ sqlite3_finalize(stmt); + return 0; + } +- +- if (result == NULL) { ++ if (rc == SQLITE_DONE) { + /* umm nothing found */ ++ utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: no result found for query %s", cmd); + utils->log(NULL, SASL_LOG_NOTE, "sql plugin: no result found"); ++ sqlite3_finalize(stmt); + return -1; + } +- +- /* XXX: Duplication cannot be found by this method. */ +- +- /* now get the result set value and value_len */ +- /* we only fetch one because we don't care about the rest */ +- if (value) { +- strncpy(value, result, size - 2); +- value[size - 1] = '\0'; +- if (value_len) { +- *value_len = strlen(value); +- } ++ rc = sqlite3_column_type(stmt, 0); ++ switch (rc) { ++ case SQLITE_NULL: { ++ len = strlen(SQL_NULL_VALUE); ++ if (len > size - 1) ++ len = size - 1; ++ memcpy(value, SQL_NULL_VALUE, len); ++ value[len] = '\0'; ++ if (value_len) ++ *value_len = len; ++ break; ++ } ++ default: { ++ const void *blob = sqlite3_column_blob(stmt, 0); ++ len = (size_t)sqlite3_column_bytes(stmt, 0); ++ if (len > size - 1) ++ len = size - 1; ++ memcpy(value, blob, len); ++ value[len] = '\0'; ++ if (value_len) ++ *value_len = len; ++ break; ++ } + } +- +- /* free result */ +- free(result); ++ rc = sqlite3_step(stmt); ++ if (rc != SQLITE_DONE) { ++ utils->log(NULL, SASL_LOG_WARN, ++ "sql plugin: found duplicate row for query %s", cmd); ++ } ++ sqlite3_finalize(stmt); + return 0; + } -@@ -464,7 +466,7 @@ +@@ -464,7 +482,7 @@ static void _sqlite_close(void *db) { @@ -286,6 +426,22 @@ } #endif /* HAVE_SQLITE */ +@@ -864,9 +882,15 @@ + /* run the query */ + if (!settings->sql_engine->sql_exec(conn, query, value, sizeof(value), + &value_len, sparams->utils)) { ++ sparams->utils->log(NULL, SASL_LOG_DEBUG, ++ "sql plugin query successful\n"); + sparams->utils->prop_set(sparams->propctx, cur->name, + value, value_len); + } ++ else { ++ sparams->utils->log(NULL, SASL_LOG_DEBUG, ++ "sql plugin query failed\n"); ++ } + + sparams->utils->free(query); + } Index: sample/client.c --- sample/client.c.orig 2004-03-09 18:35:32 +0100 +++ sample/client.c 2008-12-23 10:19:47 +0100 @@ . patch -p0 <<'@@ .' Index: openpkg-src/sasl/sasl.spec ============================================================================ $ cvs diff -u -r1.163 -r1.164 sasl.spec --- openpkg-src/sasl/sasl.spec 24 Dec 2008 09:59:09 -0000 1.163 +++ openpkg-src/sasl/sasl.spec 25 Dec 2008 12:31:56 -0000 1.164 @@ -32,7 +32,7 @@ Group: Cryptography License: BSD Version: 2.1.22 -Release: 20081224 +Release: 20081225 # package options %option with_fsl yes @@ . ______________________________________________________________________ OpenPKG http://openpkg.org CVS Repository Commit List openpkg-cvs@openpkg.org