mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-24 21:34:08 +03:00
sd-event: when an event source fails, don't assume the type of it is still set
If a callback of an event source returns an error, then the event source might already be half-destroyed, if the callback dropped all refs. Hence, don't assume that the type is still valid, and save it before we issue the callback.
This commit is contained in:
parent
9a1c8f2d24
commit
8f5c235d9e
@ -2226,11 +2226,16 @@ static int process_signal(sd_event *e, struct signal_data *d, uint32_t events) {
|
||||
}
|
||||
|
||||
static int source_dispatch(sd_event_source *s) {
|
||||
EventSourceType saved_type;
|
||||
int r = 0;
|
||||
|
||||
assert(s);
|
||||
assert(s->pending || s->type == SOURCE_EXIT);
|
||||
|
||||
/* Save the event source type, here, so that we still know it after the event callback which might invalidate
|
||||
* the event. */
|
||||
saved_type = s->type;
|
||||
|
||||
if (s->type != SOURCE_DEFER && s->type != SOURCE_EXIT) {
|
||||
r = source_set_pending(s, false);
|
||||
if (r < 0)
|
||||
@ -2318,7 +2323,7 @@ static int source_dispatch(sd_event_source *s) {
|
||||
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Event source %s (type %s) returned error, disabling: %m",
|
||||
strna(s->description), event_source_type_to_string(s->type));
|
||||
strna(s->description), event_source_type_to_string(saved_type));
|
||||
|
||||
if (s->n_ref == 0)
|
||||
source_free(s);
|
||||
|
Loading…
Reference in New Issue
Block a user