Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libfilezilla for openSUSE:Factory 
checked in at 2026-05-04 14:42:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libfilezilla (Old)
 and      /work/SRC/openSUSE:Factory/.libfilezilla.new.30200 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libfilezilla"

Mon May  4 14:42:04 2026 rev:65 rq:1350652 version:0.55.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/libfilezilla/libfilezilla.changes        
2026-04-11 22:31:53.073912975 +0200
+++ /work/SRC/openSUSE:Factory/.libfilezilla.new.30200/libfilezilla.changes     
2026-05-04 14:42:07.942535469 +0200
@@ -1,0 +2,10 @@
+Sun May  3 22:34:06 UTC 2026 - ecsos <[email protected]> - 0.55.4
+
+- Update to 0.55.4
+  * Bugfixes and minor changes:
+    - Fixed a crash if a nested event handler gets deleted
+- Changes from 0.55.3
+  * Bugfixes and minor changes:
+    - Fix initialization of sha2-384
+
+-------------------------------------------------------------------

Old:
----
  libfilezilla-0.55.2.tar.xz

New:
----
  libfilezilla-0.55.4.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libfilezilla.spec ++++++
--- /var/tmp/diff_new_pack.WDaQeg/_old  2026-05-04 14:42:08.498558313 +0200
+++ /var/tmp/diff_new_pack.WDaQeg/_new  2026-05-04 14:42:08.498558313 +0200
@@ -16,11 +16,11 @@
 #
 
 
-%define major          54
+%define major          57
 %define libname                %{name}%{major}
 %define develname      %{name}-devel
 Name:           libfilezilla
-Version:        0.55.2
+Version:        0.55.4
 Release:        0
 Summary:        C++ library for filezilla
 License:        GPL-2.0-or-later

++++++ libfilezilla-0.55.2.tar.xz -> libfilezilla-0.55.4.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libfilezilla-0.55.2/NEWS new/libfilezilla-0.55.4/NEWS
--- old/libfilezilla-0.55.2/NEWS        2026-03-23 16:11:18.000000000 +0100
+++ new/libfilezilla-0.55.4/NEWS        2026-04-16 13:35:05.000000000 +0200
@@ -1,3 +1,11 @@
+0.55.4 (2026-04-16)
+
+- Fixed a crash if a nested event handler gets deleted
+
+0.55.3 (2026-04-13)
+
+- Fix initialization of sha2-384
+
 0.55.2 (2026-03-23)
 
 + Added fz::buffer::clear_and_free
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libfilezilla-0.55.2/configure 
new/libfilezilla-0.55.4/configure
--- old/libfilezilla-0.55.2/configure   2026-03-23 16:11:23.000000000 +0100
+++ new/libfilezilla-0.55.4/configure   2026-04-16 13:35:11.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.72 for libfilezilla 0.55.2.
+# Generated by GNU Autoconf 2.72 for libfilezilla 0.55.4.
 #
 # Report bugs to <[email protected]>.
 #
@@ -614,8 +614,8 @@
 # Identity of this package.
 PACKAGE_NAME='libfilezilla'
 PACKAGE_TARNAME='libfilezilla'
-PACKAGE_VERSION='0.55.2'
-PACKAGE_STRING='libfilezilla 0.55.2'
+PACKAGE_VERSION='0.55.4'
+PACKAGE_STRING='libfilezilla 0.55.4'
 PACKAGE_BUGREPORT='[email protected]'
 PACKAGE_URL='https://lib.filezilla-project.org/'
 
@@ -1477,7 +1477,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 libfilezilla 0.55.2 to adapt to many kinds of systems.
+'configure' configures libfilezilla 0.55.4 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1548,7 +1548,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of libfilezilla 0.55.2:";;
+     short | recursive ) echo "Configuration of libfilezilla 0.55.4:";;
    esac
   cat <<\_ACEOF
 
@@ -1705,7 +1705,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-libfilezilla configure 0.55.2
+libfilezilla configure 0.55.4
 generated by GNU Autoconf 2.72
 
 Copyright (C) 2023 Free Software Foundation, Inc.
@@ -2110,7 +2110,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by libfilezilla $as_me 0.55.2, which was
+It was created by libfilezilla $as_me 0.55.4, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3106,7 +3106,7 @@
 # If any interfaces have been added since the last public release, then 
increment age.
 # If any interfaces have been removed or changed since the last public 
release, then set age to 0.
 # CURRENT:REVISION:AGE
-LIBRARY_VERSION=56:0:2
+LIBRARY_VERSION=57:0:0
 
 
 
@@ -3814,7 +3814,7 @@
 
 # Define the identity of the package.
  PACKAGE='libfilezilla'
- VERSION='0.55.2'
+ VERSION='0.55.4'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -25826,7 +25826,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by libfilezilla $as_me 0.55.2, which was
+This file was extended by libfilezilla $as_me 0.55.4, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -25895,7 +25895,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-libfilezilla config.status 0.55.2
+libfilezilla config.status 0.55.4
 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/libfilezilla-0.55.2/configure.ac 
new/libfilezilla-0.55.4/configure.ac
--- old/libfilezilla-0.55.2/configure.ac        2026-03-23 16:11:18.000000000 
+0100
+++ new/libfilezilla-0.55.4/configure.ac        2026-04-16 13:35:05.000000000 
+0200
@@ -1,4 +1,4 @@
-AC_INIT([libfilezilla],[0.55.2],[[email protected]],[],[https://lib.filezilla-project.org/])
+AC_INIT([libfilezilla],[0.55.4],[[email protected]],[],[https://lib.filezilla-project.org/])
 
 # Update the version information only immediately before a public release of 
your software
 # If the library source code has changed at all since the last update, then 
increment revision (‘c:r:a’ becomes ‘c:r+1:a’).
@@ -6,7 +6,7 @@
 # If any interfaces have been added since the last public release, then 
increment age.
 # If any interfaces have been removed or changed since the last public 
release, then set age to 0.
 # CURRENT:REVISION:AGE
-LIBRARY_VERSION=56:0:2
+LIBRARY_VERSION=57:0:0
 
 AH_TOP([
 #ifndef LIBFILEZILLA_CONFIG_HEADER
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libfilezilla-0.55.2/lib/event_loop.cpp 
new/libfilezilla-0.55.4/lib/event_loop.cpp
--- old/libfilezilla-0.55.2/lib/event_loop.cpp  2025-12-10 16:59:22.000000000 
+0100
+++ new/libfilezilla-0.55.4/lib/event_loop.cpp  2026-04-16 13:35:05.000000000 
+0200
@@ -86,6 +86,9 @@
        auto *cur = handler;
        do {
                cur->removing_ = true;
+               if (cur == active_handler_) {
+                       active_handler_removed_ = true;
+               }
                if (cur->child_) {
                        cur = cur->child_;
                }
@@ -100,7 +103,8 @@
        }
        while (cur && cur != handler);
 
-       // Now that no new events/timers can be added for the whole subtree
+       // From here on, no new events/timers can be added for the whole subtree
+
        pending_events_.erase(
                std::remove_if(pending_events_.begin(), pending_events_.end(),
                        [&](Events::value_type const& v) {
@@ -126,17 +130,14 @@
                deadline_ = monotonic_clock();
        }
 
-       if (is_part_of_group(active_handler_, handler)) {
-               if (thread::own_id() != thread_id_) {
-                       while (is_part_of_group(active_handler_, handler)) {
-                               l.unlock();
-                               yield();
-                               l.lock();
-                       }
-               }
-               else {
-                       resend_ = false;
-               }
+       // We must loop while active_handler_removed_ is true, as it might
+       // have been deleted and the pointer value already reused for handler
+       if ((active_handler_removed_ || is_part_of_group(active_handler_, 
handler)) && thread::own_id() != thread_id_) {
+               do {
+                       l.unlock();
+                       yield();
+                       l.lock();
+               } while (active_handler_removed_ || handler == active_handler_);
        }
 
        // Must remove self from parents here, otherwise event handler 
destructor would need to lock mutex
@@ -163,6 +164,18 @@
        );
 }
 
+void event_loop::remove_events(event_source const* const source)
+{
+       auto event_filter = [&](event_handler*&, event_base& ev) -> bool {
+                       auto sev = dynamic_cast<event_with_source_base*>(&ev);
+                       if (sev) {
+                               return sev->source() == source;
+                       }
+                       return false;
+               };
+       filter_events(event_filter);
+}
+
 timer_id event_loop::add_timer(event_handler* handler, monotonic_clock const 
&deadline, duration const& interval)
 {
        timer_id id = 0;
@@ -288,10 +301,11 @@
        if (resend_) {
                resend_ = false;
                l.lock();
-               if (!std::get<0>(ev)->removing_) {
+               if (!active_handler_removed_) {
                        pending_events_.emplace_back(ev);
                }
-               else { // Unlikely, but possible to get into this branch branch
+               else {
+                       // Unlikely, but possible to get into this branch branch
                        if (std::get<2>(ev)) {
                                delete std::get<1>(ev);
                        }
@@ -305,6 +319,7 @@
        }
 
        active_handler_ = nullptr;
+       active_handler_removed_ = false;
 
        return true;
 }
@@ -448,6 +463,7 @@
                l.lock();
 
                active_handler_ = nullptr;
+               active_handler_removed_ = false;
 
                return true;
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libfilezilla-0.55.2/lib/hash.cpp 
new/libfilezilla-0.55.4/lib/hash.cpp
--- old/libfilezilla-0.55.2/lib/hash.cpp        2026-02-25 17:36:43.000000000 
+0100
+++ new/libfilezilla-0.55.4/lib/hash.cpp        2026-04-13 23:37:32.000000000 
+0200
@@ -265,7 +265,7 @@
        sha256_ctx ctx_;
 };
 
-class hash_accumulator_sha512 : public hash_accumulator::impl
+class hash_accumulator_sha512 final : public hash_accumulator::impl
 {
 public:
        hash_accumulator_sha512()
@@ -285,7 +285,7 @@
                nettle_sha512_init(&ctx_);
        }
 
-       virtual void digest(uint8_t* out) override
+       virtual void digest(uint8_t* out) override final
        {
                nettle_sha512_digest(&ctx_, SHA512_DIGEST_SIZE, out);
        }
@@ -294,16 +294,33 @@
        sha512_ctx ctx_;
 };
 
-class hash_accumulator_sha384 final : public hash_accumulator_sha512
+class hash_accumulator_sha384 final : public hash_accumulator::impl
 {
 public:
+       hash_accumulator_sha384()
+       {
+               reinit();
+       }
+
        virtual size_t digest_size() const override { return 
SHA384_DIGEST_SIZE; }
 
+       virtual void update(uint8_t const* data, size_t size) override final
+       {
+               sha384_update(&ctx_, size, data);
+       }
+
+       virtual void reinit() override final
+       {
+               nettle_sha384_init(&ctx_);
+       }
 
        virtual void digest(uint8_t* out) override
        {
-               nettle_sha512_digest(&ctx_, SHA384_DIGEST_SIZE, out);
+               nettle_sha384_digest(&ctx_, SHA384_DIGEST_SIZE, out);
        }
+
+protected:
+       sha384_ctx ctx_;
 };
 
 class hash_accumulator_sha3_256 : public hash_accumulator::impl
@@ -707,6 +724,22 @@
 }
 
 template<typename DataContainer>
+std::vector<uint8_t> sha384_impl(DataContainer const& in)
+{
+       static_assert(sizeof(typename DataContainer::value_type) == 1, "Bad 
container type");
+
+       hash_accumulator_sha384 acc;
+       if (!in.empty()) {
+               acc.update(reinterpret_cast<uint8_t const*>(in.data()), 
in.size());
+       }
+       std::vector<uint8_t> ret;
+       ret.resize(SHA384_DIGEST_SIZE);
+       acc.digest(ret.data());
+       return ret;
+
+}
+
+template<typename DataContainer>
 std::vector<uint8_t> sha512_impl(DataContainer const& in)
 {
        static_assert(sizeof(typename DataContainer::value_type) == 1, "Bad 
container type");
@@ -795,6 +828,16 @@
        return sha256_impl(data);
 }
 
+std::vector<uint8_t> sha384(std::vector<uint8_t> const& data)
+{
+       return sha384_impl(data);
+}
+
+std::vector<uint8_t> sha384(std::string_view const& data)
+{
+       return sha384_impl(data);
+}
+
 std::vector<uint8_t> sha512(std::vector<uint8_t> const& data)
 {
        return sha512_impl(data);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libfilezilla-0.55.2/lib/libfilezilla/event_loop.hpp 
new/libfilezilla-0.55.4/lib/libfilezilla/event_loop.hpp
--- old/libfilezilla-0.55.2/lib/libfilezilla/event_loop.hpp     2025-07-16 
11:21:37.000000000 +0200
+++ new/libfilezilla-0.55.4/lib/libfilezilla/event_loop.hpp     2026-04-16 
13:35:05.000000000 +0200
@@ -64,6 +64,11 @@
         */
        void filter_events(std::function<bool (event_handler*&, event_base&)> 
const& filter);
 
+       /** \brief
+        * Removes all events of event_with_source type with the given source 
on this loop.
+        */
+       void remove_events(event_source const* const source);
+
        /** \brief Stops the loop
         *
         * Stops the event loop. It is automatically called by the destructor.
@@ -123,6 +128,7 @@
        condition timer_cond_;
        bool do_timers_{};
 
+       bool active_handler_removed_{};
        event_handler * active_handler_{};
 
        monotonic_clock deadline_;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libfilezilla-0.55.2/lib/libfilezilla/hash.hpp 
new/libfilezilla-0.55.4/lib/libfilezilla/hash.hpp
--- old/libfilezilla-0.55.2/lib/libfilezilla/hash.hpp   2026-02-25 
17:36:43.000000000 +0100
+++ new/libfilezilla-0.55.4/lib/libfilezilla/hash.hpp   2026-04-13 
23:37:32.000000000 +0200
@@ -102,10 +102,18 @@
 std::vector<uint8_t> FZ_PUBLIC_SYMBOL md5(std::string_view const& data);
 std::vector<uint8_t> FZ_PUBLIC_SYMBOL md5(std::vector<uint8_t> const& data);
 
+/// \brief Standard SHA1
+std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha1(std::string_view const& data);
+std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha1(std::vector<uint8_t> const& data);
+
 /// \brief Standard SHA256
 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha256(std::string_view const& data);
 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha256(std::vector<uint8_t> const& data);
 
+/// \brief Standard SHA384
+std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha384(std::string_view const& data);
+std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha384(std::vector<uint8_t> const& data);
+
 /// \brief Standard SHA512
 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha512(std::string_view const& data);
 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha512(std::vector<uint8_t> const& data);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libfilezilla-0.55.2/tests/eventloop.cpp 
new/libfilezilla-0.55.4/tests/eventloop.cpp
--- old/libfilezilla-0.55.2/tests/eventloop.cpp 2023-05-26 09:44:37.000000000 
+0200
+++ new/libfilezilla-0.55.4/tests/eventloop.cpp 2026-04-16 13:35:05.000000000 
+0200
@@ -10,6 +10,7 @@
        CPPUNIT_TEST(testFilter);
        CPPUNIT_TEST(testCondition);
        CPPUNIT_TEST(testTimer);
+       CPPUNIT_TEST(testSelfremove);
        CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -20,6 +21,7 @@
        void testFilter();
        void testCondition();
        void testTimer();
+       void testSelfremove();
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION(EventloopTest);
@@ -254,3 +256,67 @@
 
        CPPUNIT_ASSERT(handler.cond_.wait(l, fz::duration::from_seconds(1)));
 }
+
+namespace {
+struct selfremove_event_type;
+typedef fz::simple_event<selfremove_event_type, bool> selfremove_event;
+
+class parent_handler final : public fz::event_handler
+{
+public:
+       parent_handler(fz::event_loop & l)
+               : fz::event_handler(l)
+       {}
+
+       virtual ~parent_handler()
+       {
+               remove_handler();
+       }
+
+       virtual void operator()(fz::event_base const&) override {}
+};
+
+class selfremove_handler final : public fz::event_handler
+{
+public:
+       selfremove_handler(event_handler& parent)
+               : fz::event_handler(parent)//, fz::child_event_handler)
+               , parent_(parent)
+       {}
+
+       virtual ~selfremove_handler()
+       {
+               remove_handler();
+       }
+
+       virtual void operator()(fz::event_base const& ev) override
+       {
+
+               auto &p = parent_;
+               delete this;
+               p.resend_current_event();
+               bool stop = std::get<0>(static_cast<selfremove_event 
const&>(ev).v_);
+               if (stop) {
+                       p.remove_handler();
+                       p.event_loop_.stop();
+               }
+       }
+
+       event_handler& parent_;
+};
+}
+
+void EventloopTest::testSelfremove()
+{
+       // Valgrind must not report problems.
+       fz::event_loop loop(fz::event_loop::threadless);
+
+       parent_handler p(loop);
+       auto h1 = new selfremove_handler(p);
+       auto h2 = new selfremove_handler(p);
+
+       h1->send_event<selfremove_event>(false);
+       h2->send_event<selfremove_event>(true);
+
+       loop.run();
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libfilezilla-0.55.2/tests/hash.cpp 
new/libfilezilla-0.55.4/tests/hash.cpp
--- old/libfilezilla-0.55.2/tests/hash.cpp      2025-03-26 11:07:26.000000000 
+0100
+++ new/libfilezilla-0.55.4/tests/hash.cpp      2026-04-13 23:37:32.000000000 
+0200
@@ -30,7 +30,12 @@
 
 void hash_test::test_simple()
 {
-       CPPUNIT_ASSERT_EQUAL("9e107d9d372bb6826bd81d3542a419d6"s, 
fz::hex_encode<std::string>(fz::md5("The quick brown fox jumps over the lazy 
dog")));
+       auto const foxjump = "The quick brown fox jumps over the lazy dog";
+       CPPUNIT_ASSERT_EQUAL("9e107d9d372bb6826bd81d3542a419d6"s, 
fz::hex_encode<std::string>(fz::md5(foxjump)));
+       CPPUNIT_ASSERT_EQUAL("2fd4e1c67a2d28fced849ee1bb76e7391b93eb12"s, 
fz::hex_encode<std::string>(fz::sha1(foxjump)));
+       
CPPUNIT_ASSERT_EQUAL("d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"s,
 fz::hex_encode<std::string>(fz::sha256(foxjump)));
+       
CPPUNIT_ASSERT_EQUAL("ca737f1014a48f4c0b6dd43cb177b0afd9e5169367544c494011e3317dbf9a509cb1e5dc1e85a941bbee3d7f2afbc9b1"s,
 fz::hex_encode<std::string>(fz::sha384(foxjump)));
+       
CPPUNIT_ASSERT_EQUAL("07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6"s,
 fz::hex_encode<std::string>(fz::sha512(foxjump)));
 }
 
 void hash_test::test_accumulator()

Reply via email to