lkml.org 
[lkml]   [2020]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 218/344] driver core: platform: Prevent resouce overflow from causing infinite loops
    Date
    From: Simon Schwartz <kern.simon@theschwartz.xyz>

    [ Upstream commit 39cc539f90d035a293240c9443af50be55ee81b8 ]

    num_resources in the platform_device struct is declared as a u32. The
    for loops that iterate over num_resources use an int as the counter,
    which can cause infinite loops on architectures with smaller ints.
    Change the loop counters to u32.

    Signed-off-by: Simon Schwartz <kern.simon@theschwartz.xyz>
    Link: https://lore.kernel.org/r/2201ce63a2a171ffd2ed14e867875316efcf71db.camel@theschwartz.xyz
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/base/platform.c | 10 ++++++----
    1 file changed, 6 insertions(+), 4 deletions(-)

    diff --git a/drivers/base/platform.c b/drivers/base/platform.c
    index 3c0cd20925b71..ee99b15581290 100644
    --- a/drivers/base/platform.c
    +++ b/drivers/base/platform.c
    @@ -27,6 +27,7 @@
    #include <linux/limits.h>
    #include <linux/property.h>
    #include <linux/kmemleak.h>
    +#include <linux/types.h>

    #include "base.h"
    #include "power/power.h"
    @@ -48,7 +49,7 @@ EXPORT_SYMBOL_GPL(platform_bus);
    struct resource *platform_get_resource(struct platform_device *dev,
    unsigned int type, unsigned int num)
    {
    - int i;
    + u32 i;

    for (i = 0; i < dev->num_resources; i++) {
    struct resource *r = &dev->resource[i];
    @@ -226,7 +227,7 @@ struct resource *platform_get_resource_byname(struct platform_device *dev,
    unsigned int type,
    const char *name)
    {
    - int i;
    + u32 i;

    for (i = 0; i < dev->num_resources; i++) {
    struct resource *r = &dev->resource[i];
    @@ -473,7 +474,8 @@ EXPORT_SYMBOL_GPL(platform_device_add_properties);
    */
    int platform_device_add(struct platform_device *pdev)
    {
    - int i, ret;
    + u32 i;
    + int ret;

    if (!pdev)
    return -EINVAL;
    @@ -562,7 +564,7 @@ EXPORT_SYMBOL_GPL(platform_device_add);
    */
    void platform_device_del(struct platform_device *pdev)
    {
    - int i;
    + u32 i;

    if (!IS_ERR_OR_NULL(pdev)) {
    device_del(&pdev->dev);
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-02-21 09:12    [W:4.575 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site