tools/mm/slabinfo.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
From: Marc Dionne <marc.dionne@auristor.com>
The number of slabs can easily exceed the hard coded MAX_SLABS in the
slabinfo tool, causing it to overwrite memory and crash.
Increase the value of MAX_SLABS, and check if that has been exceeded for
each new slab, instead of at the end when it's already too late. Also
move the check for MAX_ALIASES into the loop body.
Signed-off-by: Marc Dionne <marc.dionne@auristor.com>
---
tools/mm/slabinfo.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/tools/mm/slabinfo.c b/tools/mm/slabinfo.c
index cfaeaea71042..1a9b807a48c3 100644
--- a/tools/mm/slabinfo.c
+++ b/tools/mm/slabinfo.c
@@ -21,7 +21,7 @@
#include <regex.h>
#include <errno.h>
-#define MAX_SLABS 500
+#define MAX_SLABS 2000
#define MAX_ALIASES 500
#define MAX_NODES 1024
@@ -1228,6 +1228,8 @@ static void read_slab_dir(void)
continue;
switch (de->d_type) {
case DT_LNK:
+ if (alias - aliasinfo == MAX_ALIASES)
+ fatal("Too many aliases\n");
alias->name = strdup(de->d_name);
count = readlink(de->d_name, buffer, sizeof(buffer)-1);
@@ -1242,6 +1244,8 @@ static void read_slab_dir(void)
alias++;
break;
case DT_DIR:
+ if (slab - slabinfo == MAX_SLABS)
+ fatal("Too many slabs\n");
if (chdir(de->d_name))
fatal("Unable to access slab %s\n", slab->name);
slab->name = strdup(de->d_name);
@@ -1310,10 +1314,6 @@ static void read_slab_dir(void)
slabs = slab - slabinfo;
actual_slabs = slabs;
aliases = alias - aliasinfo;
- if (slabs > MAX_SLABS)
- fatal("Too many slabs\n");
- if (aliases > MAX_ALIASES)
- fatal("Too many aliases\n");
}
static void output_slabs(void)
--
2.47.0
On 10/31/24 11:55, Marc Dionne wrote: > From: Marc Dionne <marc.dionne@auristor.com> > > The number of slabs can easily exceed the hard coded MAX_SLABS in the > slabinfo tool, causing it to overwrite memory and crash. > > Increase the value of MAX_SLABS, and check if that has been exceeded for > each new slab, instead of at the end when it's already too late. Also > move the check for MAX_ALIASES into the loop body. > > Signed-off-by: Marc Dionne <marc.dionne@auristor.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> > --- > tools/mm/slabinfo.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > diff --git a/tools/mm/slabinfo.c b/tools/mm/slabinfo.c > index cfaeaea71042..1a9b807a48c3 100644 > --- a/tools/mm/slabinfo.c > +++ b/tools/mm/slabinfo.c > @@ -21,7 +21,7 @@ > #include <regex.h> > #include <errno.h> > > -#define MAX_SLABS 500 > +#define MAX_SLABS 2000 > #define MAX_ALIASES 500 > #define MAX_NODES 1024 > > @@ -1228,6 +1228,8 @@ static void read_slab_dir(void) > continue; > switch (de->d_type) { > case DT_LNK: > + if (alias - aliasinfo == MAX_ALIASES) > + fatal("Too many aliases\n"); > alias->name = strdup(de->d_name); > count = readlink(de->d_name, buffer, sizeof(buffer)-1); > > @@ -1242,6 +1244,8 @@ static void read_slab_dir(void) > alias++; > break; > case DT_DIR: > + if (slab - slabinfo == MAX_SLABS) > + fatal("Too many slabs\n"); > if (chdir(de->d_name)) > fatal("Unable to access slab %s\n", slab->name); > slab->name = strdup(de->d_name); > @@ -1310,10 +1314,6 @@ static void read_slab_dir(void) > slabs = slab - slabinfo; > actual_slabs = slabs; > aliases = alias - aliasinfo; > - if (slabs > MAX_SLABS) > - fatal("Too many slabs\n"); > - if (aliases > MAX_ALIASES) > - fatal("Too many aliases\n"); > } > > static void output_slabs(void)
© 2016 - 2024 Red Hat, Inc.