From 44374b10d1f0001cac887cf8c7d4dafca986b860 Mon Sep 17 00:00:00 2001 From: Boris Egorov Date: Fri, 14 Nov 2014 11:27:16 +0600 Subject: [PATCH] libfdisk: fix get_partition_unused_primary() Was: Mentioned function returns -1 if adding of primary partition is impossible. Caller treats this value as size_t (res variable) and then compares it for negative values, totally ignoring errors. Becomes: Now function takes address to variable and fills it with partition number. Caller treats return value as int and use it appropriately. [kzak@redhat.com: - don't mix return code and partno at all] Signed-off-by: Boris Egorov Signed-off-by: Karel Zak --- libfdisk/src/dos.c | 50 +++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/libfdisk/src/dos.c b/libfdisk/src/dos.c index b4456a947..1972ce252 100644 --- a/libfdisk/src/dos.c +++ b/libfdisk/src/dos.c @@ -186,24 +186,28 @@ static int is_cleared_partition(struct dos_partition *p) } static int get_partition_unused_primary(struct fdisk_context *cxt, - struct fdisk_partition *pa) + struct fdisk_partition *pa, + size_t *partno) { - size_t org = cxt->label->nparts_max, n; + size_t org, n; int rc; + assert(cxt); + assert(cxt->label); + assert(partno); + + org = cxt->label->nparts_max; + cxt->label->nparts_max = 4; rc = fdisk_partition_next_partno(pa, cxt, &n); cxt->label->nparts_max = org; - switch (rc) { - case 1: + if (rc == 1) { fdisk_info(cxt, _("All primary partitions have been defined already.")); - return -1; - case 0: - return n; - default: - return rc; - } + rc = -1; + } else if (rc == 0) + *partno = n; + return rc; } static int seek_sector(struct fdisk_context *cxt, sector_t secno) @@ -1464,8 +1468,8 @@ static int dos_add_partition(struct fdisk_context *cxt, fdisk_warnx(cxt, _("Extended partition already exists.")); return -EINVAL; } - res = get_partition_unused_primary(cxt, pa); - if (res >= 0) { + rc = get_partition_unused_primary(cxt, pa, &res); + if (rc == 0) { rc = add_partition(cxt, res, pa); goto done; } @@ -1473,8 +1477,8 @@ static int dos_add_partition(struct fdisk_context *cxt, /* pa specifies start, but outside extended partition */ } else if (pa && fdisk_partition_has_start(pa) && l->ext_offset) { DBG(LABEL, ul_debug("DOS: pa template %p: add primary", pa)); - res = get_partition_unused_primary(cxt, pa); - if (res >= 0) { + rc = get_partition_unused_primary(cxt, pa, &res); + if (rc == 0) { rc = add_partition(cxt, res, pa); goto done; } @@ -1531,8 +1535,8 @@ static int dos_add_partition(struct fdisk_context *cxt, } else if (cxt->label->nparts_max >= MAXIMUM_PARTS) { fdisk_info(cxt, _("All logical partitions are in use. " "Adding a primary partition.")); - res = get_partition_unused_primary(cxt, pa); - if (res >= 0) + rc = get_partition_unused_primary(cxt, pa, &res); + if (rc == 0) rc = add_partition(cxt, res, pa); } else { char hint[BUFSIZ]; @@ -1541,8 +1545,8 @@ static int dos_add_partition(struct fdisk_context *cxt, /* the default layout for scripts is to create primary partitions */ if (cxt->script) { - res = get_partition_unused_primary(cxt, pa); - if (res >= 0) + rc = get_partition_unused_primary(cxt, pa, &res); + if (rc == 0) rc = add_partition(cxt, res, pa); goto done; } @@ -1573,16 +1577,16 @@ static int dos_add_partition(struct fdisk_context *cxt, fdisk_free_ask(ask); if (c == 'p') { - res = get_partition_unused_primary(cxt, pa); - if (res >= 0) + rc = get_partition_unused_primary(cxt, pa, &res); + if (rc == 0) rc = add_partition(cxt, res, pa); goto done; } else if (c == 'l' && l->ext_offset) { rc = add_logical(cxt, pa, &res); goto done; } else if (c == 'e' && !l->ext_offset) { - res = get_partition_unused_primary(cxt, pa); - if (res >= 0) { + rc = get_partition_unused_primary(cxt, pa, &res); + if (rc == 0) { struct fdisk_partition *xpa = NULL; struct fdisk_parttype *t; @@ -1607,7 +1611,7 @@ static int dos_add_partition(struct fdisk_context *cxt, done: if (rc == 0) { cxt->label->nparts_cur++; - if (partno && res >= 0) + if (partno) *partno = res; } return rc;