aboutsummaryrefslogtreecommitdiff
path: root/hw/s390x/3270-ccw.c
diff options
context:
space:
mode:
authorPierre Morel <pmorel@linux.ibm.com>2021-04-08 18:32:09 +0200
committerCornelia Huck <cohuck@redhat.com>2021-04-09 10:52:13 +0200
commitd895d25ae2bb8519aa715dd2a97f09d4a66b189d (patch)
tree9f4fd5f816733abef00401752f049af92c0da713 /hw/s390x/3270-ccw.c
parentd8724020dd13c88a72fc391a6a2cf63abbd3dcca (diff)
s390x: css: report errors from ccw_dstream_read/write
ccw_dstream_read/write functions returned values are sometime not taking into account and reported back to the upper level of interpretation of CCW instructions. It follows that accessing an invalid address does not trigger a subchannel status program check to the guest as it should. Let's test the return values of ccw_dstream_write[_buf] and ccw_dstream_read[_buf] and report it to the caller. Cc: qemu-stable@nongnu.org Signed-off-by: Pierre Morel <pmorel@linux.ibm.com> Acked-by: Halil Pasic <pasic@linux.ibm.com> Message-Id: <1617899529-9329-2-git-send-email-pmorel@linux.ibm.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Diffstat (limited to 'hw/s390x/3270-ccw.c')
-rw-r--r--hw/s390x/3270-ccw.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/hw/s390x/3270-ccw.c b/hw/s390x/3270-ccw.c
index 821319eee6..f3e7342b1e 100644
--- a/hw/s390x/3270-ccw.c
+++ b/hw/s390x/3270-ccw.c
@@ -31,6 +31,9 @@ static int handle_payload_3270_read(EmulatedCcw3270Device *dev, CCW1 *ccw)
}
len = ck->read_payload_3270(dev);
+ if (len < 0) {
+ return len;
+ }
ccw_dev->sch->curr_status.scsw.count = ccw->count - len;
return 0;
@@ -50,7 +53,7 @@ static int handle_payload_3270_write(EmulatedCcw3270Device *dev, CCW1 *ccw)
len = ck->write_payload_3270(dev, ccw->cmd_code);
if (len <= 0) {
- return -EIO;
+ return len ? len : -EIO;
}
ccw_dev->sch->curr_status.scsw.count = ccw->count - len;