2004年12月10日星期五

ProFTPD的mod_sql_mysql模块的bug

ProFTPD 1.2.10的模块mod_sql_mysql存在bug,在使用PERCALL模式时,即

SQLConnectInfo dbname@host user password percall

时会出错。花了一个晚上的时间看源程序,终于找到了原因。下面是patch文件。

*** mod_sql_mysql.c.orig Sat May 8 11:21:46 2004
--- mod_sql_mysql.c Fri Dec 10 10:45:51 2004
***************
*** 1189,1194 ****
--- 1189,1196 ----
db_conn_t *conn = NULL;
char *unescaped = NULL;
char *escaped = NULL;
+ modret_t *cmr = NULL;
+ cmd_rec *close_cmd;
sql_log(DEBUG_FUNC, "%s", "entering \tmysql cmd_escapestring");
***************
*** 1208,1213 ****
--- 1210,1221 ----
conn = (db_conn_t *) entry->data;
+ cmr = cmd_open(cmd);
+ if (MODRET_ERROR(cmr)) {
+ sql_log(DEBUG_FUNC, "%s", "exiting \tmysql cmd_escapestring");
+ return cmr;
+ }
+ unescaped = cmd->argv[1];
escaped = (char *) pcalloc(cmd->tmp_pool, sizeof(char) * (strlen(unescaped) * 2) + 1);
***************
*** 1222,1227 ****
--- 1230,1240 ----
mysql_escape_string(escaped, unescaped, strlen(unescaped));
#endif
+ /* close the connection, return the data. */
+ close_cmd = _sql_make_cmd( cmd->tmp_pool, 1, entry->name );
+ cmd_close(close_cmd);
+ SQL_FREE_CMD(close_cmd);
+ sql_log(DEBUG_FUNC, "%s", "exiting \tmysql cmd_escapestring");
return mod_create_data(cmd, (void *) escaped);
}