lkml.org 
[lkml]   [2009]   [Jun]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH 5/6] mISDN: Do not disable IRQ in ph_data_ind()
    From
    This fix triggering the WARN_ON_ONCE(in_irq() || irqs_disabled()); in
    local_bh_enable().

    Here is no need to grab this lock, this was wrong at all and may
    cause a deadlock and access to freed memory, since on a TEI remove
    the current listelement can be deleted under us. So this is clearly
    a case for list_for_each_entry_safe.

    Signed-off-by: Karsten Keil <keil@b1-systems.de>
    ---
    drivers/isdn/mISDN/tei.c | 7 ++-----
    1 files changed, 2 insertions(+), 5 deletions(-)

    diff --git a/drivers/isdn/mISDN/tei.c b/drivers/isdn/mISDN/tei.c
    index bfcdd97..e04bad6 100644
    --- a/drivers/isdn/mISDN/tei.c
    +++ b/drivers/isdn/mISDN/tei.c
    @@ -862,8 +862,7 @@ static int
    ph_data_ind(struct manager *mgr, struct sk_buff *skb)
    {
    int ret = -EINVAL;
    - struct layer2 *l2;
    - u_long flags;
    + struct layer2 *l2, *nl2;
    u_char mt;

    if (skb->len < 8) {
    @@ -908,11 +907,9 @@ ph_data_ind(struct manager *mgr, struct sk_buff *skb)
    new_tei_req(mgr, &skb->data[4]);
    goto done;
    }
    - read_lock_irqsave(&mgr->lock, flags);
    - list_for_each_entry(l2, &mgr->layer2, list) {
    + list_for_each_entry_safe(l2, nl2, &mgr->layer2, list) {
    tei_ph_data_ind(l2->tm, mt, &skb->data[4], skb->len - 4);
    }
    - read_unlock_irqrestore(&mgr->lock, flags);
    done:
    return ret;
    }
    --
    1.6.0.2


    \
     
     \ /
      Last update: 2009-06-11 19:33    [W:0.024 / U:0.648 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site