Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38ed8930 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Revert "posix-timers: Ensure timer ID search-loop limit is valid"



This reverts commit 9ea26a84 which is
commit 8ce8849dd1e78dadcee0ec9acbd259d239b7069f upstream.

It breaks the Android abi.  If it is required in the future, it can come
back in an abi-safe way.

Bug: 161946584
Change-Id: I44be0f7b4df730e599bf80939b6d40d4f8d04a57
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 813e482b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -128,7 +128,7 @@ struct signal_struct {
#ifdef CONFIG_POSIX_TIMERS

	/* POSIX.1b Interval Timers */
	unsigned int		next_posix_timer_id;
	int			posix_timer_id;
	struct list_head	posix_timers;

	/* ITIMER_REAL timer for the process */
+13 −18
Original line number Diff line number Diff line
@@ -159,30 +159,25 @@ static struct k_itimer *posix_timer_by_id(timer_t id)
static int posix_timer_add(struct k_itimer *timer)
{
	struct signal_struct *sig = current->signal;
	int first_free_id = sig->posix_timer_id;
	struct hlist_head *head;
	unsigned int cnt, id;
	int ret = -ENOENT;

	/*
	 * FIXME: Replace this by a per signal struct xarray once there is
	 * a plan to handle the resulting CRIU regression gracefully.
	 */
	for (cnt = 0; cnt <= INT_MAX; cnt++) {
	do {
		spin_lock(&hash_lock);
		id = sig->next_posix_timer_id;

		/* Write the next ID back. Clamp it to the positive space */
		sig->next_posix_timer_id = (id + 1) & INT_MAX;

		head = &posix_timers_hashtable[hash(sig, id)];
		if (!__posix_timers_find(head, sig, id)) {
		head = &posix_timers_hashtable[hash(sig, sig->posix_timer_id)];
		if (!__posix_timers_find(head, sig, sig->posix_timer_id)) {
			hlist_add_head_rcu(&timer->t_hash, head);
			spin_unlock(&hash_lock);
			return id;
			ret = sig->posix_timer_id;
		}
		if (++sig->posix_timer_id < 0)
			sig->posix_timer_id = 0;
		if ((sig->posix_timer_id == first_free_id) && (ret == -ENOENT))
			/* Loop over all possible ids completed */
			ret = -EAGAIN;
		spin_unlock(&hash_lock);
	}
	/* POSIX return code when no timer ID could be allocated */
	return -EAGAIN;
	} while (ret == -ENOENT);
	return ret;
}

static inline void unlock_timer(struct k_itimer *timr, unsigned long flags)