From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1VVjkN-0003Tp-NE for mharc-grub-devel@gnu.org; Mon, 14 Oct 2013 11:07:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45202) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VVjkC-00039h-FC for grub-devel@gnu.org; Mon, 14 Oct 2013 11:07:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VVjk3-00060t-NO for grub-devel@gnu.org; Mon, 14 Oct 2013 11:07:40 -0400 Received: from mail-ea0-x229.google.com ([2a00:1450:4013:c01::229]:34682) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VVjk3-00060W-Dz for grub-devel@gnu.org; Mon, 14 Oct 2013 11:07:31 -0400 Received: by mail-ea0-f169.google.com with SMTP id k11so3495374eaj.28 for ; Mon, 14 Oct 2013 08:07:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type; bh=SXxv/Shv7NPUXwaJIZvxO79Q/RDN0tpQUdd0SQfNZ7E=; b=XuMx5caV9wRnA2fhGhhpdYZA6ohsF/xMf85WjiHQLEmHlMZHJChedo9/O29YmvTn/W 7xGOwFdIR9IcjcPELsLq/IZXL9D2ENbAsnBgSpm/j6Zh637OLf0VoOM4gfAyiXgiKwYn QUv4Dar3g77AYNmylDRKuqbXz/HUDDBEX0gDgX7OUp3Zj/h91pfyMNDmLK9DLj6cdozc HyEHudyBnHBjLJRae2DoZUgs00bN5d+qOvvyUO8mXarI4Kg1O+5T3krEwokzqE7ZIITB uL9NPT+VP51/MXRnjIBuk1mMTpbtQdIVV+r2L4qW78mP6VkSQ1Un/YsNmNB5jnIiQx+V 1eJw== X-Received: by 10.14.182.200 with SMTP id o48mr110978eem.86.1381763250638; Mon, 14 Oct 2013 08:07:30 -0700 (PDT) Received: from [192.47.249.190] (eduroam-249-190.unifr.ch. [192.47.249.190]) by mx.google.com with ESMTPSA id b45sm154462665eef.4.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 14 Oct 2013 08:07:29 -0700 (PDT) Message-ID: <525C08AF.5020904@gmail.com> Date: Mon, 14 Oct 2013 17:07:27 +0200 From: =?UTF-8?B?VmxhZGltaXIgJ8+GLWNvZGVyL3BoY29kZXInIFNlcmJpbmVua28=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130821 Icedove/17.0.8 MIME-Version: 1.0 To: The development of GNU GRUB Subject: Re: [PATCH] Fix prefix autodetection when booting from EFI CD-ROM References: <1359635040-23786-1-git-send-email-arvidjaar@gmail.com> In-Reply-To: <1359635040-23786-1-git-send-email-arvidjaar@gmail.com> X-Enigmail-Version: 1.5.1 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="----enig2RGIFRLROABEFJUQQQTVJ" X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:4013:c01::229 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Oct 2013 15:07:49 -0000 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) ------enig2RGIFRLROABEFJUQQQTVJ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Committed with a change to handle Apple HFS+ boot (return full disk only if no matching partition is found). Thanks. On 31.01.2013 13:24, Andrey Borzenkov wrote: > Fix autodetection of $prefix when booted from EFI CD-ROM. >=20 > Based on patch from Matthew Garrett, modified to not overwrite > memory returned by device path protocol handler and rebased to > current trunk. >=20 > Additionally fixes potential memory leak - dup_dp was not deallocated > if device path was not found. >=20 > Signed-off-by: Andrey Borzenkov >=20 > --- > grub-core/disk/efi/efidisk.c | 121 +++++++++++++++++++++++-----------= -------- > 1 file changed, 66 insertions(+), 55 deletions(-) >=20 > diff --git a/grub-core/disk/efi/efidisk.c b/grub-core/disk/efi/efidisk.= c > index 98cd226..15c8109 100644 > --- a/grub-core/disk/efi/efidisk.c > +++ b/grub-core/disk/efi/efidisk.c > @@ -775,67 +775,78 @@ grub_efidisk_get_device_name (grub_efi_handle_t *= handle) > if (! ldp) > return 0; > =20 > - if (GRUB_EFI_DEVICE_PATH_TYPE (ldp) =3D=3D GRUB_EFI_MEDIA_DEVICE_PAT= H_TYPE > - && (GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) > - =3D=3D GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE)) > + if (GRUB_EFI_DEVICE_PATH_TYPE (ldp) =3D=3D GRUB_EFI_MEDIA_DEVICE_PAT= H_TYPE) > { > - struct grub_efidisk_get_device_name_ctx ctx; > - char *dev_name; > - grub_efi_device_path_t *dup_dp, *dup_ldp; > - grub_disk_t parent =3D 0; > - > - /* It is necessary to duplicate the device path so that GRUB > - can overwrite it. */ > - dup_dp =3D duplicate_device_path (dp); > - if (! dup_dp) > - return 0; > - > - dup_ldp =3D find_last_device_path (dup_dp); > - dup_ldp->type =3D GRUB_EFI_END_DEVICE_PATH_TYPE; > - dup_ldp->subtype =3D GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; > - dup_ldp->length[0] =3D sizeof (*dup_ldp); > - dup_ldp->length[1] =3D 0; > + int is_cdrom =3D 0; > =20 > - if (!get_diskname_from_path (dup_dp, device_name)) > - return 0; > - parent =3D grub_disk_open (device_name); > - grub_free (dup_dp); > - > - if (! parent) > - return 0; > - > - /* Find a partition which matches the hard drive device path. *= / > - ctx.partition_name =3D NULL; > - grub_memcpy (&ctx.hd, ldp, sizeof (ctx.hd)); > - if (ctx.hd.partition_start =3D=3D 0 > - && ctx.hd.partition_size =3D=3D grub_disk_get_size (parent)) > - { > - dev_name =3D grub_strdup (parent->name); > - } > - else > + switch (GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp)) > { > - grub_partition_iterate (parent, grub_efidisk_get_device_name_iter, > - &ctx); > - > - if (! ctx.partition_name) > + case GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE: > + is_cdrom =3D 1; > + /* Intentionally fall through */ > + case GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE: > { > + struct grub_efidisk_get_device_name_ctx ctx; > + char *dev_name; > + grub_efi_device_path_t *dup_dp, *dup_ldp; > + grub_disk_t parent =3D 0; > + > + /* It is necessary to duplicate the device path so that GRUB > + can overwrite it. */ > + dup_dp =3D duplicate_device_path (dp); > + if (! dup_dp) > + return 0; > + > + dup_ldp =3D find_last_device_path (dup_dp); > + dup_ldp->type =3D GRUB_EFI_END_DEVICE_PATH_TYPE; > + dup_ldp->subtype =3D GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; > + dup_ldp->length[0] =3D sizeof (*dup_ldp); > + dup_ldp->length[1] =3D 0; > + > + if (!get_diskname_from_path (dup_dp, device_name)) > + { > + grub_free (dup_dp); > + return 0; > + } > + grub_free (dup_dp); > + if (is_cdrom) > + return grub_strdup (device_name); > + > + parent =3D grub_disk_open (device_name); > + if (! parent) > + return 0; > + > + /* Find a partition which matches the hard drive device path. = */ > + ctx.partition_name =3D NULL; > + grub_memcpy (&ctx.hd, ldp, sizeof (ctx.hd)); > + if (ctx.hd.partition_start =3D=3D 0 > + && ctx.hd.partition_size =3D=3D grub_disk_get_size (parent)) > + { > + dev_name =3D grub_strdup (parent->name); > + } > + else > + { > + grub_partition_iterate (parent, grub_efidisk_get_device_name_iter,= > + &ctx); > + > + if (! ctx.partition_name) > + { > + grub_disk_close (parent); > + return 0; > + } > + > + dev_name =3D grub_xasprintf ("%s,%s", parent->name, > + ctx.partition_name); > + grub_free (ctx.partition_name); > + } > grub_disk_close (parent); > - return 0; > - } > =20 > - dev_name =3D grub_xasprintf ("%s,%s", parent->name, > - ctx.partition_name); > - grub_free (ctx.partition_name); > + return dev_name; > + } > } > - grub_disk_close (parent); > - > - return dev_name; > - } > - else > - { > - /* This should be an entire disk. */ > - if (!get_diskname_from_path (dp, device_name)) > - return 0; > - return grub_strdup (device_name); > } > + /* This may be guessed device - floppy, cdrom or entire disk. */ > + if (!get_diskname_from_path (dp, device_name)) > + return 0; > + return grub_strdup (device_name); > } >=20 ------enig2RGIFRLROABEFJUQQQTVJ Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.15 (GNU/Linux) Comment: Using GnuPG with Icedove - http://www.enigmail.net/ iF4EAREKAAYFAlJcCK8ACgkQNak7dOguQgl6igEAvLlJQ1YRXOgrY/8bA5ZYqqpF z/NWLEBzBhyrxPaM2MsA/jVDZcNQ+jbb1/3JSjjAXTud5PKjqy0CIv+/vYQqG4V7 =8d2l -----END PGP SIGNATURE----- ------enig2RGIFRLROABEFJUQQQTVJ--