From: Michael R Sweet Date: Fri, 29 Aug 2025 16:17:16 +0000 (-0400) Subject: Clean up potential subscription locking issues (Issue #1346) X-Git-Tag: v2.4.13~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=81d7ca338b6d2c54d6da8ed7bb33501056cb36d0;p=thirdparty%2Fcups.git Clean up potential subscription locking issues (Issue #1346) --- diff --git a/scheduler/subscriptions.c b/scheduler/subscriptions.c index 8004101c6b..abd3ce0cfa 100644 --- a/scheduler/subscriptions.c +++ b/scheduler/subscriptions.c @@ -426,7 +426,7 @@ cupsdDeleteAllSubscriptions(void) for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); sub; sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) - cupsdDeleteSubscription(sub, 0); + cupsdDeleteSubscription(sub, -1); cupsArrayDelete(Subscriptions); Subscriptions = NULL; @@ -442,7 +442,7 @@ cupsdDeleteAllSubscriptions(void) void cupsdDeleteSubscription( cupsd_subscription_t *sub, /* I - Subscription object */ - int update) /* I - 1 = update subscriptions.conf */ + int update) /* I - 1 = update subscriptions.conf, 0 = don't update, -1 = don't update and don't lock */ { /* * Close the pipe to the notifier as needed... @@ -455,11 +455,13 @@ cupsdDeleteSubscription( * Remove subscription from array... */ - _cupsRWLockWrite(&SubscriptionsLock); + if (update >= 0) + _cupsRWLockWrite(&SubscriptionsLock); cupsArrayRemove(Subscriptions, sub); - _cupsRWUnlock(&SubscriptionsLock); + if (update >= 0) + _cupsRWUnlock(&SubscriptionsLock); /* * Free memory... @@ -478,7 +480,7 @@ cupsdDeleteSubscription( * Update the subscriptions as needed... */ - if (update) + if (update > 0) cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS); } @@ -651,9 +653,12 @@ cupsdExpireSubscriptions( cupsdLogMessage(CUPSD_LOG_DEBUG, "Expiring subscriptions..."); + _cupsRWLockWrite(&SubscriptionsLock); + for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); sub; sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + { if ((!sub->job && !dest && sub->expire && sub->expire <= curtime) || (dest && sub->dest == dest) || (job && sub->job == job)) @@ -661,10 +666,13 @@ cupsdExpireSubscriptions( cupsdLogMessage(CUPSD_LOG_INFO, "Subscription %d has expired...", sub->id); - cupsdDeleteSubscription(sub, 0); + cupsdDeleteSubscription(sub, -1); update = 1; } + } + + _cupsRWUnlock(&SubscriptionsLock); if (update) cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS);