diff --git a/0001-device-manager-only-call-ply_terminal_free.patch b/0001-device-manager-only-call-ply_terminal_free.patch new file mode 100644 index 0000000..2b46fc5 --- /dev/null +++ b/0001-device-manager-only-call-ply_terminal_free.patch @@ -0,0 +1,26 @@ +From 54951cef0e5ea3caeae1eb0ec33db7ed37d0d4b3 Mon Sep 17 00:00:00 2001 +From: Frederic Crozat +Date: Thu, 12 Jun 2014 13:50:51 +0200 +Subject: [PATCH] device-manager: only call ply_terminal_free + +ply_terminal_free will call ply_terminal_close anyway and is guarded +against NULL terminal (ply_terminal_close is not). +--- + src/libply-splash-core/ply-device-manager.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c +index dbc203d..aa4d15c 100644 +--- a/src/libply-splash-core/ply-device-manager.c ++++ b/src/libply-splash-core/ply-device-manager.c +@@ -442,7 +442,6 @@ free_terminal (char *device, + { + ply_hashtable_remove (manager->terminals, device); + +- ply_terminal_close (terminal); + ply_terminal_free (terminal); + } + +-- +1.8.4.5 + diff --git a/0001-seats-guard-against-NULL-terminal.patch b/0001-seats-guard-against-NULL-terminal.patch new file mode 100644 index 0000000..5e5ea50 --- /dev/null +++ b/0001-seats-guard-against-NULL-terminal.patch @@ -0,0 +1,94 @@ +From a6eff09852c2eb4d684526b814d2b2df578938d0 Mon Sep 17 00:00:00 2001 +From: Frederic Crozat +Date: Thu, 12 Jun 2014 18:51:24 +0200 +Subject: [PATCH] seats: guard against NULL terminal + +--- + src/libply-splash-core/ply-keyboard.c | 7 +++++-- + src/libply-splash-core/ply-seat.c | 6 +++--- + src/libply-splash-core/ply-terminal.c | 11 +++++++---- + 3 files changed, 15 insertions(+), 9 deletions(-) + +diff --git a/src/libply-splash-core/ply-keyboard.c b/src/libply-splash-core/ply-keyboard.c +index 624f906..1bed19f 100644 +--- a/src/libply-splash-core/ply-keyboard.c ++++ b/src/libply-splash-core/ply-keyboard.c +@@ -423,8 +423,11 @@ ply_keyboard_free (ply_keyboard_t *keyboard) + } + else + { +- ply_buffer_free (keyboard->provider.if_terminal->key_buffer); +- free (keyboard->provider.if_terminal); ++ if (keyboard->provider.if_terminal) ++ { ++ ply_buffer_free (keyboard->provider.if_terminal->key_buffer); ++ free (keyboard->provider.if_terminal); ++ } + } + + free (keyboard); +diff --git a/src/libply-splash-core/ply-seat.c b/src/libply-splash-core/ply-seat.c +index 2ac8bf7..29e2dfa 100644 +--- a/src/libply-splash-core/ply-seat.c ++++ b/src/libply-splash-core/ply-seat.c +@@ -102,12 +102,12 @@ add_text_displays (ply_seat_t *seat) + { + ply_text_display_t *display; + +- if (!ply_terminal_is_open (seat->terminal)) ++ if (!seat->terminal || !ply_terminal_is_open (seat->terminal)) + { +- if (!ply_terminal_open (seat->terminal)) ++ if (!seat->terminal || !ply_terminal_open (seat->terminal)) + { + ply_trace ("could not add terminal %s: %m", +- ply_terminal_get_name (seat->terminal)); ++ seat->terminal ? ply_terminal_get_name (seat->terminal) : "none" ); + return; + } + } +diff --git a/src/libply-splash-core/ply-terminal.c b/src/libply-splash-core/ply-terminal.c +index 992dd3f..b52b108 100644 +--- a/src/libply-splash-core/ply-terminal.c ++++ b/src/libply-splash-core/ply-terminal.c +@@ -654,30 +654,33 @@ ply_terminal_open (ply_terminal_t *terminal) + int + ply_terminal_get_fd (ply_terminal_t *terminal) + { +- return terminal->fd; ++ return terminal ? terminal->fd : -1; + } + + bool + ply_terminal_is_vt (ply_terminal_t *terminal) + { +- return terminal->vt_number > 0; ++ return terminal ? terminal->vt_number > 0 : false; + } + + bool + ply_terminal_is_open (ply_terminal_t *terminal) + { +- return terminal->is_open; ++ return terminal ? terminal->is_open : false; + } + + bool + ply_terminal_is_active (ply_terminal_t *terminal) + { +- return terminal->is_active; ++ return terminal ? terminal->is_active : false; + } + + void + ply_terminal_close (ply_terminal_t *terminal) + { ++ if (!terminal) ++ return; ++ + if (!terminal->is_open) + { + ply_trace ("terminal %s is already closed", terminal->name); +-- +1.8.4.5 + diff --git a/0001-splash-remove-pixel_pixel-in-sprite-lib-when-notifie.patch b/0001-splash-remove-pixel_pixel-in-sprite-lib-when-notifie.patch new file mode 100644 index 0000000..ccc4063 --- /dev/null +++ b/0001-splash-remove-pixel_pixel-in-sprite-lib-when-notifie.patch @@ -0,0 +1,101 @@ +From 61525fba34c724b6e319f6b3b8198c0c0f8aa677 Mon Sep 17 00:00:00 2001 +From: Frederic Crozat +Date: Thu, 19 Jun 2014 16:18:12 +0200 +Subject: [PATCH] splash: remove pixel_pixel in sprite-lib when notified they + are gone + +--- + src/plugins/splash/script/plugin.c | 1 + + src/plugins/splash/script/script-lib-sprite.c | 28 +++++++++++++++++++++++---- + src/plugins/splash/script/script-lib-sprite.h | 1 + + 3 files changed, 26 insertions(+), 4 deletions(-) + +diff --git a/src/plugins/splash/script/plugin.c b/src/plugins/splash/script/plugin.c +index c5c1e16..8e37b37 100644 +--- a/src/plugins/splash/script/plugin.c ++++ b/src/plugins/splash/script/plugin.c +@@ -401,6 +401,7 @@ static void + remove_pixel_display (ply_boot_splash_plugin_t *plugin, + ply_pixel_display_t *display) + { ++ script_lib_sprite_pixel_display_removed (plugin->script_sprite_lib, display); + ply_list_remove_data(plugin->displays, display); + } + +diff --git a/src/plugins/splash/script/script-lib-sprite.c b/src/plugins/splash/script/script-lib-sprite.c +index e0ced7e..166c7e7 100644 +--- a/src/plugins/splash/script/script-lib-sprite.c ++++ b/src/plugins/splash/script/script-lib-sprite.c +@@ -77,7 +77,7 @@ static script_return_t sprite_get_image (script_state_t *state, + { + script_lib_sprite_data_t *data = user_data; + sprite_t *sprite = script_obj_as_native_of_class (state->this, data->class); +- ++ + if (sprite && sprite->image_obj) + { + script_obj_ref (sprite->image_obj); +@@ -481,7 +481,7 @@ static void script_lib_sprite_draw_area (script_lib_display_t *display, + } + } + +-static void ++static void + draw_area (script_lib_sprite_data_t *data, + int x, + int y, +@@ -533,10 +533,10 @@ script_lib_sprite_data_t *script_lib_sprite_setup (script_state_t *state, + ply_pixel_display_t *pixel_display = ply_list_node_get_data (node); + script_lib_display_t *script_display = malloc (sizeof(script_lib_display_t)); + script_display->pixel_display = pixel_display; +- ++ + script_display->x = (max_width - ply_pixel_display_get_width (pixel_display)) / 2; + script_display->y = (max_height - ply_pixel_display_get_height (pixel_display)) / 2; +- ++ + script_display->data = data; + ply_pixel_display_set_draw_handler (pixel_display, + (ply_pixel_display_draw_handler_t) +@@ -698,6 +698,26 @@ region_add_area (ply_region_t *region, + ply_region_add_rectangle (region, &rectangle); + } + ++void script_lib_sprite_pixel_display_removed (script_lib_sprite_data_t *data, ply_pixel_display_t *pixel_display) ++{ ++ ply_list_node_t *node; ++ ply_list_node_t *next_node; ++ script_lib_display_t* display; ++ ++ node = ply_list_get_first_node (data->displays); ++ while (node) ++ { ++ next_node = ply_list_get_next_node (data->displays, node); ++ display = ply_list_node_get_data (node); ++ ++ if (display->pixel_display == pixel_display) ++ { ++ ply_list_remove_node (data->displays, node); ++ } ++ node = next_node; ++ } ++} ++ + void + script_lib_sprite_refresh (script_lib_sprite_data_t *data) + { +diff --git a/src/plugins/splash/script/script-lib-sprite.h b/src/plugins/splash/script/script-lib-sprite.h +index 0cb0681..2404b85 100644 +--- a/src/plugins/splash/script/script-lib-sprite.h ++++ b/src/plugins/splash/script/script-lib-sprite.h +@@ -65,6 +65,7 @@ typedef struct + + script_lib_sprite_data_t *script_lib_sprite_setup (script_state_t *state, + ply_list_t *displays); ++void script_lib_sprite_pixel_display_removed (script_lib_sprite_data_t *data, ply_pixel_display_t *pixel_display); + void script_lib_sprite_refresh (script_lib_sprite_data_t *data); + void script_lib_sprite_destroy (script_lib_sprite_data_t *data); + +-- +1.8.4.5 + diff --git a/plymouth.changes b/plymouth.changes index 5b3be55..8342df6 100644 --- a/plymouth.changes +++ b/plymouth.changes @@ -1,3 +1,17 @@ +------------------------------------------------------------------- +Thu Jun 19 14:22:44 UTC 2014 - fcrozat@suse.com + +- Add + 0001-splash-remove-pixel_pixel-in-sprite-lib-when-notifie.patch: + fix crash when pixel_display is removed. +- Add 0001-device-manager-only-call-ply_terminal_free.patch: fix + crash. +- Add use-mkinitrd.patch: call mkinitrd -B, not dracut for now, + otherwise initramfs is being created by plymouth-update-initrd, + not initrd file. +- Ensure we don't rebuild initrd twice when updating plymouth. +- Ensure default theme is SLE/openSUSE (based on %suse_version) + ------------------------------------------------------------------- Fri Jun 6 16:16:38 UTC 2014 - fcrozat@suse.com diff --git a/plymouth.spec b/plymouth.spec index 1555cf5..9d541b4 100644 --- a/plymouth.spec +++ b/plymouth.spec @@ -42,6 +42,14 @@ Patch16: plymouth-correct-runtime-dir.patch # PATCH-FIX-UPSTREAM plymouth-manpages.patch idoenmez@suse.de -- Fix man page installation Patch17: plymouth-manpages.patch Patch18: fix-serial-consoles.patch +# PATCH-FIX-UPSTREAM 0001-device-manager-only-call-ply_terminal_free.patch fcrozat@suse.com -- Fix crash +Patch19: 0001-device-manager-only-call-ply_terminal_free.patch +# PATCH-FIX-OPENSUSE use-mkinitrd.patch fcrozat@suse.com -- call mkinitrd -B for now +Patch20: use-mkinitrd.patch +# PATCH-FIX-UPSTREAM 0001-seats-guard-against-NULL-terminal.patch fcrozat@suse.com -- guard against null terminal +Patch21: 0001-seats-guard-against-NULL-terminal.patch +# PATCH-FIX-UPSTREAM 0001-splash-remove-pixel_pixel-in-sprite-lib-when-notifie.patch fcrozat@suse.com -- prevent crash if pixel display is removed +Patch22: 0001-splash-remove-pixel_pixel-in-sprite-lib-when-notifie.patch BuildRequires: automake BuildRequires: docbook-xsl-stylesheets BuildRequires: kernel-headers @@ -328,12 +336,21 @@ plugin. %patch16 -p1 %patch17 -p1 %patch18 -p1 +%patch19 -p1 +%patch20 -p1 +%patch21 -p1 +%patch22 -p1 # replace builddate with patch0date sed -i "s/__DATE__/\"$(stat -c %y %{_sourcedir}/%{name}.changes)\"/" src/main.c # Change the default theme -sed -i -e 's/fade-in/openSUSE/g' src/plymouthd.defaults + +%if %{suse_version} == 1315 +sed -i -e 's/spinner/SLE/g' src/plymouthd.defaults +%else +sed -i -e 's/spinner/openSUSE/g' src/plymouthd.defaults +%endif %build autoreconf -fiv @@ -384,7 +401,6 @@ cp %{buildroot}/%{_datadir}/plymouth/plymouthd.defaults %{buildroot}/%{_sysconfd %{?regenerate_initrd_post} if [ ! -e /.buildenv ]; then [ -f %{_localstatedir}/lib/plymouth/boot-duration ] || cp -f %{_datadir}/plymouth/default-boot-duration %{_localstatedir}/lib/plymouth/boot-duration - %{_libexecdir}/plymouth/plymouth-update-initrd fi [ -x /bin/systemctl ] && /bin/systemctl daemon-reload >/dev/null 2>&1 || : diff --git a/use-mkinitrd.patch b/use-mkinitrd.patch new file mode 100644 index 0000000..ccb74ba --- /dev/null +++ b/use-mkinitrd.patch @@ -0,0 +1,8 @@ +Index: plymouth-0.9.0/scripts/plymouth-update-initrd +=================================================================== +--- plymouth-0.9.0.orig/scripts/plymouth-update-initrd ++++ plymouth-0.9.0/scripts/plymouth-update-initrd +@@ -1,2 +1,2 @@ + #!/bin/bash +-dracut -f ++mkinitrd -B