Hello community, here is the log from the commit of package efibootmgr for openSUSE:12.3 checked in at 2013-02-19 16:13:28 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:12.3/efibootmgr (Old) and /work/SRC/openSUSE:12.3/.efibootmgr.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "efibootmgr", Maintainer is "r...@suse.com" Changes: -------- --- /work/SRC/openSUSE:12.3/efibootmgr/efibootmgr.changes 2013-01-31 01:15:29.000000000 +0100 +++ /work/SRC/openSUSE:12.3/.efibootmgr.new/efibootmgr.changes 2013-02-19 16:13:34.000000000 +0100 @@ -1,0 +2,10 @@ +Tue Feb 12 16:38:47 UTC 2013 - r...@suse.com + +- Apply critical upstream fixes + o for memory leaking variable creation. [bnc#746324] + o to improve spec conformance by removing device path padding. + o to work around broken Apple firmware. + efibootmgr-0.5.4-sector-size.diff + efibootmgr-0.5.4-catchup.diff + +------------------------------------------------------------------- New: ---- efibootmgr-0.5.4-catchup.diff efibootmgr-0.5.4-sector-size.diff ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ efibootmgr.spec ++++++ --- /var/tmp/diff_new_pack.PiVNJ2/_old 2013-02-19 16:13:36.000000000 +0100 +++ /var/tmp/diff_new_pack.PiVNJ2/_new 2013-02-19 16:13:36.000000000 +0100 @@ -1,7 +1,7 @@ # # spec file for package efibootmgr # -# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -25,6 +25,8 @@ Url: http://linux.dell.com/efibootmgr/ Source: http://linux.dell.com/efibootmgr/efibootmgr-%{version}.tar.gz Patch0: %{name}-%{version}.diff +Patch1: %{name}-%{version}-sector-size.diff +Patch2: %{name}-%{version}-catchup.diff BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: pciutils-devel BuildRequires: zlib-devel @@ -39,6 +41,8 @@ %prep %setup -q %patch0 -p1 +%patch1 -p1 +%patch2 -p1 chmod +x tools/install.pl %build ++++++ efibootmgr-0.5.4-catchup.diff ++++++ --- Makefile | 2 - doc/ChangeLog | 66 ++++++++++++++++++++++++++++++++++++++++++++ src/efibootmgr/efibootmgr.c | 9 +++++- src/include/efi.h | 2 + src/lib/disk.c | 1 src/lib/efivars_sysfs.c | 4 ++ src/lib/gpt.c | 6 ++-- src/man/man8/efibootmgr.8 | 10 ++++-- 8 files changed, 92 insertions(+), 8 deletions(-) --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,69 @@ +commit de0ca446e7e5439306f7f54806d1a15310588426 +Author: Jordan Hargrave <jordan_hargr...@dell.com> +Date: Thu Nov 29 10:11:43 2012 -0600 + + Add patches from fedora release + * Wed Nov 28 2012 Matthew Garrett <mj...@srcf.ucam.org> - 0.5.4-14 + - efibootmgr-0.5.4-Work-around-broken-Apple-firmware.patch + Resolves: #873629 + - efibootmgr-0.5.4-Remove-device-path-padding-on-non-Itanium.patch - improve + spec conformance + +commit 9392250bd8668ef7544530d17800dc0271cd8bf3 +Author: Jordan Hargrave <jordan_hargr...@dell.com> +Date: Tue Apr 24 12:58:57 2012 -0500 + + From: Lane Winner<lane.win...@oracle.com> + + make_boot_var does not check for failed status with create_variable. + This can result in a memory leak. + Additionally the user should be notified of the problem. + + We encounter this issue on one system after filling up the UEFI boot list + with dummy devices. + + The patch fix the problem. It was verified on a Mensa system using RHEL 6.0 + + Signed-off-by: Yinghai Lu<ying...@kernel.org> + +commit 8602b3c41701572669b1f8b9c45409d98405eca2 +Author: Peter Jones <pjo...@redhat.com> +Date: Wed Jul 14 11:26:49 2010 -0700 + + Handle sector_size != 512. + + Disks can have 4kB sectors now, so don't just bail out when that's the + case. + +commit fb3d9a8d9bfd580d23b14b384a393510e0a749ac +Author: Matt Domsch <matt_dom...@dell.com> +Date: Thu Jul 23 14:20:19 2009 -0500 + + fix disk minor number discovery + + Raymund Will noted disk_info_from_fd() incorrectly used logical && + instead of bitwise & when obtaining the minor number. + + Reported in https://bugzilla.novell.com/show_bug.cgi?id=524529#c1 + +commit acac7412e8e0819fc66cdadc06ad4ca535f29b35 +Author: Matt Domsch <matt_dom...@dell.com> +Date: Thu Jul 23 14:18:11 2009 -0500 + + fix minor memory leak + + David Binderman noted new_data was being allocated but not freed. Not + a big deal as the program exits soon thereafter (and is thus freed), + but worth fixing anyhow. + + Fixes https://bugzilla.novell.com/show_bug.cgi?id=524529#c1 + +commit c8d6ceaa7b33f952bcf32bc017ce8b5d7d659267 +Author: Matt Domsch <matt_dom...@dell.com> +Date: Fri Jan 11 15:09:12 2008 -0600 + + update ChangeLog + commit 6e6bf6fc7665851798a6c2c92893ebb629e42aff Author: Matt Domsch <matt_dom...@dell.com> Date: Fri Jan 11 15:08:12 2008 -0600 --- a/src/efibootmgr/efibootmgr.c +++ b/src/efibootmgr/efibootmgr.c @@ -239,6 +239,7 @@ warn_duplicate_name(list_t *boot_list) static var_entry_t * make_boot_var(list_t *boot_list) { + efi_status_t status; var_entry_t *boot; int free_number; list_t *pos; @@ -271,7 +272,12 @@ make_boot_var(list_t *boot_list) free(boot); return NULL; } - create_variable(&boot->var_data); + + status = create_variable(&boot->var_data); + if (status != EFI_SUCCESS) { + free(boot); + return NULL; + } list_add_tail(&boot->list, boot_list); return boot; } @@ -328,6 +334,7 @@ add_to_boot_order(uint16_t num) /* Now new_data has what we need */ memcpy(&(boot_order.Data), new_data, new_data_size); boot_order.DataSize = new_data_size; + free(new_data); return create_or_edit_variable(&boot_order); } --- a/src/include/efi.h +++ b/src/include/efi.h @@ -294,7 +294,9 @@ typedef struct { uint8_t signature[16]; uint8_t mbr_type; uint8_t signature_type; +#ifdef __ia64 uint8_t padding[6]; /* Emperically needed */ +#endif } __attribute__((packed)) HARDDRIVE_DEVICE_PATH; typedef struct { --- a/src/lib/efivars_sysfs.c +++ b/src/lib/efivars_sysfs.c @@ -55,6 +55,10 @@ sysfs_read_variable(const char *name, ef return EFI_INVALID_PARAMETER; } close(fd); + /* latest apple firmware sets high bit which appears invalid + to the linux kernel if we write it back so lets zero it out + if it is set since it would be invalid to set it anyway */ + var->Attributes = var->Attributes & ~(1 << 31); return var->Status; } --- a/src/man/man8/efibootmgr.8 +++ b/src/man/man8/efibootmgr.8 @@ -3,7 +3,7 @@ .\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng <st...@ggi-project.org>. -.TH "EFIBOOTMGR" "8" "11 August 2005" "" "" +.TH "EFIBOOTMGR" "8" "11 January 2012" "" "" .SH NAME efibootmgr \- manipulate the EFI Boot Manager @@ -127,6 +127,9 @@ the data, so you can pass any binary or 1. .SS "DISPLAYING THE CURRENT SETTINGS (MUST BE ROOT)." .PP +.PP +.nf +.B [root@localhost ~]# efibootmgr BootCurrent: 0004 BootNext: 0003 @@ -137,6 +140,7 @@ Boot0001* CD-ROM Drive(device:FF) Boot0002* Hard Drive(Device:80)/HD(Part1,Sig00112233) Boot0003* PXE Boot: MAC(00D0B7C15D91) Boot0004* Linux +.fi .PP This shows: .RS @@ -217,8 +221,8 @@ You create the boot entry with: \fBefibootmgr -c -i eth0 -H 222F -U 500 -L netboot\fR .SH "BUGS" .PP -Please direct any bugs, features, patches, etc. to Matt Domsch -<matt_dom...@dell.com>\&. +Please direct any bugs, features, patches, etc. to Jordan Hargrave +<jordan_hargr...@dell.com>\&. .SH "AUTHOR" .PP This man page was generated by dann frazier <da...@debian.org> for the --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ RELEASE_MAJOR := 0 RELEASE_MINOR := 5 RELEASE_SUBLEVEL := 4 - RELEASE_EXTRALEVEL := + RELEASE_EXTRALEVEL := .suse2 RELEASE_NAME := efibootmgr RELEASE_STRING := $(RELEASE_NAME)-$(RELEASE_MAJOR).$(RELEASE_MINOR).$(RELEASE_SUBLEVEL)$(RELEASE_EXTRALEVEL) --- a/src/lib/disk.c +++ b/src/lib/disk.c @@ -471,6 +471,7 @@ disk_get_partition_info (int fd, int rc=0; int sector_size = get_sector_size(fd); + mbr_size = lcm(sizeof(*mbr), sector_size); if ((rc = posix_memalign(&mbr_sector, sector_size, mbr_size)) != 0) goto error; --- a/src/lib/gpt.c +++ b/src/lib/gpt.c @@ -215,8 +215,8 @@ read_lastoddsector(int fd, uint64_t lba, static ssize_t read_lba(int fd, uint64_t lba, void *buffer, size_t bytes) { - int sector_size = get_sector_size(fd); - off_t offset = lba * sector_size; + int sector_size = get_sector_size(fd); + off_t offset = lba * sector_size; ssize_t bytesread; void *iobuf; size_t iobuf_size; @@ -229,7 +229,7 @@ read_lba(int fd, uint64_t lba, void *buf memset(iobuf, 0, bytes); - lseek(fd, offset, SEEK_SET); + lseek(fd, offset, SEEK_SET); bytesread = read(fd, iobuf, iobuf_size); memcpy(buffer, iobuf, bytes); free(iobuf); ++++++ efibootmgr-0.5.4-sector-size.diff ++++++ >From b8af2c229031e274a2c61293a1a634e515a56d27 Mon Sep 17 00:00:00 2001 In-Reply-To: <1279121617-17961-1-git-send-email-pjo...@redhat.com> References: <1279121617-17961-1-git-send-email-pjo...@redhat.com> From: Peter Jones <pjo...@redhat.com> Date: Wed, 14 Jul 2010 14:55:17 -0400 Subject: [efibootmgr patch] Handle sector_size != 512. Disks can have 4kB sectors now, so don't just bail out when that's the case. --- src/include/disk.h | 3 +++ src/lib/disk.c | 42 ++++++++++++++++++++++++++++++++---------- src/lib/gpt.c | 24 +++++++++++------------- 3 files changed, 46 insertions(+), 23 deletions(-) --- a/src/include/disk.h +++ b/src/include/disk.h @@ -65,6 +65,9 @@ enum _interface_type {interface_type_unk ata, atapi, scsi, usb, i1394, fibre, i2o, md}; + +unsigned int lcm(unsigned int x, unsigned int y); + int disk_get_pci(int fd, unsigned char *bus, unsigned char *device, --- a/src/lib/disk.c +++ b/src/lib/disk.c @@ -420,6 +420,27 @@ get_sector_size(int filedes) return sector_size; } +/************************************************************ + * lcm + * Requires: + * - numbers of which to find the lowest common multiple + * Modifies: nothing + * Returns: + * lowest common multiple of x and y + ************************************************************/ +unsigned int +lcm(unsigned int x, unsigned int y) +{ + unsigned int m = x, n = y, o; + + while ((o = m % n)) { + m = n; + n = o; + } + + return (x / n) * y; +} + /** * disk_get_partition_info() * @fd - open file descriptor to disk @@ -442,26 +463,26 @@ disk_get_partition_info (int fd, uint8_t *mbr_type, uint8_t *signature_type) { legacy_mbr *mbr; - void *mbr_unaligned; + void *mbr_sector; + size_t mbr_size; off_t offset; int this_bytes_read = 0; int gpt_invalid=0, mbr_invalid=0; int rc=0; int sector_size = get_sector_size(fd); - if (sizeof(*mbr) != sector_size) - return 1; - mbr_unaligned = malloc(sizeof(*mbr)+sector_size-1); - mbr = (legacy_mbr *) - (((unsigned long)mbr_unaligned + sector_size - 1) & - ~(unsigned long)(sector_size-1)); - memset(mbr, 0, sizeof(*mbr)); + mbr_size = lcm(sizeof(*mbr), sector_size); + if ((rc = posix_memalign(&mbr_sector, sector_size, mbr_size)) != 0) + goto error; + memset(mbr_sector, '\0', mbr_size); + offset = lseek(fd, 0, SEEK_SET); - this_bytes_read = read(fd, mbr, sizeof(*mbr)); + this_bytes_read = read(fd, mbr_sector, mbr_size); if (this_bytes_read < sizeof(*mbr)) { rc=1; goto error_free_mbr; } + mbr = (legacy_mbr *)mbr_sector; gpt_invalid = gpt_disk_get_partition_info(fd, num, start, size, signature, @@ -479,7 +500,8 @@ disk_get_partition_info (int fd, } } error_free_mbr: - free(mbr_unaligned); + free(mbr_sector); + error: return rc; } --- a/src/lib/gpt.c +++ b/src/lib/gpt.c @@ -218,23 +218,21 @@ read_lba(int fd, uint64_t lba, void *buf int sector_size = get_sector_size(fd); off_t offset = lba * sector_size; ssize_t bytesread; - void *aligned; - void *unaligned; + void *iobuf; + size_t iobuf_size; + int rc; - if (bytes % sector_size) - return EINVAL; - - unaligned = malloc(bytes+sector_size-1); - aligned = (void *) - (((unsigned long)unaligned + sector_size - 1) & - ~(unsigned long)(sector_size-1)); - memset(aligned, 0, bytes); + iobuf_size = lcm(bytes, sector_size); + rc = posix_memalign(&iobuf, sector_size, iobuf_size); + if (rc) + return rc; + memset(iobuf, 0, bytes); lseek(fd, offset, SEEK_SET); - bytesread = read(fd, aligned, bytes); - memcpy(buffer, aligned, bytesread); - free(unaligned); + bytesread = read(fd, iobuf, iobuf_size); + memcpy(buffer, iobuf, bytes); + free(iobuf); /* Kludge. This is necessary to read/write the last block of an odd-sized disk, until Linux 2.5.x kernel fixes. -- To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org For additional commands, e-mail: opensuse-commit+h...@opensuse.org