Hey Mick,
I have the attached patch to the mysql driver that should go in. It's
part of the 3.8.1cvs build on debian/ubuntu and fixes some problematic
bugs that break global groups that would be good to include. I don't
believe it has been included in the kirya.net build yet, but I've been
running it on my busy server and it is like a dream...
-Jason.
Mick Johnson wrote:
All
A few pending updates have been pushed up to CVS :
* Allow users to select multiple rows by clicking
on the initial row, holding shift, and clicking on the final row.
* Adds a "select 200" button to the quarantine page.
* Removed some junk from a previous merge.
The Feature Request page has also been updated - the donations button and
dollar value components have been removed as we're no longer accepting
donations for this project.
A few of the patches came in via this interface, this actually makes it
harder to patch as a) I don't know who submitted them and can't bring up any
suggestions or corrections directly, and b) they have less visibility on
this list. In the future, if you wish to submit patches (and I'm always
happy when people do) please do so here to ensure the community can review.
The latest CVS version seems to have been running stably for some time now
and I'm looking to push this out as a stable 3.8.1 this month unless I hear
otherwise.
Finally, looking forward to a great 2008!
Cheers
Mick Johnson
Sensory Networks
!DSPAM:4,47a3938136671806666974!
--- dspam/src/mysql_drv.c.broken 2008-01-16 20:03:05.000000000 -0800
+++ dspam/src/mysql_drv.c 2008-01-20 15:15:36.000000000 -0800
@@ -154,6 +154,7 @@
struct _mysql_drv_storage *s = (struct _mysql_drv_storage *) CTX->storage;
char query[1024];
struct passwd *p;
+ char *name;
MYSQL_RES *result;
MYSQL_ROW row;
struct _ds_spam_totals user, group;
@@ -174,35 +175,36 @@
memset(&CTX->totals, 0, sizeof(struct _ds_spam_totals));
memset(&user, 0, sizeof(struct _ds_spam_totals));
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_mysql_drv_get_spamtotals: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
if (!(CTX->flags & DSF_MERGED))
return EINVAL;
} else {
uid = p->pw_uid;
}
-
- if (CTX->flags & DSF_MERGED) {
+
+ if (CTX->group != NULL && CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->group);
if (p == NULL)
{
- LOGDEBUG ("_mysql_drv_getspamtotals: unable to _mysql_drv_getpwnam(%s)",
+ LOGDEBUG ("_ds_getall_spamtotals: unable to _mysql_drv_getpwnam(%s)",
CTX->group);
return EINVAL;
}
-
+ gid = p->pw_uid;
}
- gid = p->pw_uid;
-
snprintf (query, sizeof (query),
"select uid, spam_learned, innocent_learned, "
"spam_misclassified, innocent_misclassified, "
@@ -289,6 +291,7 @@
{
struct _mysql_drv_storage *s = (struct _mysql_drv_storage *) CTX->storage;
struct passwd *p;
+ char *name;
char query[1024];
int result = 0;
struct _ds_spam_totals user;
@@ -305,15 +308,18 @@
return 0;
}
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
- LOGDEBUG ("_mysql_drv_get_spamtotals: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ LOGDEBUG ("_mysql_drv_set_spamtotals: unable to _mysql_drv_getpwnam(%s)",
+ name);
return EINVAL;
}
@@ -419,6 +425,7 @@
{
struct _mysql_drv_storage *s = (struct _mysql_drv_storage *) CTX->storage;
struct passwd *p;
+ char *name;
buffer *query;
ds_term_t ds_term;
ds_cursor_t ds_c;
@@ -428,7 +435,7 @@
struct _ds_spam_stat stat;
unsigned long long token = 0;
int get_one = 0;
- int uid, gid;
+ int uid = -1, gid = -1;
if (s->dbt == NULL)
{
@@ -436,21 +443,24 @@
return EINVAL;
}
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_getall_spamrecords: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return EINVAL;
}
uid = p->pw_uid;
- if (CTX->flags & DSF_MERGED) {
+ if (CTX->group != NULL && CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->group);
if (p == NULL)
{
@@ -458,9 +468,8 @@
CTX->group);
return EINVAL;
}
+ gid = p->pw_uid;
}
-
- gid = p->pw_uid;
stat.spam_hits = 0;
stat.innocent_hits = 0;
@@ -568,6 +577,7 @@
buffer *query;
char scratch[1024];
struct passwd *p;
+ char *name;
int update_any = 0;
#if MYSQL_VERSION_ID >= 40100
buffer *insert;
@@ -585,15 +595,18 @@
(diction->whitelist_token == 0 && (!(CTX->flags & DSF_NOISE)))))
return 0;
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_setall_spamrecords: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return EINVAL;
}
@@ -778,6 +791,7 @@
struct _mysql_drv_storage *s = (struct _mysql_drv_storage *) CTX->storage;
char query[1024];
struct passwd *p;
+ char *name;
MYSQL_RES *result;
MYSQL_ROW row;
@@ -787,15 +801,18 @@
return EINVAL;
}
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_get_spamrecord: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return EINVAL;
}
@@ -846,6 +863,7 @@
struct _mysql_drv_storage *s = (struct _mysql_drv_storage *) CTX->storage;
char query[1024];
struct passwd *p;
+ char *name;
int result = 0;
if (s->dbt == NULL)
@@ -857,15 +875,18 @@
if (CTX->operating_mode == DSM_CLASSIFY)
return 0;
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_set_spamrecord: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return EINVAL;
}
@@ -1052,6 +1073,7 @@
{
struct _mysql_drv_storage *s = (struct _mysql_drv_storage *) CTX->storage;
struct passwd *p;
+ char *name;
unsigned long *lengths;
char *mem;
char query[128];
@@ -1068,15 +1090,18 @@
dbh = _mysql_drv_sig_write_handle(CTX, s);
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_get_signature: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return EINVAL;
}
@@ -1175,6 +1200,7 @@
char scratch[1024];
buffer *query;
struct passwd *p;
+ char *name;
if (s->dbt == NULL)
{
@@ -1182,15 +1208,18 @@
return EINVAL;
}
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_set_signature: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return EINVAL;
}
@@ -1236,6 +1265,7 @@
{
struct _mysql_drv_storage *s = (struct _mysql_drv_storage *) CTX->storage;
struct passwd *p;
+ char *name;
char query[128];
if (s->dbt == NULL)
@@ -1245,15 +1275,18 @@
}
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_delete_signature: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return EINVAL;
}
@@ -1274,6 +1307,7 @@
{
struct _mysql_drv_storage *s = (struct _mysql_drv_storage *) CTX->storage;
struct passwd *p;
+ char *name;
char query[128];
MYSQL_RES *result;
MYSQL_ROW row;
@@ -1284,15 +1318,18 @@
return EINVAL;
}
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_verisy_signature: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return EINVAL;
}
@@ -1409,6 +1446,7 @@
char query[128];
MYSQL_ROW row;
struct passwd *p;
+ char *name;
if (s->dbt == NULL)
{
@@ -1416,15 +1454,18 @@
return NULL;
}
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_get_nexttoken: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return NULL;
}
@@ -1480,6 +1521,7 @@
char query[128];
MYSQL_ROW row;
struct passwd *p;
+ char *name;
char *mem;
if (s->dbt == NULL)
@@ -1488,15 +1530,18 @@
return NULL;
}
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_get_nextsignature: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return NULL;
}
@@ -1622,19 +1667,24 @@
if (s->p_getpwnam.pw_name != NULL)
{
/* cache the last name queried */
- if (name != NULL && !strcmp (s->p_getpwnam.pw_name, name))
+ if (name != NULL && !strcmp (s->p_getpwnam.pw_name, name)) {
+ LOGDEBUG("_mysql_drv_getpwnam returning cached name %s.", name);
return &s->p_getpwnam;
+ }
free (s->p_getpwnam.pw_name);
s->p_getpwnam.pw_name = NULL;
}
- if (name == NULL)
+ if (name == NULL) {
+ LOGDEBUG("_mysql_drv_getpwnam returning NULL. Caller passed NULL for
the name and I can't grok that.");
return NULL;
+ }
sql_username = malloc ((2 * strlen(name)) + 1);
if (sql_username == NULL)
{
+ LOGDEBUG("_mysql_drv_getpwnam returning NULL for name: %s. malloc()
failed somehow.", name);
return NULL;
}
@@ -1655,8 +1705,11 @@
result = mysql_use_result (s->dbt->dbh_read);
if (result == NULL) {
- if (CTX->source == DSS_ERROR || CTX->operating_mode != DSM_PROCESS)
+ if (CTX->source == DSS_ERROR || CTX->operating_mode != DSM_PROCESS) {
+ LOGDEBUG("_mysql_drv_getpwnam returning NULL for query on name: %s that
returned a null result", name);
return NULL;
+ }
+ LOGDEBUG("_mysql_drv_getpwnam setting, then returning passed name: %s
after null mysql result", name);
return _mysql_drv_setpwnam (CTX, name);
}
@@ -1664,16 +1717,23 @@
if (row == NULL)
{
mysql_free_result (result);
- if (CTX->source == DSS_ERROR || CTX->operating_mode != DSM_PROCESS)
+ if (CTX->source == DSS_ERROR || CTX->operating_mode != DSM_PROCESS) {
+ LOGDEBUG("_mysql_drv_getpwnam returning NULL for query on name: %s",
name);
return NULL;
+ }
+ LOGDEBUG("_mysql_drv_getpwnam setting, then returning passed name: %s",
name);
return _mysql_drv_setpwnam (CTX, name);
}
if (row[0] == NULL)
{
mysql_free_result (result);
- if (CTX->source == DSS_ERROR || CTX->operating_mode != DSM_PROCESS)
+ if (CTX->source == DSS_ERROR || CTX->operating_mode != DSM_PROCESS) {
+ LOGDEBUG("_mysql_drv_getpwnam returning NULL for query on name: %s",
name);
return NULL;
+ }
+
+ LOGDEBUG("_mysql_drv_getpwnam setting, then returning passed name: %s",
name);
return _mysql_drv_setpwnam (CTX, name);
}
@@ -1684,6 +1744,7 @@
s->p_getpwnam.pw_name = strdup (name);
mysql_free_result (result);
+ LOGDEBUG("_mysql_drv_getpwnam successful; returning struct for name: %s",
s->p_getpwnam.pw_name);
return &s->p_getpwnam;
#endif
@@ -1878,6 +1939,7 @@
{
struct _mysql_drv_storage *s = (struct _mysql_drv_storage *) CTX->storage;
struct passwd *p;
+ char *name;
char query[128];
if (s->dbt == NULL)
@@ -1886,15 +1948,18 @@
return EINVAL;
}
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_delete_token: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return EINVAL;
}
if (_ds_match_attribute(CTX->config->attributes, "MySQLSupressQuote", "on"))
@@ -1924,6 +1989,7 @@
char scratch[1024];
char queryhead[1024];
struct passwd *p;
+ char *name;
int writes = 0;
if (diction->items < 1)
@@ -1935,15 +2001,18 @@
return EINVAL;
}
- if (!CTX->group || CTX->flags & DSF_MERGED)
+ if (!CTX->group || CTX->flags & DSF_MERGED) {
p = _mysql_drv_getpwnam (CTX, CTX->username);
- else
+ name = CTX->username;
+ } else {
p = _mysql_drv_getpwnam (CTX, CTX->group);
+ name = CTX->group;
+ }
if (p == NULL)
{
LOGDEBUG ("_ds_delall_spamrecords: unable to _mysql_drv_getpwnam(%s)",
- CTX->username);
+ name);
return EINVAL;
}
@@ -2039,6 +2108,7 @@
return CTX;
BAIL:
+ LOGDEBUG ("_mysql_drv_init_tools: Bailing and returning NULL!");
dspam_destroy(CTX);
return NULL;
}