Spent the evening bug-hunting. Spent a lot of time in "How did this code ever run?" mode -- still not sure of that in some places. Observed I should keep a closer eye on what other people check in to CVS, at least one of the smaller bugs I can confidantly say was Not My Fault. But other people have fixed many a bug for me, so I'm not complaining.
Turns out all hell can break loose in incredibly subtle ways if you do something like guint8 *foo=g_new(bar_t,baz); foo[-1] = quux; This is why people use languages with run-time array bounds checking instead of C. Took me positively forever to find, since the effects did't show up until long after... and when they did, it took odd forms like a gdk_beep() in the stacktrace (seth checked, and nothing even remotely GIMPish uses gdk_beep). efence with PROTECT_BELOW is what finally caught it.