Skip to content

Commit 533dedf

Browse files
cohuckmdroth
authored andcommitted
s390x/css: handle cssid 255 correctly
The cssid 255 is reserved but still valid from an architectural point of view. However, feeding a bogus schid of 0xffffffff into the virtio hypercall will lead to a crash: Stack trace of thread 138363: #0 0x00000000100d168c css_find_subch (qemu-system-s390x) #1 0x00000000100d3290 virtio_ccw_hcall_notify #2 0x00000000100cbf60 s390_virtio_hypercall #3 0x000000001010ff7a handle_hypercall #4 0x0000000010079ed4 kvm_cpu_exec (qemu-system-s390x) #5 0x00000000100609b4 qemu_kvm_cpu_thread_fn #6 0x000003ff8b887bb4 start_thread (libpthread.so.0) #7 0x000003ff8b78df0a thread_start (libc.so.6) This is because the css array was only allocated for 0..254 instead of 0..255. Let's fix this by bumping MAX_CSSID to 255 and fencing off the reserved cssid of 255 during css image allocation. Reported-by: Christian Borntraeger <[email protected]> Tested-by: Christian Borntraeger <[email protected]> Cc: [email protected] Signed-off-by: Cornelia Huck <[email protected]> (cherry picked from commit 882b3b9) Signed-off-by: Michael Roth <[email protected]>
1 parent 54c26b7 commit 533dedf

File tree

2 files changed

+4
-6
lines changed

2 files changed

+4
-6
lines changed

hw/s390x/css.c

+3-5
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ int map_indicator(AdapterInfo *adapter, IndAddr *indicator)
141141
int css_create_css_image(uint8_t cssid, bool default_image)
142142
{
143143
trace_css_new_image(cssid, default_image ? "(default)" : "");
144-
if (cssid > MAX_CSSID) {
144+
/* 255 is reserved */
145+
if (cssid == 255) {
145146
return -EINVAL;
146147
}
147148
if (channel_subsys.css[cssid]) {
@@ -1267,7 +1268,7 @@ bool css_schid_final(int m, uint8_t cssid, uint8_t ssid, uint16_t schid)
12671268
uint8_t real_cssid;
12681269

12691270
real_cssid = (!m && (cssid == 0)) ? channel_subsys.default_cssid : cssid;
1270-
if (real_cssid > MAX_CSSID || ssid > MAX_SSID ||
1271+
if (ssid > MAX_SSID ||
12711272
!channel_subsys.css[real_cssid] ||
12721273
!channel_subsys.css[real_cssid]->sch_set[ssid]) {
12731274
return true;
@@ -1282,9 +1283,6 @@ static int css_add_virtual_chpid(uint8_t cssid, uint8_t chpid, uint8_t type)
12821283
CssImage *css;
12831284

12841285
trace_css_chpid_add(cssid, chpid, type);
1285-
if (cssid > MAX_CSSID) {
1286-
return -EINVAL;
1287-
}
12881286
css = channel_subsys.css[cssid];
12891287
if (!css) {
12901288
return -EINVAL;

include/hw/s390x/css.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#define MAX_DEVNO 65535
2121
#define MAX_SCHID 65535
2222
#define MAX_SSID 3
23-
#define MAX_CSSID 254 /* 255 is reserved */
23+
#define MAX_CSSID 255
2424
#define MAX_CHPID 255
2525

2626
#define MAX_CIWS 62

0 commit comments

Comments
 (0)