* util/getroot.c (grub_util_get_dm_node_linear_info): Fix memory leak.

* grub-core/disk/cryptodisk.c (cryptodisk_cleanup): Disable for
	now to avoid double free.
	* grub-core/kern/emu/hostdisk.c (grub_util_biosdisk_dev): Rename to
	hostdisk.
	* include/grub/disk.h (grub_disk_dev_id): New id HOSTDISK.
	* util/grub-probe.c (escape_of_path): Always return a new copy.
	(print_full_name): Escape path.
	(probe): Don't call grub_util_devname_to_ofpath on NULL.
	Fix hints on abstractions.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-01-29 21:49:44 +01:00
parent ebe2c96154
commit 63fe43f3c3
6 changed files with 60 additions and 18 deletions

View file

@ -1,3 +1,16 @@
2012-01-29 Vladimir Serbinenko <phcoder@gmail.com>
* util/getroot.c (grub_util_get_dm_node_linear_info): Fix memory leak.
* grub-core/disk/cryptodisk.c (cryptodisk_cleanup): Disable for
now to avoid double free.
* grub-core/kern/emu/hostdisk.c (grub_util_biosdisk_dev): Rename to
hostdisk.
* include/grub/disk.h (grub_disk_dev_id): New id HOSTDISK.
* util/grub-probe.c (escape_of_path): Always return a new copy.
(print_full_name): Escape path.
(probe): Don't call grub_util_devname_to_ofpath on NULL.
Fix hints on abstractions.
2012-01-29 Vladimir Serbinenko <phcoder@gmail.com> 2012-01-29 Vladimir Serbinenko <phcoder@gmail.com>
* util/grub-mkconfig_lib.in (prepare_grub_to_access_device): * util/grub-mkconfig_lib.in (prepare_grub_to_access_device):

View file

@ -658,6 +658,7 @@ grub_cryptodisk_memberlist (grub_disk_t disk)
static void static void
cryptodisk_cleanup (void) cryptodisk_cleanup (void)
{ {
#if 0
grub_cryptodisk_t dev = cryptodisk_list; grub_cryptodisk_t dev = cryptodisk_list;
grub_cryptodisk_t tmp; grub_cryptodisk_t tmp;
@ -671,6 +672,7 @@ cryptodisk_cleanup (void)
grub_free (dev); grub_free (dev);
dev = tmp; dev = tmp;
} }
#endif
} }
grub_err_t grub_err_t

View file

@ -1107,8 +1107,8 @@ grub_util_biosdisk_close (struct grub_disk *disk)
static struct grub_disk_dev grub_util_biosdisk_dev = static struct grub_disk_dev grub_util_biosdisk_dev =
{ {
.name = "biosdisk", .name = "hostdisk",
.id = GRUB_DISK_DEVICE_BIOSDISK_ID, .id = GRUB_DISK_DEVICE_HOSTDISK_ID,
.iterate = grub_util_biosdisk_iterate, .iterate = grub_util_biosdisk_iterate,
.open = grub_util_biosdisk_open, .open = grub_util_biosdisk_open,
.close = grub_util_biosdisk_close, .close = grub_util_biosdisk_close,

View file

@ -40,6 +40,7 @@ enum grub_disk_dev_id
GRUB_DISK_DEVICE_SCSI_ID, GRUB_DISK_DEVICE_SCSI_ID,
GRUB_DISK_DEVICE_CRYPTODISK_ID, GRUB_DISK_DEVICE_CRYPTODISK_ID,
GRUB_DISK_DEVICE_ARCDISK_ID, GRUB_DISK_DEVICE_ARCDISK_ID,
GRUB_DISK_DEVICE_HOSTDISK_ID,
}; };
struct grub_disk; struct grub_disk;

View file

@ -1246,33 +1246,48 @@ grub_util_get_dm_node_linear_info (const char *dev,
return 0; return 0;
if (!dm_task_set_name(dmt, dev)) if (!dm_task_set_name(dmt, dev))
{
dm_task_destroy (dmt);
return 0; return 0;
}
dm_task_no_open_count(dmt); dm_task_no_open_count(dmt);
if (!dm_task_run(dmt)) if (!dm_task_run(dmt))
{
dm_task_destroy (dmt);
return 0; return 0;
}
next = dm_get_next_target(dmt, next, &start, &length, next = dm_get_next_target(dmt, next, &start, &length,
&target, &params); &target, &params);
if (grub_strcmp (target, "linear") != 0) if (grub_strcmp (target, "linear") != 0)
{
dm_task_destroy (dmt);
return 0; return 0;
}
major = grub_strtoul (params, &ptr, 10); major = grub_strtoul (params, &ptr, 10);
if (grub_errno) if (grub_errno)
{ {
dm_task_destroy (dmt);
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
return 0; return 0;
} }
if (*ptr != ':') if (*ptr != ':')
{
dm_task_destroy (dmt);
return 0; return 0;
}
ptr++; ptr++;
minor = grub_strtoul (ptr, 0, 10); minor = grub_strtoul (ptr, 0, 10);
if (grub_errno) if (grub_errno)
{ {
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
dm_task_destroy (dmt);
return 0; return 0;
} }
if (maj) if (maj)
*maj = major; *maj = major;
if (min) if (min)
*min = minor; *min = minor;
dm_task_destroy (dmt);
return 1; return 1;
} }
#endif #endif

View file

@ -149,7 +149,7 @@ escape_of_path (const char *orig_path)
const char *p; const char *p;
if (!strchr (orig_path, ',')) if (!strchr (orig_path, ','))
return (char *) orig_path; return (char *) xstrdup (orig_path);
new_path = xmalloc (strlen (orig_path) * 2 + sizeof ("ieee1275/")); new_path = xmalloc (strlen (orig_path) * 2 + sizeof ("ieee1275/"));
@ -259,14 +259,16 @@ guess_baremetal_drive (const char *orig_path)
static void static void
print_full_name (const char *drive, grub_device_t dev) print_full_name (const char *drive, grub_device_t dev)
{ {
char *dname = escape_of_path (drive);
if (dev->disk->partition) if (dev->disk->partition)
{ {
char *pname = grub_partition_get_name (dev->disk->partition); char *pname = grub_partition_get_name (dev->disk->partition);
printf ("%s,%s", drive, pname); printf ("%s,%s", dname, pname);
free (pname); free (pname);
} }
else else
printf ("%s", drive); printf ("%s", dname);
free (dname);
} }
static void static void
@ -363,17 +365,15 @@ probe (const char *path, char *device_name)
if (print == PRINT_HINT_STR) if (print == PRINT_HINT_STR)
{ {
const char *osdev = grub_util_biosdisk_get_osdev (dev->disk); const char *osdev = grub_util_biosdisk_get_osdev (dev->disk);
const char *orig_path = grub_util_devname_to_ofpath (osdev); const char *ofpath = osdev ? grub_util_devname_to_ofpath (osdev) : 0;
char *biosname, *bare, *efi; char *biosname, *bare, *efi;
const char *map; const char *map;
if (orig_path) if (ofpath)
{ {
char *ofpath = escape_of_path (orig_path);
printf ("--hint-ieee1275='"); printf ("--hint-ieee1275='");
print_full_name (ofpath, dev); print_full_name (ofpath, dev);
printf ("' "); printf ("' ");
free (ofpath);
} }
biosname = guess_bios_drive (device_name); biosname = guess_bios_drive (device_name);
@ -417,6 +417,16 @@ probe (const char *path, char *device_name)
goto end; goto end;
} }
if ((print == PRINT_COMPATIBILITY_HINT || print == PRINT_BIOS_HINT
|| print == PRINT_IEEE1275_HINT || print == PRINT_BAREMETAL_HINT
|| print == PRINT_EFI_HINT || print == PRINT_ARC_HINT)
&& dev->disk->dev->id != GRUB_DISK_DEVICE_HOSTDISK_ID)
{
print_full_name (dev->disk->name, dev);
printf ("\n");
goto end;
}
if (print == PRINT_COMPATIBILITY_HINT) if (print == PRINT_COMPATIBILITY_HINT)
{ {
const char *map; const char *map;
@ -449,8 +459,7 @@ probe (const char *path, char *device_name)
if (print == PRINT_IEEE1275_HINT) if (print == PRINT_IEEE1275_HINT)
{ {
const char *osdev = grub_util_biosdisk_get_osdev (dev->disk); const char *osdev = grub_util_biosdisk_get_osdev (dev->disk);
const char *orig_path = grub_util_devname_to_ofpath (osdev); const char *ofpath = grub_util_devname_to_ofpath (osdev);
char *ofpath = escape_of_path (orig_path);
const char *map; const char *map;
map = grub_util_biosdisk_get_compatibility_hint (dev->disk); map = grub_util_biosdisk_get_compatibility_hint (dev->disk);
@ -460,11 +469,13 @@ probe (const char *path, char *device_name)
print_full_name (map, dev); print_full_name (map, dev);
} }
if (ofpath)
{
printf (" "); printf (" ");
print_full_name (ofpath, dev); print_full_name (ofpath, dev);
}
printf ("\n"); printf ("\n");
free (ofpath);
goto end; goto end;
} }
if (print == PRINT_EFI_HINT) if (print == PRINT_EFI_HINT)