aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2012-11-13 10:36:25 +0100
committerKarel Zak <kzak@redhat.com>2012-11-16 11:38:28 +0100
commit322796e74a0ebc20802d1665d0b3900f3f9d90a6 (patch)
treea37596e348b569b1ee78efac6550a4e839c35908
parent2c416a25903341a579ca6ba2feecb8e893d1e735 (diff)
downloadutil-linux-322796e74a0ebc20802d1665d0b3900f3f9d90a6.tar.gz
lscpu: make read_topology() more robust to avoid SIGFPE
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r--sys-utils/lscpu.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c
index 5b1a0afeeb..a111561dcb 100644
--- a/sys-utils/lscpu.c
+++ b/sys-utils/lscpu.c
@@ -627,16 +627,26 @@ read_topology(struct lscpu_desc *desc, int num)
/* threads within one core */
nthreads = CPU_COUNT_S(setsize, thread_siblings);
+ if (!nthreads)
+ nthreads = 1;
+
/* cores within one socket */
ncores = CPU_COUNT_S(setsize, core_siblings) / nthreads;
- /* number of sockets within one book.
- * Because of odd / non-present cpu maps and to keep
- * calculation easy we make sure that nsockets and
- * nbooks is at least 1.
+ if (!ncores)
+ ncores = 1;
+
+ /* number of sockets within one book. Because of odd /
+ * non-present cpu maps and to keep calculation easy we make
+ * sure that nsockets and nbooks is at least 1.
*/
- nsockets = desc->ncpus / nthreads / ncores ?: 1;
+ nsockets = desc->ncpus / nthreads / ncores;
+ if (!nsockets)
+ nsockets = 1;
+
/* number of books */
- nbooks = desc->ncpus / nthreads / ncores / nsockets ?: 1;
+ nbooks = desc->ncpus / nthreads / ncores / nsockets;
+ if (!nbooks)
+ nbooks = 1;
/* all threads, see also read_basicinfo()
* -- fallback for kernels without
@@ -644,6 +654,7 @@ read_topology(struct lscpu_desc *desc, int num)
*/
if (!desc->nthreads)
desc->nthreads = nbooks * nsockets * ncores * nthreads;
+
/* For each map we make sure that it can have up to ncpuspos
* entries. This is because we cannot reliably calculate the
* number of cores, sockets and books on all architectures.