From e8fca9559230916e01ac33c17f4d83357c0cc5ab Mon Sep 17 00:00:00 2001 From: Peter Oberparleiter Date: Fri, 4 Feb 2022 16:21:22 +0100 Subject: [PATCH] zdev: Fix off-by one errors in cio_ignore handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chzdev fails to generate correct cio_ignore udev-rules for a CCW device with device number 0xffff. Also chzdev aborts due to a segmentation fault when a CCW device with CSSID 0xff is configured. Both issues are caused by off-by-one errors while interpreting CCW device ID limits CSSID_MAX, SSID_MAX and DEVNO_MAX. Fix these errors by correctly interpreting CCW device ID limits. Signed-off-by: Peter Oberparleiter Reviewed-by: Jan Höppner Reviewed-by: Vineeth Vijayan Signed-off-by: Jan Höppner --- zdev/src/ccw.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/zdev/src/ccw.c b/zdev/src/ccw.c index 39b264c6..e8c40f9f 100644 --- a/zdev/src/ccw.c +++ b/zdev/src/ccw.c @@ -804,17 +804,17 @@ void ccw_unblacklist_id_range(const char *range) static char ***id_bitmap_new(void) { - return misc_malloc(sizeof(char **) * CSSID_MAX); + return misc_malloc(sizeof(char **) * (CSSID_MAX + 1)); } static void id_bitmap_free(char ***id_bitmap) { unsigned int cssid, ssid; - for (cssid = 0; cssid < CSSID_MAX; cssid++) { + for (cssid = 0; cssid <= CSSID_MAX; cssid++) { if (!id_bitmap[cssid]) continue; - for (ssid = 0; ssid < SSID_MAX; ssid++) + for (ssid = 0; ssid <= SSID_MAX; ssid++) free(id_bitmap[cssid][ssid]); free(id_bitmap[cssid]); } @@ -965,15 +965,15 @@ static struct util_list *cio_ignore_get_ranges(bool autoconf) ranges = strlist_new(); id_bitmap = id_bitmap_collect(autoconf); - for (cssid = 0; cssid < CSSID_MAX; cssid++) { + for (cssid = 0; cssid <= CSSID_MAX; cssid++) { if (!id_bitmap[cssid]) continue; - for (ssid = 0; ssid < SSID_MAX; ssid++) { + for (ssid = 0; ssid <= SSID_MAX; ssid++) { if (!id_bitmap[cssid][ssid]) continue; first = NULL; last = NULL; - for (devno = 0; devno < DEVNO_MAX; devno++) { + for (devno = 0; devno <= DEVNO_MAX; devno++) { if (!id_bitmap_get(id_bitmap, cssid, ssid, devno)) { if (first) {