zdev: Fix off-by one errors in cio_ignore handling

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 <oberpar@linux.ibm.com>
Reviewed-by: Jan Höppner <hoeppner@linux.ibm.com>
Reviewed-by: Vineeth Vijayan <vneethv@linux.ibm.com>
Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
Peter Oberparleiter
2022-02-04 16:21:22 +01:00
committed by Jan Höppner
parent b5604850ab
commit e8fca95592

View File

@@ -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) {