bsdinstall: Handle errors from geom_gettree.
geom_gettree probably never fails, and if it does there isn't much of a fallback other than aborting partitioning. However, a few places were checking the return value and not doing anything with it triggering a unused-but-set-variable warning. Checking the errors resolves the warning. While here, check for errors in other places that weren't checking for them at all, remove a spurious double call (the second call overwrote the mesh structure leaking all the pointers from the first), and close a few resource leaks on error paths. Reviewed by: imp, emaste Differential Revision: https://reviews.freebsd.org/D40779
This commit is contained in:
parent
78cb8841f0
commit
2309909919
@ -65,31 +65,37 @@ part_wizard(const char *fsreq)
|
||||
|
||||
startwizard:
|
||||
error = geom_gettree(&mesh);
|
||||
if (error != 0)
|
||||
return (1);
|
||||
|
||||
bsddialog_backtitle(&conf, "FreeBSD Installer");
|
||||
error = geom_gettree(&mesh);
|
||||
disk = boot_disk_select(&mesh);
|
||||
if (disk == NULL)
|
||||
if (disk == NULL) {
|
||||
geom_deletetree(&mesh);
|
||||
return (1);
|
||||
}
|
||||
|
||||
bsddialog_clearterminal();
|
||||
bsddialog_backtitle(&conf, "FreeBSD Installer");
|
||||
schemeroot = wizard_partition(&mesh, disk);
|
||||
free(disk);
|
||||
geom_deletetree(&mesh);
|
||||
if (schemeroot == NULL)
|
||||
return (1);
|
||||
|
||||
geom_deletetree(&mesh);
|
||||
bsddialog_clearterminal();
|
||||
bsddialog_backtitle(&conf, "FreeBSD Installer");
|
||||
error = geom_gettree(&mesh);
|
||||
if (error != 0) {
|
||||
free(schemeroot);
|
||||
return (1);
|
||||
}
|
||||
|
||||
error = wizard_makeparts(&mesh, schemeroot, fstype, 1);
|
||||
free(schemeroot);
|
||||
geom_deletetree(&mesh);
|
||||
if (error)
|
||||
goto startwizard;
|
||||
free(schemeroot);
|
||||
|
||||
geom_deletetree(&mesh);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -310,11 +316,13 @@ wizard_partition(struct gmesh *mesh, const char *disk)
|
||||
|
||||
if (strcmp(scheme, "MBR") == 0) {
|
||||
struct gmesh submesh;
|
||||
geom_gettree(&submesh);
|
||||
gpart_create(provider_for_name(&submesh, disk),
|
||||
"freebsd", NULL, NULL, &retval,
|
||||
choice /* Non-interactive for "Entire Disk" */);
|
||||
geom_deletetree(&submesh);
|
||||
|
||||
if (geom_gettree(&submesh) == 0) {
|
||||
gpart_create(provider_for_name(&submesh, disk),
|
||||
"freebsd", NULL, NULL, &retval,
|
||||
choice /* Non-interactive for "Entire Disk" */);
|
||||
geom_deletetree(&submesh);
|
||||
}
|
||||
} else {
|
||||
retval = strdup(disk);
|
||||
}
|
||||
@ -334,7 +342,7 @@ wizard_makeparts(struct gmesh *mesh, const char *disk, const char *fstype,
|
||||
struct gmesh submesh;
|
||||
char swapsizestr[10], rootsizestr[10];
|
||||
intmax_t swapsize, available;
|
||||
int retval;
|
||||
int error, retval;
|
||||
struct bsddialog_conf conf;
|
||||
|
||||
if (strcmp(fstype, "zfs") == 0) {
|
||||
@ -381,12 +389,16 @@ wizard_makeparts(struct gmesh *mesh, const char *disk, const char *fstype,
|
||||
humanize_number(rootsizestr, 7, available - swapsize - 1024*1024,
|
||||
"B", HN_AUTOSCALE, HN_NOSPACE | HN_DECIMAL);
|
||||
|
||||
geom_gettree(&submesh);
|
||||
error = geom_gettree(&submesh);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
pp = provider_for_name(&submesh, disk);
|
||||
gpart_create(pp, fsname, rootsizestr, "/", NULL, 0);
|
||||
geom_deletetree(&submesh);
|
||||
|
||||
geom_gettree(&submesh);
|
||||
error = geom_gettree(&submesh);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
pp = provider_for_name(&submesh, disk);
|
||||
gpart_create(pp, "freebsd-swap", swapsizestr, NULL, NULL, 0);
|
||||
geom_deletetree(&submesh);
|
||||
|
@ -63,9 +63,10 @@ sigint_handler(int sig)
|
||||
struct gmesh mesh;
|
||||
|
||||
/* Revert all changes and exit dialog-mode cleanly on SIGINT */
|
||||
geom_gettree(&mesh);
|
||||
gpart_revert_all(&mesh);
|
||||
geom_deletetree(&mesh);
|
||||
if (geom_gettree(&mesh) == 0) {
|
||||
gpart_revert_all(&mesh);
|
||||
geom_deletetree(&mesh);
|
||||
}
|
||||
|
||||
bsddialog_end();
|
||||
|
||||
@ -216,16 +217,17 @@ main(int argc, const char **argv)
|
||||
|
||||
if (prompt == NULL) {
|
||||
error = geom_gettree(&mesh);
|
||||
if (validate_setup()) {
|
||||
error = apply_changes(&mesh);
|
||||
} else {
|
||||
gpart_revert_all(&mesh);
|
||||
error = -1;
|
||||
if (error != 0) {
|
||||
if (validate_setup()) {
|
||||
error = apply_changes(&mesh);
|
||||
} else {
|
||||
gpart_revert_all(&mesh);
|
||||
error = -1;
|
||||
}
|
||||
geom_deletetree(&mesh);
|
||||
}
|
||||
}
|
||||
|
||||
geom_deletetree(&mesh);
|
||||
free(items);
|
||||
bsddialog_end();
|
||||
|
||||
return (error);
|
||||
|
@ -76,6 +76,8 @@ part_config(char *disk, const char *scheme, char *config)
|
||||
scheme = default_scheme();
|
||||
|
||||
error = geom_gettree(&mesh);
|
||||
if (error != 0)
|
||||
return (-1);
|
||||
if (provider_for_name(&mesh, disk) == NULL) {
|
||||
fprintf(stderr, "GEOM provider %s not found\n", disk);
|
||||
geom_deletetree(&mesh);
|
||||
@ -97,16 +99,22 @@ part_config(char *disk, const char *scheme, char *config)
|
||||
|
||||
if (strcmp(scheme, "MBR") == 0) {
|
||||
struct gmesh submesh;
|
||||
geom_gettree(&submesh);
|
||||
gpart_create(provider_for_name(&submesh, disk),
|
||||
"freebsd", NULL, NULL, &disk, 0);
|
||||
geom_deletetree(&submesh);
|
||||
|
||||
if (geom_gettree(&submesh) == 0) {
|
||||
gpart_create(provider_for_name(&submesh, disk),
|
||||
"freebsd", NULL, NULL, &disk, 0);
|
||||
geom_deletetree(&submesh);
|
||||
}
|
||||
} else {
|
||||
disk= strdup(disk);
|
||||
disk = strdup(disk);
|
||||
}
|
||||
|
||||
geom_deletetree(&mesh);
|
||||
error = geom_gettree(&mesh);
|
||||
if (error != 0) {
|
||||
free(disk);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* Create partitions */
|
||||
if (config == NULL) {
|
||||
@ -133,6 +141,10 @@ part_config(char *disk, const char *scheme, char *config)
|
||||
NULL, 0);
|
||||
geom_deletetree(&mesh);
|
||||
error = geom_gettree(&mesh);
|
||||
if (error != 0) {
|
||||
free(disk);
|
||||
return (-1);
|
||||
}
|
||||
size = type = mount = NULL;
|
||||
}
|
||||
|
||||
@ -143,8 +155,8 @@ part_config(char *disk, const char *scheme, char *config)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static
|
||||
int parse_disk_config(char *input)
|
||||
static int
|
||||
parse_disk_config(char *input)
|
||||
{
|
||||
char *ap;
|
||||
char *disk = NULL, *scheme = NULL, *partconfig = NULL;
|
||||
@ -184,9 +196,11 @@ int parse_disk_config(char *input)
|
||||
|
||||
if (disk == NULL || strcmp(disk, "DEFAULT") == 0) {
|
||||
struct gmesh mesh;
|
||||
geom_gettree(&mesh);
|
||||
disk = boot_disk_select(&mesh);
|
||||
geom_deletetree(&mesh);
|
||||
|
||||
if (geom_gettree(&mesh) == 0) {
|
||||
disk = boot_disk_select(&mesh);
|
||||
geom_deletetree(&mesh);
|
||||
}
|
||||
}
|
||||
|
||||
return (part_config(disk, scheme, partconfig));
|
||||
|
Loading…
Reference in New Issue
Block a user