diff options
Diffstat (limited to 'ubifs-utils')
| -rw-r--r-- | ubifs-utils/mkfs.ubifs/mkfs.ubifs.c | 38 | 
1 files changed, 25 insertions, 13 deletions
diff --git a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c index 2dee7a1..f5e2eb2 100644 --- a/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c +++ b/ubifs-utils/mkfs.ubifs/mkfs.ubifs.c @@ -509,11 +509,21 @@ static long long get_bytes(const char *str)  	return bytes;  } + +static void close_ubi(void) +{ +	if (ubi) { +		libubi_close(ubi); +		ubi = NULL; +	} +} +  /** - * open_ubi - open the UBI volume. + * open_ubi - open the libubi.   * @node: name of the UBI volume character device to fetch information about   * - * Returns %0 in case of success and %-1 in case of failure + * This function opens libubi, and initialize device & volume information + * according to @node. Returns %0 in case of success and %-1 in case of failure.   */  static int open_ubi(const char *node)  { @@ -525,10 +535,14 @@ static int open_ubi(const char *node)  	ubi = libubi_open();  	if (!ubi)  		return -1; -	if (ubi_get_vol_info(ubi, node, &c->vi)) +	if (ubi_get_vol_info(ubi, node, &c->vi)) { +		close_ubi();  		return -1; -	if (ubi_get_dev_info1(ubi, c->vi.dev_num, &c->di)) +	} +	if (ubi_get_dev_info1(ubi, c->vi.dev_num, &c->di)) { +		close_ubi();  		return -1; +	}  	return 0;  } @@ -2868,8 +2882,6 @@ static int close_target(void)  		if (close(out_fd) == -1)  			return sys_err_msg("cannot close the target '%s'", output);  	} -	if (ubi) -		libubi_close(ubi);  	if (output)  		free(output);  	return 0; @@ -3047,25 +3059,25 @@ int main(int argc, char *argv[])  	err = get_options(argc, argv);  	if (err) -		return err; +		goto out;  	err = open_target();  	if (err) -		return err; +		goto out;  	err = mkfs();  	if (err) {  		close_target(); -		return err; +		goto out;  	}  	err = close_target(); -	if (err) -		return err; -	if (verbose) +	if (verbose && !err)  		printf("Success!\n"); +out: +	close_ubi();  	crypto_cleanup(); -	return 0; +	return err;  }  | 
