mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-21 22:53:37 +00:00
fish options parsing: Allow add_drives to be called multiple times.
Ensure that the drv structure is always zeroed on allocation. Don't leak old drv->device when add_drives is called multiple times.
This commit is contained in:
@@ -189,18 +189,17 @@ main (int argc, char *argv[])
|
||||
while (optind < argc - 1) {
|
||||
if (strchr (argv[optind], '/') ||
|
||||
access (argv[optind], F_OK) == 0) { /* simulate -a option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
drv->type = drv_a;
|
||||
drv->a.filename = argv[optind];
|
||||
drv->a.format = NULL;
|
||||
drv->next = drvs;
|
||||
drvs = drv;
|
||||
} else { /* simulate -d option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
@@ -297,18 +297,17 @@ main (int argc, char *argv[])
|
||||
while (optind < argc - 1) {
|
||||
if (strchr (argv[optind], '/') ||
|
||||
access (argv[optind], F_OK) == 0) { /* simulate -a option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
drv->type = drv_a;
|
||||
drv->a.filename = argv[optind];
|
||||
drv->a.format = NULL;
|
||||
drv->next = drvs;
|
||||
drvs = drv;
|
||||
} else { /* simulate -d option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
@@ -210,18 +210,17 @@ main (int argc, char *argv[])
|
||||
while (optind < argc) {
|
||||
if (strchr (argv[optind], '/') ||
|
||||
access (argv[optind], F_OK) == 0) { /* simulate -a option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
drv->type = drv_a;
|
||||
drv->a.filename = argv[optind];
|
||||
drv->a.format = NULL;
|
||||
drv->next = drvs;
|
||||
drvs = drv;
|
||||
} else { /* simulate -d option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
@@ -227,18 +227,17 @@ main (int argc, char *argv[])
|
||||
while (optind < argc - 1) {
|
||||
if (strchr (argv[optind], '/') ||
|
||||
access (argv[optind], F_OK) == 0) { /* simulate -a option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
drv->type = drv_a;
|
||||
drv->a.filename = argv[optind];
|
||||
drv->a.format = NULL;
|
||||
drv->next = drvs;
|
||||
drvs = drv;
|
||||
} else { /* simulate -d option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
@@ -341,13 +341,12 @@ main (int argc, char *argv[])
|
||||
list_prepared_drives ();
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
drv->type = drv_N;
|
||||
drv->device = NULL;
|
||||
drv->nr_drives = -1;
|
||||
if (asprintf (&drv->N.filename, "test%d.img",
|
||||
next_prepared_drive++) == -1) {
|
||||
@@ -415,18 +414,17 @@ main (int argc, char *argv[])
|
||||
while (optind < argc) {
|
||||
if (strchr (argv[optind], '/') ||
|
||||
access (argv[optind], F_OK) == 0) { /* simulate -a option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
drv->type = drv_a;
|
||||
drv->a.filename = argv[optind];
|
||||
drv->a.format = NULL;
|
||||
drv->next = drvs;
|
||||
drvs = drv;
|
||||
} else { /* simulate -d option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
@@ -43,6 +43,9 @@ add_drives (struct drv *drv, char next_drive)
|
||||
if (drv) {
|
||||
next_drive = add_drives (drv->next, next_drive);
|
||||
|
||||
free (drv->device);
|
||||
drv->device = NULL;
|
||||
|
||||
if (asprintf (&drv->device, "/dev/sd%c", next_drive) == -1) {
|
||||
perror ("asprintf");
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
@@ -75,7 +75,9 @@ extern int echo_keys;
|
||||
extern const char *libvirt_uri;
|
||||
extern const char *program_name;
|
||||
|
||||
/* List of drives added via -a, -d or -N options. */
|
||||
/* List of drives added via -a, -d or -N options. NB: Unused fields
|
||||
* in this struct MUST be zeroed, ie. use calloc, not malloc.
|
||||
*/
|
||||
struct drv {
|
||||
struct drv *next;
|
||||
|
||||
@@ -139,13 +141,12 @@ extern int add_libvirt_drives (const char *guest);
|
||||
perror (optarg); \
|
||||
exit (EXIT_FAILURE); \
|
||||
} \
|
||||
drv = malloc (sizeof (struct drv)); \
|
||||
drv = calloc (1, sizeof (struct drv)); \
|
||||
if (!drv) { \
|
||||
perror ("malloc"); \
|
||||
exit (EXIT_FAILURE); \
|
||||
} \
|
||||
drv->type = drv_a; \
|
||||
drv->device = NULL; \
|
||||
drv->nr_drives = -1; \
|
||||
drv->a.filename = optarg; \
|
||||
drv->a.format = format; \
|
||||
@@ -156,13 +157,12 @@ extern int add_libvirt_drives (const char *guest);
|
||||
libvirt_uri = optarg
|
||||
|
||||
#define OPTION_d \
|
||||
drv = malloc (sizeof (struct drv)); \
|
||||
drv = calloc (1, sizeof (struct drv)); \
|
||||
if (!drv) { \
|
||||
perror ("malloc"); \
|
||||
exit (EXIT_FAILURE); \
|
||||
} \
|
||||
drv->type = drv_d; \
|
||||
drv->device = NULL; \
|
||||
drv->nr_drives = -1; \
|
||||
drv->d.guest = optarg; \
|
||||
drv->next = drvs; \
|
||||
|
||||
@@ -209,18 +209,17 @@ main (int argc, char *argv[])
|
||||
while (optind < argc) {
|
||||
if (strchr (argv[optind], '/') ||
|
||||
access (argv[optind], F_OK) == 0) { /* simulate -a option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
drv->type = drv_a;
|
||||
drv->a.filename = argv[optind];
|
||||
drv->a.format = NULL;
|
||||
drv->next = drvs;
|
||||
drvs = drv;
|
||||
} else { /* simulate -d option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
@@ -240,18 +240,17 @@ main (int argc, char *argv[])
|
||||
while (optind < argc) {
|
||||
if (strchr (argv[optind], '/') ||
|
||||
access (argv[optind], F_OK) == 0) { /* simulate -a option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
drv->type = drv_a;
|
||||
drv->a.filename = argv[optind];
|
||||
drv->a.format = NULL;
|
||||
drv->next = drvs;
|
||||
drvs = drv;
|
||||
} else { /* simulate -d option */
|
||||
drv = malloc (sizeof (struct drv));
|
||||
drv = calloc (1, sizeof (struct drv));
|
||||
if (!drv) {
|
||||
perror ("malloc");
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
Reference in New Issue
Block a user