lkml.org 
[lkml]   [2012]   [Aug]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] kernel/resource.c: fix stack overflow in __reserve_region_with_split
    Date
    Using recurvise call to try adding a non-conflicting region in the function
    __reserve_region_with_split() could result in a stack overflow in the case
    that the recursive calls are too deep. Convert the recursive calls to
    an iterative loop to avoid the problem.

    Signed-off-by: T Makphaibulchoke <tmac@hp.com>
    ---
    kernel/resource.c | 32 ++++++++++++++++++--------------
    1 files changed, 18 insertions(+), 14 deletions(-)

    diff --git a/kernel/resource.c b/kernel/resource.c
    index 34d4588..d6e9f9c 100644
    --- a/kernel/resource.c
    +++ b/kernel/resource.c
    @@ -768,25 +768,29 @@ static void __init __reserve_region_with_split(struct resource *root,
    return;

    res->name = name;
    - res->start = start;
    - res->end = end;
    res->flags = IORESOURCE_BUSY;

    - conflict = __request_resource(parent, res);
    - if (!conflict)
    - return;
    + while (1) {
    + res->start = start;
    + res->end = end;

    - /* failed, split and try again */
    - kfree(res);
    + conflict = __request_resource(parent, res);
    + if (!conflict)
    + break;

    - /* conflict covered whole area */
    - if (conflict->start <= start && conflict->end >= end)
    - return;
    + /* conflict covered whole area */
    + if (conflict->start <= start && conflict->end >= end) {
    + kfree(res);
    + break;
    + }
    +
    + /* failed, split and try again */
    + if (conflict->start > start)
    + end = conflict->start - 1;
    + if (conflict->end < end)
    + start = conflict->end + 1;
    + }

    - if (conflict->start > start)
    - __reserve_region_with_split(root, start, conflict->start-1, name);
    - if (conflict->end < end)
    - __reserve_region_with_split(root, conflict->end+1, end, name);
    }

    void __init reserve_region_with_split(struct resource *root,
    --
    1.7.1


    \
     
     \ /
      Last update: 2012-08-28 03:21    [W:4.691 / U:0.972 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site