Package: syslinux-common
Version: 2:4.04+dfsg-9
Severity: minor
Tags: patch fixed-upstream

Hi

"gfxboot-themes" packages assembled by gfxboot-dev 4.4.3, fail to work
under syslinux (isolinux) 2:4.04+dfsg-9 using gfxboot.c32. While the
system still boots eventually (black screen, no interaction possible) 
neither background images, nor menus are displayed and most routines 
of the gfxboot theme aren't executed.

The issue has been introduced by (upstream) gfxboot 4.4.0 in commit
"rewrite chdir to work without bootloader chdir support"[1] and 
therefore affects Debian's gfxboot-dev 4.4.3-1 and all binary packages
of gfxboot-themes 4.4.3-2.5-1, which have been assembled using 
gfxboot-dev 4.4.3-1:
- gfxboot-themes-kde
- gfxboot-themes-opensuse
- gfxboot-themes-sled
- gfxboot-themes-sles
- gfxboot-themes-upstream

Workarounds for this bug are:
- using an older gfxboot-dev to build the theme, e.g. squeeze's 4.2.2-1
  or the intermediate 4.3.5-2 that went to experimental.
- placing all theme files into the root of the ISO (very ugly)
- [updating to syslinux 4.05]

I'm filing this bug against syslinux-common and not gfxboot/ 
gfxboot-themes, because an accompanying patch, which fixes this bug,
has been committed to syslinux[2] and was released as part of syslinux 
4.05. With this patch, syslinux now correctly passes the current 
working directory to the gfxboot themes. 

OpenSuSE has been carrying this patch (attached) in their syslinux 4.04
packages[3] since April 19th 2011 and I can confirm that adding it to 
syslinux 2:4.04+dfsg-9 fixes the problem for Debian as well. The 
patched syslinux package (or upstream syslinux 4.05) allows 
gfxboot-themes-opensuse 4.4.3-2.5-1, as currently present in the 
archive, to get executed correctly using isolinux/ gfxboot.c32.

Given that you're also maintaining gfxboot and gfxboot-themes, I'm not
filing separate bugs against gfxboot or gfxboot-themes, as this issue
can be fixed by patching or upgrading syslinux and without having to 
touch either of gfxboot or gfxboot-themes. It might make sense to add 
versioned Breaks against syslinux-common <<2:4.04+dfsg-10~, or 
<<2:4.05+dfsg respectively, to future gfxboot-themes versions in order
to avoid using incompatible versions of gfxboot-themes (which 
indirectly enforce a minimum gfxboot-dev version) and syslinux-common.

Thank you a lot for your efforts regarding syslinux and the gfxboot 
packages.

Regards
        Stefan Lippers-Hollmann

[1]     git://gitorious.org/gfxboot/gfxboot.git
        http://gitorious.org/gfxboot
        ffce373dad0a387aabcbe8beabe901040da1be5c
        rewrite chdir to work without bootloader chdir support
        this behaviour is still present in current upstream git and the 
        released gfxboot 4.4.7 and apears to be intended by upstream
[2]     http://git.kernel.org/?p=boot/syslinux/syslinux.git
        
http://git.kernel.org/?p=boot/syslinux/syslinux.git;a=commitdiff;h=a5d27926e87205e1696e94d9a4200894e1d59c03
[3]     
http://download.opensuse.org/factory/repo/src-oss/suse/src/syslinux-4.04-14.1.src.rpm

-- System Information:
Debian Release: wheezy/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2-rc6-aptosid-amd64 (SMP w/4 CPU cores; PREEMPT)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

syslinux-common depends on no packages.

Versions of packages syslinux-common recommends:
ii  libcrypt-passwdmd5-perl    <none>
ii  perl [libdigest-sha-perl]  5.14.2-6

syslinux-common suggests no packages.

-- no debconf information
--- a/com32/gfxboot/gfxboot.c
+++ b/com32/gfxboot/gfxboot.c
@@ -102,6 +102,8 @@ typedef struct __attribute__ ((packed))
   				//    0: GFX_CB_MENU_INIT accepts 32 bit addresses
   				//    1: knows about xmem_start, xmem_end
   uint16_t reserved_1;		// 62:
+  uint32_t gfxboot_cwd;		// 64: if set, points to current gfxboot working directory relative
+				//     to syslinux working directory
 } gfx_config_t;
 
 
@@ -181,6 +183,7 @@ int main(int argc, char **argv)
 {
   int menu_index;
   const union syslinux_derivative_info *sdi;
+  char working_dir[256];
 
   openconsole(&dev_stdcon_r, &dev_stdcon_w);
 
@@ -224,6 +227,10 @@ int main(int argc, char **argv)
     return 0;
   }
 
+  if(getcwd(working_dir, sizeof working_dir)) {
+    gfx_config.gfxboot_cwd = (uint32_t) working_dir;
+  }
+
   if(gfx_init(argv[1])) {
     printf("Error setting up gfxboot\n");
     if(argc > 2) show_message(argv[2]);
@@ -806,6 +813,12 @@ void boot(int index)
   int i, label_len, menu_label_len;
   unsigned ipapp;
   const struct syslinux_ipappend_strings *ipappend;
+  char *gfxboot_cwd = (char *) gfx_config.gfxboot_cwd;
+
+  if(gfxboot_cwd) {
+    chdir(gfxboot_cwd);
+    gfx_config.gfxboot_cwd = 0;
+  }
 
   for(menu_ptr = menu; menu_ptr; menu_ptr = menu_ptr->next, index--) {
     if(!index) break;

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to