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()
