Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libpulp for openSUSE:Factory checked in at 2025-06-18 19:42:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libpulp (Old) and /work/SRC/openSUSE:Factory/.libpulp.new.19631 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libpulp" Wed Jun 18 19:42:05 2025 rev:11 rq:1286733 version:0.3.15 Changes: -------- --- /work/SRC/openSUSE:Factory/libpulp/libpulp.changes 2025-04-30 19:03:49.772943435 +0200 +++ /work/SRC/openSUSE:Factory/.libpulp.new.19631/libpulp.changes 2025-06-18 19:42:06.591784620 +0200 @@ -1,0 +2,8 @@ +Wed Jun 18 13:57:40 UTC 2025 - Giuliano Belinassi <giuliano.belina...@suse.com> + +- Update package with libpulp-0.3.15: + - Fix race condition on ppc64le livepatching (bsc#1244263) + - Fix SIGABRT when non-valid JSON is given at input (bsc#1243923) + - Fix linking against libpthread on older versions of glibc for ppc64le. + +------------------------------------------------------------------- Old: ---- libpulp-0.3.14.tar.gz New: ---- libpulp-0.3.15.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libpulp.spec ++++++ --- /var/tmp/diff_new_pack.i8efXC/_old 2025-06-18 19:42:07.303814210 +0200 +++ /var/tmp/diff_new_pack.i8efXC/_new 2025-06-18 19:42:07.307814376 +0200 @@ -17,7 +17,7 @@ Name: libpulp -Version: 0.3.14 +Version: 0.3.15 Release: 0 Summary: Userspace live patching library and tools License: LGPL-2.1-or-later ++++++ libpulp-0.3.14.tar.gz -> libpulp-0.3.15.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libpulp-0.3.14/configure new/libpulp-0.3.15/configure --- old/libpulp-0.3.14/configure 2025-04-30 17:33:53.000000000 +0200 +++ new/libpulp-0.3.15/configure 2025-06-18 15:49:29.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for libpulp 0.3.14. +# Generated by GNU Autoconf 2.72 for libpulp 0.3.15. # # Report bugs to <nore...@suse.com>. # @@ -614,8 +614,8 @@ # Identity of this package. PACKAGE_NAME='libpulp' PACKAGE_TARNAME='libpulp' -PACKAGE_VERSION='0.3.14' -PACKAGE_STRING='libpulp 0.3.14' +PACKAGE_VERSION='0.3.15' +PACKAGE_STRING='libpulp 0.3.15' PACKAGE_BUGREPORT='nore...@suse.com' PACKAGE_URL='' @@ -1421,7 +1421,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures libpulp 0.3.14 to adapt to many kinds of systems. +'configure' configures libpulp 0.3.15 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1493,7 +1493,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libpulp 0.3.14:";; + short | recursive ) echo "Configuration of libpulp 0.3.15:";; esac cat <<\_ACEOF @@ -1629,7 +1629,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libpulp configure 0.3.14 +libpulp configure 0.3.15 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -1980,7 +1980,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libpulp $as_me 0.3.14, which was +It was created by libpulp $as_me 0.3.15, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -3824,7 +3824,7 @@ # Define the identity of the package. PACKAGE='libpulp' - VERSION='0.3.14' + VERSION='0.3.15' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -20428,7 +20428,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libpulp $as_me 0.3.14, which was +This file was extended by libpulp $as_me 0.3.15, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20496,7 +20496,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -libpulp config.status 0.3.14 +libpulp config.status 0.3.15 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libpulp-0.3.14/configure.ac new/libpulp-0.3.15/configure.ac --- old/libpulp-0.3.14/configure.ac 2025-04-30 17:29:00.000000000 +0200 +++ new/libpulp-0.3.15/configure.ac 2025-06-18 15:48:30.000000000 +0200 @@ -17,7 +17,7 @@ # You should have received a copy of the GNU General Public License # along with libpulp. If not, see <http://www.gnu.org/licenses/>. -AC_INIT([libpulp],[0.3.14],[nore...@suse.com]) +AC_INIT([libpulp],[0.3.15],[nore...@suse.com]) # Keep most generated files under the config directory. AC_CONFIG_AUX_DIR([config]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libpulp-0.3.14/lib/Makefile.am new/libpulp-0.3.15/lib/Makefile.am --- old/libpulp-0.3.14/lib/Makefile.am 2025-01-30 21:56:54.000000000 +0100 +++ new/libpulp-0.3.15/lib/Makefile.am 2025-06-18 15:42:28.000000000 +0200 @@ -51,7 +51,8 @@ arch/powerpc64le/patch.c libpulp_la_LDFLAGS += \ - -l:ld64.so.2 + -l:ld64.so.2 \ + -lpthread endif libpulp_la_DEPENDENCIES= libpulp.versions diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libpulp-0.3.14/lib/Makefile.in new/libpulp-0.3.15/lib/Makefile.in --- old/libpulp-0.3.14/lib/Makefile.in 2025-04-30 17:33:54.000000000 +0200 +++ new/libpulp-0.3.15/lib/Makefile.in 2025-06-18 15:49:29.000000000 +0200 @@ -125,7 +125,8 @@ @CPU_PPC64LE_TRUE@ arch/powerpc64le/patch.c @CPU_PPC64LE_TRUE@am__append_4 = \ -@CPU_PPC64LE_TRUE@ -l:ld64.so.2 +@CPU_PPC64LE_TRUE@ -l:ld64.so.2 \ +@CPU_PPC64LE_TRUE@ -lpthread subdir = lib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libpulp-0.3.14/lib/arch/powerpc64le/patch.c new/libpulp-0.3.15/lib/arch/powerpc64le/patch.c --- old/libpulp-0.3.14/lib/arch/powerpc64le/patch.c 2025-04-11 19:16:32.000000000 +0200 +++ new/libpulp-0.3.15/lib/arch/powerpc64le/patch.c 2025-06-17 01:15:51.000000000 +0200 @@ -49,6 +49,22 @@ /** Size of the above object. */ extern unsigned int ulp_prologue_size; +/** Global address of the new function address which is stored in the + prologue of the function, together with its code. Should not be + accessed directly. */ +extern unsigned long ulp_prologue_new_function_addr; + +/** Get the offset in which we store the new function address in the old + function's prologue. */ +static unsigned long +ulp_prologue_new_function_offset(void) +{ + return (unsigned char *) &ulp_prologue_new_function_addr - ulp_prologue; +} + +#define ULP_PROLOGUE_NEW_FUNCTION_OFFSET(x) + + /** The NOP instruction. */ static const unsigned char gNop[] = { 0x00, 0x00, 0x00, 0x60 }; @@ -76,22 +92,16 @@ { (void) len; + /* Assert that the prologue size don't overflow. ulp_prologue_size is a + constant. */ + libpulp_crash_assert(ulp_prologue_size <= INSN_SIZE * PRE_NOPS_LEN); + /* Create a copy of the prologue. */ unsigned char prolog[ulp_prologue_size]; memcpy(prolog, prologue, sizeof(prolog)); - unsigned char new_fentry_bytes[sizeof(void*)]; - memcpy(new_fentry_bytes, &new_fentry, sizeof(new_fentry_bytes)); - /* Patch the code with the address of the function we want to be redirected. */ - prolog[32] = new_fentry_bytes[6]; - prolog[33] = new_fentry_bytes[7]; - prolog[36] = new_fentry_bytes[4]; - prolog[37] = new_fentry_bytes[5]; - prolog[40] = new_fentry_bytes[2]; - prolog[41] = new_fentry_bytes[3]; - prolog[44] = new_fentry_bytes[0]; - prolog[45] = new_fentry_bytes[1]; + memcpy(prolog + ulp_prologue_new_function_offset(), &new_fentry, sizeof(void *)); /* Point to the prologue. */ char *fentry_prologue = old_fentry - INSN_SIZE * PRE_NOPS_LEN; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libpulp-0.3.14/lib/arch/powerpc64le/ulp_prologue.S new/libpulp-0.3.15/lib/arch/powerpc64le/ulp_prologue.S --- old/libpulp-0.3.14/lib/arch/powerpc64le/ulp_prologue.S 2025-04-04 17:17:07.000000000 +0200 +++ new/libpulp-0.3.15/lib/arch/powerpc64le/ulp_prologue.S 2025-06-17 01:15:51.000000000 +0200 @@ -46,12 +46,17 @@ trampoline_routine: .cfi_startproc - # Concatenate two registers from prologue. - rldimi %r6, %r5, 32, 0 + # The address in LR is in the caller's prologue. Move it to r6, so + # we can access the new function pointer stored in the prologue. + mflr %r6 + ld %r6, (ulp_prologue_new_function_addr - .prologue_load_pc)(%r6) # Move the target function ptr to control register so we can free r6. mtctr %r6 + # Reload LR which we saved on %r5 + mtlr %r5 + # Save all volatile registers # r5 & r6 are designated temp regs, having data already on stack. # After return from expand_ulp_stack, both regs construct values @@ -259,11 +264,12 @@ # Move to control register mtctr %r12 - # Compute absolute address of target function 0x1122334455667788 - lis %r5, 0x1122 - ori %r5, %r5, 0x3344 - lis %r6, 0x5566 - ori %r6, %r6, 0x7788 + # Save LR into R5, as getting the PC will clobber it. + mflr %r5 + + # Load PC into LR + bl .prologue_load_pc +.prologue_load_pc: # Jump to trampoline_routine bctr @@ -271,6 +277,15 @@ # Execution is returned to the caller by the trampoline_routine, not here. # so no blr is necessary here. + # Variable holding the address of the new function. Note that this prologue + # is copied to the target's function prologue, hence this must not be accessed + # directly. +.global ulp_prologue_new_function_addr +.type ulp_prologue_new_function_addr, @object +.size ulp_prologue_new_function_addr, 8 +ulp_prologue_new_function_addr: + .zero 8 + ulp_prologue_end = . .long 0 .byte 0,0,0,0,0,0,0,0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libpulp-0.3.14/tools/extract.c new/libpulp-0.3.15/tools/extract.c --- old/libpulp-0.3.14/tools/extract.c 2024-06-17 15:49:26.000000000 +0200 +++ new/libpulp-0.3.15/tools/extract.c 2025-06-17 01:15:51.000000000 +0200 @@ -499,7 +499,11 @@ int ret; json_object *root = json_object_from_file(path); - assert(root && "Unable to build root object."); + + if (root == NULL) { + /* Unable to build root object, most likely not a JSON file. */ + return NULL; + } json_object *library = json_object_object_get(root, "library"); if (!library) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libpulp-0.3.14/tools/packer.c new/libpulp-0.3.15/tools/packer.c --- old/libpulp-0.3.14/tools/packer.c 2024-07-24 22:12:39.000000000 +0200 +++ new/libpulp-0.3.15/tools/packer.c 2025-06-17 01:15:51.000000000 +0200 @@ -616,6 +616,15 @@ container_path = ulp->so_filename; container = ulp_so_info_open(container_path); + if (container == NULL) { + /* Failed to open it. The file is probably not what we expected it to be, + or has missing pieces. */ + parse_error(loc, + "Unsupported container format. Check if it is a valid ELF or JSON."); + ret = 0; + goto dsc_clean; + } + n = getline(&first, &len, parse_file); loc.line++; loc.col = 1; @@ -691,6 +700,16 @@ } target = ulp_so_info_open(target_path); + + if (target == NULL) { + /* Failed to open it. The file is probably not what we expected it to be, + or has missing pieces. */ + parse_error(loc, + "Unsupported target format. Check if it is a valid ELF or JSON."); + ret = 0; + goto dsc_clean; + } + ulp->objs->name = strdup(target->name); } else {