lkml.org 
[lkml]   [2012]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 221/270] amd64_edac:__amd64_set_scrub_rate(): avoid overindexing scrubrates[]
    Date
    3.5.7u1 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Andrew Morton <akpm@linux-foundation.org>

    commit 168bfeef7bba3f9784f7540b053e4ac72b769ce9 upstream.

    If none of the elements in scrubrates[] matches, this loop will cause
    __amd64_set_scrub_rate() to incorrectly use the n+1th element.

    As the function is designed to use the final scrubrates[] element in the
    case of no match, we can fix this bug by simply terminating the array
    search at the n-1th element.

    Boris: this code is fragile anyway, see here why:
    http://marc.info/?l=linux-kernel&m=135102834131236&w=2

    It will be rewritten more robustly soonish.

    Reported-by: Denis Kirjanov <kirjanov@gmail.com>
    Cc: Doug Thompson <dougthompson@xmission.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
    Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
    ---
    drivers/edac/amd64_edac.c | 11 ++++-------
    1 file changed, 4 insertions(+), 7 deletions(-)

    diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
    index 7be9b72..a814ea8 100644
    --- a/drivers/edac/amd64_edac.c
    +++ b/drivers/edac/amd64_edac.c
    @@ -170,8 +170,11 @@ static int __amd64_set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate)
    * memory controller and apply to register. Search for the first
    * bandwidth entry that is greater or equal than the setting requested
    * and program that. If at last entry, turn off DRAM scrubbing.
    + *
    + * If no suitable bandwidth is found, turn off DRAM scrubbing entirely
    + * by falling back to the last element in scrubrates[].
    */
    - for (i = 0; i < ARRAY_SIZE(scrubrates); i++) {
    + for (i = 0; i < ARRAY_SIZE(scrubrates) - 1; i++) {
    /*
    * skip scrub rates which aren't recommended
    * (see F10 BKDG, F3x58)
    @@ -181,12 +184,6 @@ static int __amd64_set_scrub_rate(struct pci_dev *ctl, u32 new_bw, u32 min_rate)

    if (scrubrates[i].bandwidth <= new_bw)
    break;
    -
    - /*
    - * if no suitable bandwidth found, turn off DRAM scrubbing
    - * entirely by falling back to the last element in the
    - * scrubrates array.
    - */
    }

    scrubval = scrubrates[i].scrubval;
    --
    1.7.9.5


    \
     
     \ /
      Last update: 2012-11-26 19:01    [W:4.472 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site