chiark
/
gitweb
/
~mdw
/
disorder
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
avoid crashes on log client teardown
[disorder]
/
lib
/
eventlog.c
diff --git
a/lib/eventlog.c
b/lib/eventlog.c
index e652e2218c6a40ddfaa3581f92081f13e5a5802f..b9ae495e00f68985c93f32cf39678548516d7d37 100644
(file)
--- a/
lib/eventlog.c
+++ b/
lib/eventlog.c
@@
-48,7
+48,7
@@
void eventlog_remove(struct eventlog_output *lo) {
}
static void veventlog(const char *keyword, const char *raw, va_list ap) {
}
static void veventlog(const char *keyword, const char *raw, va_list ap) {
- struct eventlog_output *p;
+ struct eventlog_output *p
, *pnext
;
struct dynstr d;
const char *param;
struct dynstr d;
const char *param;
@@
-63,8
+63,12
@@
static void veventlog(const char *keyword, const char *raw, va_list ap) {
dynstr_append_string(&d, raw);
}
dynstr_terminate(&d);
dynstr_append_string(&d, raw);
}
dynstr_terminate(&d);
- for(p = outputs; p; p = p->next)
+ for(p = outputs; p; p = pnext) {
+ /* We must be able to cope with eventlog_remove() being called from inside
+ * the callback */
+ pnext = p;
p->fn(d.vec, p->user);
p->fn(d.vec, p->user);
+ }
}
void eventlog_raw(const char *keyword, const char *raw, ...) {
}
void eventlog_raw(const char *keyword, const char *raw, ...) {