summaryrefslogtreecommitdiff
path: root/usr/src/lib/libfdisk/common/libfdisk.c
diff options
context:
space:
mode:
authorSharath M Srinivasan <Sharath.Srinivasan@Sun.COM>2010-01-15 10:09:57 +0530
committerSharath M Srinivasan <Sharath.Srinivasan@Sun.COM>2010-01-15 10:09:57 +0530
commit02032da2d8b8c39f8555e913f6239bba49238e55 (patch)
tree04127259ec0d522fe392686f057c5676f328aa4a /usr/src/lib/libfdisk/common/libfdisk.c
parentb344f6b3aaff135e766e22b3d18489fe22a74198 (diff)
downloadillumos-joyent-02032da2d8b8c39f8555e913f6239bba49238e55.tar.gz
6909170 bootadm dumps core during bfu
Diffstat (limited to 'usr/src/lib/libfdisk/common/libfdisk.c')
-rw-r--r--usr/src/lib/libfdisk/common/libfdisk.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/usr/src/lib/libfdisk/common/libfdisk.c b/usr/src/lib/libfdisk/common/libfdisk.c
index 0664bff1fa..d10443334b 100644
--- a/usr/src/lib/libfdisk/common/libfdisk.c
+++ b/usr/src/lib/libfdisk/common/libfdisk.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -158,6 +158,7 @@ libfdisk_init(ext_part_t **epp, char *devstr, struct ipart *parttab, int opflag)
int found_bad_magic = 0;
if ((temp = calloc(1, sizeof (ext_part_t))) == NULL) {
+ *epp = NULL;
return (ENOMEM);
}
@@ -185,23 +186,24 @@ libfdisk_init(ext_part_t **epp, char *devstr, struct ipart *parttab, int opflag)
if (stat(temp->device_name, &sbuf) != 0) {
/* Failed all options, give up */
- free(temp);
- return (EINVAL);
+ rval = EINVAL;
+ goto fail;
}
}
}
/* Make sure the device is a raw device */
if ((sbuf.st_mode & S_IFMT) != S_IFCHR) {
- return (EINVAL);
+ rval = EINVAL;
+ goto fail;
}
temp->ld_head = NULL;
temp->sorted_ld_head = NULL;
if ((temp->dev_fd = open(temp->device_name, O_RDWR, 0666)) < 0) {
- free(temp);
- return (EINVAL);
+ rval = EINVAL;
+ goto fail;
}
if ((temp->mtable = parttab) == NULL) {
@@ -213,7 +215,7 @@ libfdisk_init(ext_part_t **epp, char *devstr, struct ipart *parttab, int opflag)
* obtaining the disk geometry.
*/
if (rval != FDISK_EBADMAGIC)
- return (rval);
+ goto fail;
else
found_bad_magic = 1;
}
@@ -222,7 +224,7 @@ libfdisk_init(ext_part_t **epp, char *devstr, struct ipart *parttab, int opflag)
temp->op_flag = opflag;
if ((rval = fdisk_init_disk_geom(temp)) != FDISK_SUCCESS) {
- return (rval);
+ goto fail;
}
*epp = temp;
@@ -235,6 +237,11 @@ libfdisk_init(ext_part_t **epp, char *devstr, struct ipart *parttab, int opflag)
rval = fdisk_read_extpart(*epp);
}
return (rval);
+
+fail:
+ *epp = NULL;
+ free(temp);
+ return (rval);
}
int
@@ -256,6 +263,9 @@ libfdisk_reset(ext_part_t *epp)
void
libfdisk_fini(ext_part_t **epp)
{
+ if (*epp == NULL)
+ return;
+
fdisk_free_ld_nodes(*epp);
(void) close((*epp)->dev_fd);
free(*epp);