ACK/Cmnt: [PATCH] irda: Fix lockdep annotations in hashbin_delete().

Stefan Bader stefan.bader at canonical.com
Mon Jul 23 13:01:14 UTC 2018


On 20.07.2018 18:49, Colin King wrote:
> From: "David S. Miller" <davem at davemloft.net>
> 
> CVE-2017-6348
> 
> A nested lock depth was added to the hasbin_delete() code but it
> doesn't actually work some well and results in tons of lockdep splats.
> 
> Fix the code instead to properly drop the lock around the operation
> and just keep peeking the head of the hashbin queue.
> 
> Reported-by: Dmitry Vyukov <dvyukov at google.com>
> Tested-by: Dmitry Vyukov <dvyukov at google.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (clean cherry pick of upstream commit 4c03b862b12f980456f9de92db6d508a4999b788)
> Acked-by: Colin Ian King <colin.king at canonical.com>
Acked-by: Stefan Bader <stefan.bader at canonical.com>
> ---

Again, as I am not sure how much creativity the bot can handle, the pick line
should be replaced by:
 (cherry picked from commit 4c03b862b12f980456f9de92db6d508a4999b788)

upstream is implied by not saying anything. when a source is given, I believe it
should be after the SHA1.

-Stefan

>  net/irda/irqueue.c | 34 ++++++++++++++++------------------
>  1 file changed, 16 insertions(+), 18 deletions(-)
> 
> diff --git a/net/irda/irqueue.c b/net/irda/irqueue.c
> index acbe61c..160dc89 100644
> --- a/net/irda/irqueue.c
> +++ b/net/irda/irqueue.c
> @@ -383,9 +383,6 @@ hashbin_t *hashbin_new(int type)
>   *    for deallocating this structure if it's complex. If not the user can
>   *    just supply kfree, which should take care of the job.
>   */
> -#ifdef CONFIG_LOCKDEP
> -static int hashbin_lock_depth = 0;
> -#endif
>  int hashbin_delete( hashbin_t* hashbin, FREE_FUNC free_func)
>  {
>  	irda_queue_t* queue;
> @@ -396,22 +393,27 @@ int hashbin_delete( hashbin_t* hashbin, FREE_FUNC free_func)
>  	IRDA_ASSERT(hashbin->magic == HB_MAGIC, return -1;);
>  
>  	/* Synchronize */
> -	if ( hashbin->hb_type & HB_LOCK ) {
> -		spin_lock_irqsave_nested(&hashbin->hb_spinlock, flags,
> -					 hashbin_lock_depth++);
> -	}
> +	if (hashbin->hb_type & HB_LOCK)
> +		spin_lock_irqsave(&hashbin->hb_spinlock, flags);
>  
>  	/*
>  	 *  Free the entries in the hashbin, TODO: use hashbin_clear when
>  	 *  it has been shown to work
>  	 */
>  	for (i = 0; i < HASHBIN_SIZE; i ++ ) {
> -		queue = dequeue_first((irda_queue_t**) &hashbin->hb_queue[i]);
> -		while (queue ) {
> -			if (free_func)
> -				(*free_func)(queue);
> -			queue = dequeue_first(
> -				(irda_queue_t**) &hashbin->hb_queue[i]);
> +		while (1) {
> +			queue = dequeue_first((irda_queue_t**) &hashbin->hb_queue[i]);
> +
> +			if (!queue)
> +				break;
> +
> +			if (free_func) {
> +				if (hashbin->hb_type & HB_LOCK)
> +					spin_unlock_irqrestore(&hashbin->hb_spinlock, flags);
> +				free_func(queue);
> +				if (hashbin->hb_type & HB_LOCK)
> +					spin_lock_irqsave(&hashbin->hb_spinlock, flags);
> +			}
>  		}
>  	}
>  
> @@ -420,12 +422,8 @@ int hashbin_delete( hashbin_t* hashbin, FREE_FUNC free_func)
>  	hashbin->magic = ~HB_MAGIC;
>  
>  	/* Release lock */
> -	if ( hashbin->hb_type & HB_LOCK) {
> +	if (hashbin->hb_type & HB_LOCK)
>  		spin_unlock_irqrestore(&hashbin->hb_spinlock, flags);
> -#ifdef CONFIG_LOCKDEP
> -		hashbin_lock_depth--;
> -#endif
> -	}
>  
>  	/*
>  	 *  Free the hashbin structure
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20180723/731c93a3/attachment.sig>


More information about the kernel-team mailing list