From bdd129f371893945e7b4e27cea570171399870c1ff74906f253c2364a2f50c91 Mon Sep 17 00:00:00 2001 From: OBS User unknown Date: Mon, 9 Feb 2009 16:50:41 +0000 Subject: [PATCH] OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/elilo?expand=0&rev=12 --- elilo-MAC.diff | 5 +- elilo-cleanup.diff | 118 ++++++++++++++++++++++++++++++++ elilo-fix-amd64-netboot.diff | 44 ++++++++++++ elilo-strncpy-overflow-fix.diff | 48 +++++++++++++ elilo-text-mode.diff | 89 ++++++++++++++++++++++++ elilo.changes | 9 +++ elilo.spec | 18 ++++- 7 files changed, 327 insertions(+), 4 deletions(-) create mode 100644 elilo-cleanup.diff create mode 100644 elilo-fix-amd64-netboot.diff create mode 100644 elilo-strncpy-overflow-fix.diff create mode 100644 elilo-text-mode.diff diff --git a/elilo-MAC.diff b/elilo-MAC.diff index fb581bd..aacbdc0 100644 --- a/elilo-MAC.diff +++ b/elilo-MAC.diff @@ -1,13 +1,14 @@ diff -purN elilo-3.5-pre2/glue_netfs.c elilo-3.5-MAC/glue_netfs.c --- elilo-3.5-pre2/glue_netfs.c 2004-02-20 23:30:37.000000000 +0100 +++ elilo-3.5-MAC/glue_netfs.c 2005-12-07 15:19:45.655191368 +0100 -@@ -61,6 +61,18 @@ static CHAR16 netfs_default_path[FILENAM +@@ -61,6 +61,19 @@ static CHAR16 netfs_default_path[FILENAM static CHAR16 *hexa=L"0123456789ABCDEF"; static VOID +convert_mac2hex(UINT8 *hw_addr,INTN l, CHAR16 *str) +{ + UINTN i; ++ + for (i=0 ; i < l; i++) { + str[3*i] = hexa[(hw_addr[i] & 0xf0)>>4]; + str[3*i+1] = hexa[hw_addr[i] & 0x0f]; @@ -20,7 +21,7 @@ diff -purN elilo-3.5-pre2/glue_netfs.c elilo-3.5-MAC/glue_netfs.c convert_ip2hex(UINT8 *ip, INTN l, CHAR16 *str) { UINTN i; -@@ -197,6 +209,12 @@ netfs_setdefaults(VOID *intf, config_fil +@@ -197,6 +210,12 @@ netfs_setdefaults(VOID *intf, config_fil StrnCpy(config[6].fname, str, maxlen-1); StrnCpy(config[6].fname+2, CONFIG_EXTENSION, 6); diff --git a/elilo-cleanup.diff b/elilo-cleanup.diff new file mode 100644 index 0000000..b1f9466 --- /dev/null +++ b/elilo-cleanup.diff @@ -0,0 +1,118 @@ +--- elilo/alloc.c ++++ elilo/alloc.c +@@ -110,7 +110,7 @@ + } + alloc_add(tmp, size, ALLOC_POOL); + +- DBG_PRT((L"alloc: allocated %d bytes @[0x%lx-0x%lx]\n", size, tmp, tmp+size)); ++ DBG_PRT((L"alloc: allocated %d bytes @[0x%lx-0x%lx]", size, tmp, tmp+size)); + + return tmp; + } +@@ -140,7 +140,7 @@ + + alloc_add(addr, pgcnt, ALLOC_PAGES); + +- DBG_PRT((L"allocator: allocated %d pages @0x%lx\n", pgcnt, tmp)); ++ DBG_PRT((L"allocator: allocated %d pages @0x%lx", pgcnt, tmp)); + + return addr; + } +@@ -161,7 +161,7 @@ + VERB_PRT(1, Print(L"allocator: invalid free @ 0x%lx\n", addr)); + return; + found: +- DBG_PRT((L"free: %s @0x%lx size=%ld\n", ++ DBG_PRT((L"free: %s @0x%lx size=%ld", + p->type == ALLOC_POOL ? L"Pool": L"Page", + addr, p->size)); + +@@ -195,7 +195,7 @@ + + while(used_allocs) { + +- DBG_PRT((L"free_all %a @ 0x%lx\n", used_allocs->type == ALLOC_POOL ? "pool" : "pages", used_allocs->addr)); ++ DBG_PRT((L"free_all %a @ 0x%lx", used_allocs->type == ALLOC_POOL ? "pool" : "pages", used_allocs->addr)); + + if (used_allocs->type == ALLOC_POOL) + uefi_call_wrapper(BS->FreePool, 1, used_allocs->addr); +@@ -239,13 +239,13 @@ + VOID + free_kmem(VOID) + { +- DBG_PRT((L"free_kmem before (%lx, %ld)\n", kmem_addr, kmem_pgcnt)); ++ DBG_PRT((L"free_kmem before (%lx, %ld)", kmem_addr, kmem_pgcnt)); + if (kmem_addr && kmem_pgcnt != 0) { + free(kmem_addr); + kmem_addr = NULL; + kmem_pgcnt = 0; + } +- DBG_PRT((L"free_kmem after (%lx, %ld)\n", kmem_addr, kmem_pgcnt)); ++ DBG_PRT((L"free_kmem after (%lx, %ld)", kmem_addr, kmem_pgcnt)); + } + + VOID +--- elilo/fileops.c ++++ elilo/fileops.c +@@ -497,7 +497,7 @@ + + str2 = str == NULL ? L"Unknown" : str; + +- DBG_PRT((L"%s : %-8s : %s\n", dev_tab[idx].name, ++ DBG_PRT((L"%s : %-8s : %s", dev_tab[idx].name, + (dev_tab[idx].fops ? dev_tab[idx].fops->name: L"N/A"), str2)); + + if (str) FreePool(str); +--- elilo/glue_netfs.c ++++ elilo/glue_netfs.c +@@ -167,6 +167,8 @@ + set_var(VAR_NETFS_DOMAINAME, info.domainame); + + if (info.using_pxe) { ++ DBG_PRT((L"netfs_setdefaults: using_pxe")); ++ + status = netfs->netfs_query_layer(netfs, 0, NETFS_CONFIG_LAYER, maxlen, config[0].fname); + if (EFI_ERROR(status)) { + StrnCpy(config[0].fname, NETFS_DEFAULT_CONFIG, maxlen-1); +@@ -184,7 +186,7 @@ + # if defined(CONFIG_ia64) + # define CONFIG_ARCH_EXTENSION L"-ia64.conf\0" + # elif defined (CONFIG_ia32) +-# define CONFIG_ARCH_EXTENSION L"-ia64.conf\0" ++# define CONFIG_ARCH_EXTENSION L"-ia32.conf\0" + # elif defined (CONFIG_x86_64) + # define CONFIG_ARCH_EXTENSION L"-x86_64.conf\0" + # else +@@ -193,6 +195,7 @@ + + # define CONFIG_EXTENSION L".conf\0" + ++ DBG_PRT((L"netfs_setdefaults: not using_pxe, machine specific")); + len = StrLen(CONFIG_ARCH_EXTENSION) + 1; + /* + * will try machine/subnet specific files first. +--- elilo/x86_64/bzimage.c ++++ elilo/x86_64/bzimage.c +@@ -193,18 +193,20 @@ + * Now read the rest of the kernel image into memory. + */ + +- DBG_PRT((L"reading kernel image...\n")); ++ Print(L"Loading kernel %s... ", kname); + + size = kernel_size; + efi_status = fops_read(fd, kernel_load_address, &size); + if (EFI_ERROR(efi_status) || size < 0x10000) { +- ERR_PRT((L"Error reading kernel image %s.", kname)); ++ ERR_PRT((L"Error reading kernel image (0x%x).", efi_status)); + free(param_start); + param_start = NULL; + param_size = 0; + fops_close(fd); + free_kmem(); + return -1; ++ } else { ++ Print(L" done\n"); + } + + DBG_PRT((L"kernel image read: %d bytes, %d Kbytes\n", size, size / 1024)); diff --git a/elilo-fix-amd64-netboot.diff b/elilo-fix-amd64-netboot.diff new file mode 100644 index 0000000..bde6133 --- /dev/null +++ b/elilo-fix-amd64-netboot.diff @@ -0,0 +1,44 @@ +diff -ur elilo.a/glue_netfs.c elilo.b/glue_netfs.c +--- elilo.a/glue_netfs.c 2009-02-05 15:22:00.000000000 +0100 ++++ elilo.b/glue_netfs.c 2009-02-05 20:53:11.000000000 +0100 +@@ -143,6 +143,7 @@ + UINTN m; + CHAR16 ip_var[64], str[64]; + UINT8 *ip; ++ INTN len; + + if (config == NULL || kname == NULL || maxlen < 1) return EFI_INVALID_PARAMETER; + +@@ -191,6 +192,8 @@ + # endif + + # define CONFIG_EXTENSION L".conf\0" ++ ++ len = StrLen(CONFIG_ARCH_EXTENSION) + 1; + /* + * will try machine/subnet specific files first. + * the filenames are constructed based on the IP(v4) address +@@ -200,19 +203,19 @@ + StrnCpy(config[0].fname+8, CONFIG_EXTENSION, 6); + + StrnCpy(config[1].fname, str, maxlen-1); +- StrnCpy(config[1].fname+6, CONFIG_ARCH_EXTENSION, 11); ++ StrnCpy(config[1].fname+6, CONFIG_ARCH_EXTENSION, len); + + StrnCpy(config[2].fname, str, maxlen-1); + StrnCpy(config[2].fname+6, CONFIG_EXTENSION, 6); + + StrnCpy(config[3].fname, str, maxlen-1); +- StrnCpy(config[3].fname+4, CONFIG_ARCH_EXTENSION, 11); ++ StrnCpy(config[3].fname+4, CONFIG_ARCH_EXTENSION, len); + + StrnCpy(config[4].fname, str, maxlen-1); + StrnCpy(config[4].fname+4, CONFIG_EXTENSION, 6); +- ++ + StrnCpy(config[5].fname, str, maxlen-1); +- StrnCpy(config[5].fname+2, CONFIG_ARCH_EXTENSION, 11); ++ StrnCpy(config[5].fname+2, CONFIG_ARCH_EXTENSION, len); + + StrnCpy(config[6].fname, str, maxlen-1); + StrnCpy(config[6].fname+2, CONFIG_EXTENSION, 6); diff --git a/elilo-strncpy-overflow-fix.diff b/elilo-strncpy-overflow-fix.diff new file mode 100644 index 0000000..7a36efb --- /dev/null +++ b/elilo-strncpy-overflow-fix.diff @@ -0,0 +1,48 @@ +From: Jarrod Johnson + +Fix StrnCpy bug that would overflow dst buffer if length of src met or exceeded passed size value. +diff -urN elilo/strops.c elilo-strncpy-overflow-fix/strops.c +--- elilo/strops.c 2003-08-19 12:47:41.000000000 -0400 ++++ elilo-strncpy-overflow-fix/strops.c 2009-02-07 11:17:10.000000000 -0500 +@@ -41,11 +41,11 @@ + { + CHAR16 *res = dst; + +- while (size-- && (*dst++ = *src++) != CHAR_NULL); ++ while (size && size-- && (*dst++ = *src++) != CHAR_NULL); + /* + * does the null padding + */ +- while (size-- > 0) *dst++ = CHAR_NULL; ++ while (size && size-- > 0) *dst++ = CHAR_NULL; + + return res; + } +@@ -55,11 +55,11 @@ + { + CHAR8 *res = dst; + +- while (size-- && (*dst++ = (CHAR8)*src++) != '\0'); ++ while (size && size-- && (*dst++ = (CHAR8)*src++) != '\0'); + /* + * does the null padding + */ +- while (size-- > 0) *dst++ = '\0'; ++ while (size && size-- > 0) *dst++ = '\0'; + + return res; + } +@@ -76,11 +76,11 @@ + { + CHAR8 *res = dst; + +- while (size-- && (*dst++ = *src++) != '\0'); ++ while (size && size-- && (*dst++ = *src++) != '\0'); + /* + * does the null padding + */ +- while (size-- > 0) *dst++ = '\0'; ++ while (size && size-- > 0) *dst++ = '\0'; + + return res; + } diff --git a/elilo-text-mode.diff b/elilo-text-mode.diff new file mode 100644 index 0000000..26b6f3f --- /dev/null +++ b/elilo-text-mode.diff @@ -0,0 +1,89 @@ +--- elilo/x86_64/config.c ++++ elilo/x86_64/config.c +@@ -33,15 +33,23 @@ + + typedef struct { + UINTN legacy_free_boot; ++ UINTN text_mode; + } x86_64_global_config_t; + + ++#define x86_64_opt_offsetof(option) (&((sys_img_options_t *)(0x0))->option) ++ + static x86_64_global_config_t x86_64_gconf; + + static config_option_t sysdeps_global_options[]={ + {OPT_BOOL, OPT_GLOBAL, L"legacy-free", NULL, NULL, &x86_64_gconf.legacy_free_boot} + }; + ++static config_option_t sysdeps_image_options[]={ ++ {OPT_BOOL, OPT_IMAGE_SYS, L"text-mode", NULL, NULL, x86_64_opt_offsetof(text_mode)} ++}; ++ ++ + /* + * X86_64 operations that need to be done only once and just before + * entering the main loop of the loader +@@ -81,6 +89,14 @@ + return x86_64_gconf.legacy_free_boot ? 1 : 0; + } + ++ ++INTN ++x86_64_text_mode(VOID) ++{ ++ return (elilo_opt.sys_img_opts && ++ elilo_opt.sys_img_opts->text_mode == TRUE) ? 1 : 0; ++} ++ + INTN + sysdeps_register_options(VOID) + { +@@ -89,14 +105,11 @@ + ret = register_config_options(sysdeps_global_options, + sizeof(sysdeps_global_options)/sizeof(config_option_t), + OPTIONS_GROUP_GLOBAL); +-#if 0 +- /* no per image options yet */ + if (ret == -1 ) return ret; + + ret = register_config_options(sysdeps_image_options, + sizeof(sysdeps_image_options)/sizeof(config_option_t), + OPTIONS_GROUP_IMAGE); +-#endif + + return ret; + } +--- elilo/x86_64/sysdeps.h ++++ elilo/x86_64/sysdeps.h +@@ -369,6 +369,7 @@ + extern UINTN rmswitch_size; + + extern INTN x86_64_use_legacy_free_boot(); ++extern INTN x86_64_text_mode(); + + /* + * How to jump to kernel code +@@ -471,7 +472,8 @@ + } + + typedef struct sys_img_options { +- UINT8 nothing_yet; ++ UINT8 dummy; /* forces non-zero offset for first field */ ++ UINT8 text_mode; /* do not try to initialize Graphics Output Protocol */ + } sys_img_options_t; + + #endif /* __ELILO_SYSDEPS_X86_64_H__ */ +--- elilo/x86_64/system.c ++++ elilo/x86_64/system.c +@@ -198,6 +198,10 @@ + UINTN size1; + UINT8 i; + ++ if (x86_64_text_mode() == 1) { ++ Print((L"Skip GOP init, force text-mode.\n")); ++ return -1; ++ } + efi_status = uefi_call_wrapper( + BS->LocateHandle, + 5, diff --git a/elilo.changes b/elilo.changes index 37dc574..e2c5570 100644 --- a/elilo.changes +++ b/elilo.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Mon Feb 9 15:36:39 CET 2009 - rw@suse.de + +- elilo.efi + * Allow booting x86_64 from network. (bnc#473914) + * Introduce new per-image option 'text-mode' for x86_64, which can + be used to sidestep "dubious" GOP implementations. (bnc#466570) + * Minor cleanup. + ------------------------------------------------------------------- Tue Dec 9 16:34:53 CET 2008 - rw@suse.de diff --git a/elilo.spec b/elilo.spec index 29158c4..9f32450 100644 --- a/elilo.spec +++ b/elilo.spec @@ -1,7 +1,7 @@ # # spec file for package elilo (Version 3.8) # -# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2009 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 @@ -21,7 +21,7 @@ Name: elilo Summary: EFI Linux Loader Version: 3.8 -Release: 25 +Release: 27 ExclusiveArch: ia64 %ix86 x86_64 Group: System/Boot AutoReqProv: on @@ -40,7 +40,11 @@ Patch3: elilo-longer-commandline.diff Patch4: elilo-fix-possible-overflow.diff Patch5: elilo-avoid-tab.diff Patch6: elilo-bzimage-alloc.diff +Patch7: elilo-text-mode.diff +Patch8: elilo-fix-amd64-netboot.diff Patch9: eliloalt-sysfs.diff +Patch10: elilo-strncpy-overflow-fix.diff +Patch11: elilo-cleanup.diff BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: gnu-efi >= 3.0e @@ -65,7 +69,11 @@ Authors: %patch4 -p1 %patch5 -p1 %patch6 -p1 +%patch7 -p1 +%patch8 -p1 %patch9 -p1 +%patch10 -p1 +%patch11 -p1 perl -pe 's{\@EDITION\@}{%{version}-%{release}}; s{\@LIBEXECDIR\@}{%{_libexecdir}}; s{\@ARCH\@}{%{_target_cpu}}; @@ -106,6 +114,12 @@ echo "Please run /sbin/elilo!" /usr/share/man/man8/* %changelog +* Mon Feb 09 2009 rw@suse.de +- elilo.efi + * Allow booting x86_64 from network. (bnc#473914) + * Introduce new per-image option 'text-mode' for x86_64, which can + be used to sidestep "dubious" GOP implementations. (bnc#466570) + * Minor cleanup. * Tue Dec 09 2008 rw@suse.de - elilo.efi * Second attempt to work around firmware problem. (bnc#437486)