Skip to contentSkip to conversation

s390x/cpumodel: fix segmentation fault when baselining models

PATCH In review David Hildenbrand 3 participants 3 messages Jul 18, 2018

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 s390x/cpumodel: fix segmentation fault when baselining models

Usually, when baselining two CPU models, whereby one of them has base CPU features disabled (e.g. z14-base,msa=off), we fallback to an older model that did not have these features in the base model. We always try to create a "sane" CPU model (as far as possible), and one part of it is that removing base features is no good and to be avoided.

Now, if we disable base features that were part of a z900, we're out of luck. We won't find a CPU model and QEMU will segfault. This is a scenario that should never happen in real life, but it can be used to crash QEMU.

So let's properly report an error if we baseline e.g.:

{ "execute": "query-cpu-model-baseline",
"arguments" : { "modela": { "name": "z14-base", "props": {"esan3" : false}},

                  "modelb": { "name": "z14"}} }

Instead of segfaulting.

---
 target/s390x/cpu_models.c | 8 ++++++++
 1 file changed, 8 insertions(+)
target/s390x/cpu_models.c +8 -0
index cfdbccf46d..604898a882 100644
@@ -716,6 +716,14 @@ CpuModelBaselineInfo *arch_query_cpu_model_baseline(CpuModelInfo *infoa,
 
     model.def = s390_find_cpu_def(cpu_type, max_gen, max_gen_ga,
                                   model.features);
+
+    /* models without early base features (esan3) are bad */
+    if (!model.def) {
+        error_setg(errp, "No compatible CPU model could be created as"
+                   " important base features are disabled");
+        return NULL;
+    }
+
     /* strip off features not part of the max model */
     bitmap_and(model.features, model.features, model.def->full_feat,
                S390_FEAT_MAX);
Signature · 1 line
2.17.1
Acked-by on v2 1/1
#1 lore raw
Quoted 13 lines · David Hildenbrand

Usually, when baselining two CPU models, whereby one of them has base CPU features disabled (e.g. z14-base,msa=off), we fallback to an older model that did not have these features in the base model. We always try to create a "sane" CPU model (as far as possible), and one part of it is that removing base features is no good and to be avoided.

Now, if we disable base features that were part of a z900, we're out of luck. We won't find a CPU model and QEMU will segfault. This is a scenario that should never happen in real life, but it can be used to crash QEMU.

So let's properly report an error if we baseline e.g.:

Quoted 7 lines

{ "execute": "query-cpu-model-baseline",
"arguments" : { "modela": { "name": "z14-base", "props": {"esan3" : false}},

                  "modelb": { "name": "z14"}} }

Instead of segfaulting.

Quoted 24 lines
---
 target/s390x/cpu_models.c | 8 ++++++++
 1 file changed, 8 insertions(+)
target/s390x/cpu_models.c +8 -0
index cfdbccf46d..604898a882 100644
@@ -716,6 +716,14 @@ CpuModelBaselineInfo *arch_query_cpu_model_baseline(CpuModelInfo *infoa,
 
     model.def = s390_find_cpu_def(cpu_type, max_gen, max_gen_ga,
                                   model.features);
+
+    /* models without early base features (esan3) are bad */
+    if (!model.def) {
+        error_setg(errp, "No compatible CPU model could be created as"
+                   " important base features are disabled");
+        return NULL;
+    }
+
     /* strip off features not part of the max model */
     bitmap_and(model.features, model.features, model.def->full_feat,
                S390_FEAT_MAX);
#2 lore raw
In reply to David Hildenbrand
Quoted 15 lines · On Wed, 18 Jul 2018 11:23:30 +0200 David Hildenbrand <[email protected]> wrote:

Usually, when baselining two CPU models, whereby one of them has base CPU features disabled (e.g. z14-base,msa=off), we fallback to an older model that did not have these features in the base model. We always try to create a "sane" CPU model (as far as possible), and one part of it is that removing base features is no good and to be avoided.

Now, if we disable base features that were part of a z900, we're out of luck. We won't find a CPU model and QEMU will segfault. This is a scenario that should never happen in real life, but it can be used to crash QEMU.

So let's properly report an error if we baseline e.g.:

{ "execute": "query-cpu-model-baseline",
"arguments" : { "modela": { "name": "z14-base", "props": {"esan3" : false}},

Quoted 8 lines
                  "modelb": { "name": "z14"}} }

Instead of segfaulting.

---
 target/s390x/cpu_models.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Thanks, queued to s390-fixes.