gtk-gnutella Changelog

What's new in gtk-gnutella 1.1.10

Sep 6, 2016
  • Improvements:
  • FAQ cleanups.
  • Added the ".ape" file extension to the default list of shared files.
  • Remember hosts to which a TCP connection failed recently to avoid hammering.
  • Updated French and Turkish translations.
  • Updated GeoIP databases.
  • Bug Fixes:
  • Don't embed build date if SOURCE_DATE_EPOCH is set for reproducibile builds.
  • Missed ":" in variable substitution request, in scripts/nm-list
  • nm-list: fixed date computation on BSD systems.
  • Under the Hood:
  • Need TLS 2.12 to generate an X.509 self-signed certificate.
  • Added G_PRINTF() hint to tls_logfmt() and tls_cert_log() to avoid warnings.
  • Fixed CPP file inclusion protection symbol for lib/mime_type.h.
  • Added the "ape" MIME type linked to the ".ape" file extension.
  • Ensure we do not suspend threads during an interrupt.
  • Track where context was taken in our setjmp wrappers to ease debugging.
  • Keep track of "once" initializations in case we end-up recursing.
  • Trace which new lock is overflowing the lock stack.
  • once: make sure we can insert routine in our tracking table.
  • once: arbitrarily limit nesting level in one thread to 32.
  • dht_update_size_estimate(): return if our KUID was not initialized yet.
  • keys_reclaim(): we can have values attached to key if we can remove it.
  • symbols_load_from(): must release write lock when falling back to pre-computed.
  • thread_element_block_until(): was not checking for concurrent unblocking.
  • thread_element_block_until(): revisited signal handling.
  • thread_suspend_others(): don't wait for busy threads already marked suspended.
  • walloc: prevent race condition on walloc_stopped being set.

New in gtk-gnutella 1.1.3 (Apr 9, 2015)

  • This is mainly a critical bug-fixing release, addressing a huge shortcoming in 1.1.2: all Shareaza leaves are incorrectly flagged as being fakes and are being removed quicktly from ultrapeers, creating network churn and instability. Everyone running gtk-gnutella as Ultrapeer must upgrade to 1.1.3 quickly. Releasing quickly after 1.1.3 is also a pretext for improving stability on Windows platforms, especially after restarts: because Windows does not support the "close on exec" flag on file descriptors, restarted processes were left with several instances of a listening socket bound to the same port, causing havoc as behaviour is totally undefined and was most probably leading to the inability for the process to get any incoming connections. On Windows, we now also monitor the memory usage more closely, in order to avoid the C runtime from issuing a (blocking) popup signalling a fatal memory allocation error should it run out of space. More generally, the VMM layer is now capable of trapping fatal memory allocation errors and handling them more efficiently. In particular, when everything has failed, the layer can request a brutal restart of the process. Under less dire circumstances, a graceful restart will be requested. This was also an occasion to revisit the long-term allocation strategy in the VMM layer and optimize it in order to further limit fragmentation of the VM space. Even though avoiding fragmentation matters mostly for 32-bit applications, this also limits the amount of individual memory region mappings the kernel has to maintain and gtk-gnutella has to keep track of. Finally, a last-minute bug fix where a user reported a deadlock in the QRP processing code. After investigation, it turned out that there was indeed a recursive locking on a spinlock that had escaped all real-life testing out there so far!
  • Improvements:
  • [GTK2] Added popup menu icon in front of "force push mode" for sources.
  • [GTK2] Added warning icon in status bar when kernel runs short of net buffers.
  • Increased default node connection timeout and size of the quick connect pool.
  • Updated the shell "status" command to display "!IP" on net buffer shortage.
  • Updated FAQ along with French and Turkish translations.
  • Updated GeoIP databases.
  • Bug Fixes:
  • Fixed invalid test for "fake" Shareaza that led to network instabilities.
  • Made QRP lock a mutex to allow for recursive locking through qrp_comp_done().
  • Under the Hood:
  • On out-of-memory conditions, attempt to auto-restart if possible.
  • Windows: monitor committed memory, crashing before the kernel would kill us.
  • Added crash_restart() and controlling routines to request smooth restart.
  • On network buffer shortage (ENOBUFS), stop TCP connections for a while.
  • UPnP: protect upnp_mapping objects given to callbacks with reference counts.
  • Adjusted lock tracking when locks are disabled, fixing lock swapping.
  • Windows: remember socket descriptors so that we can close them on exec().
  • Refactored code for listening sockets to warn when bound port is already used.
  • When shutdowning in "crash mode", skip most of the memory cleanup.
  • rwlock_destroy(): make sure to write-unlock the lock if it was owned.
  • waiter_ack(): don't panic if waiter was not notified, but loudly complain.
  • upnp_map_natpmp_publish_reply(): trace given port on NAT-PMP mapping errors.
  • upnp_discover(): force selection of IPv4 interface for UPnP discovery.
  • thread_unsuspend_others(): relaxed hard assertion into a soft one.
  • alloc_pages(): try harder on OOM conditions to allocate from the page cache.
  • socket_connect_finalize(): fixed wrong errno processing for connect().
  • socket_connect_prepare(): no need for SO_REUSEADDR for connecting sockets.

New in gtk-gnutella 1.1.1 (Sep 9, 2014)

  • Improvements:
  • Share Opus files by default, added opus and webm to search filters.
  • No longer automagically unshare directories that do exist currently.
  • Revamped peek/poke functions because GCC generated unoptimized code for these.
  • Bug Fixes:
  • Avoid crash when we cannot parse the remotely supplied push-proxy URL.
  • Fixed crash when entering "local:" as search term.
  • Fixed crash when gtk-gnutella was stopped from terminal and put to background.
  • Fixed crash on "Reverse DNS lookup" queries from the GUI node pane.
  • Fixed GtkSpinButton "adjustment with non-zero page size" deprecation message.
  • Handle G_SEARCHPATH_SEPARATOR in shared base directory correctly.
  • Under the Hood:
  • shared_file_get_index(): fixed lower boundary of assertion.
  • fi_find_aggressive_candidate(): prevent division by 0 if no starving download.
  • Fixed possible race condition between bg_task_wakeup() and bg_sched_sleep().
  • Regenerated Configure to allow BFD library detection for newest versions.
  • teq_post_rpc(): use linearily increasing timeouts to limit logging.
  • str_vncatf(): made recursion checks before calling s_minicarp() thread-safe.
  • ut_frag_pmsg_free(): avoid SIGSEGV when fragment was already acknowledged.
  • deflate_add(): refuse further data when the TX deflate layer had an error.
  • search_dequeue_all_nodes(): must also iterate on G2 nodes.
  • cq_heartbeat(): only log delay adjustements when running with cq_debug > 0.
  • g2_node_handle(): silence warnings when not debugging.
  • Allow xfl_find_freelist_index() to work with gcc 4.9 and optimizations.
  • keys_offload(): do not process if the key layer was shutdown.

New in gtk-gnutella 1.1.0 (Jul 5, 2014)

  • New Features:
  • Multi-threading support (file hashing, library rescan, DNS, etc...)
  • Added support for the G2 search protocol, connecting as leaf mode to G2.
  • Turned gtk-gnutella into a random number server through the "random" command.
  • Removed Bitzi support since the service has shutdown.
  • Added the --no-dbus command-line option to prevent D-BUS notifications.
  • [GTK] Added GUI enabling of the G2 protocol for searches.
  • [GTK] Added spin-button to set the amount of G2 hub connections to maintain.
  • [GTK] Report amount of G2 hubs to which we are connected.
  • [GTK] Show amount of G2 host browsing served, in the upload stats pane.
  • Improvements:
  • [GTK2] Added tri-state column sorting to "Downloads" and "Uploads" panes.
  • Better entropy collection to initialize the pseudo random number generators.
  • Externally visible randomness (e.g. GUIDs) is now cryptographically strong.
  • We now pick random DHT nodes to send back from the whole routing table
  • Some entropy collected is persisted, for better reseeding in next session.
  • Added time change detection when switching from/to Daylight Saving Time.
  • QRP query routing now uses LimeWire's logic, less strict than the GTKG one.
  • The shell "status" command now reports the amount of G2 hub connections.
  • Detect OOB proxy MUID conflicts for leaf queries.
  • Added the "stats drop" shell command to show dropped message statistics.
  • Improved random selection of files being matched in the library (local hits).
  • When a PUSH request fails to connect back, ban target IP:port for 5 minutes.
  • Configure: correctly detect the BFD library even if no -liberty.
  • Crash handler now records and logs the ID and name of crashing thread.
  • Updated gtk-gnutella.appdata.xml to the latest specifications.
  • Updated the FAQ, along with translations to French and Turkish.
  • Bug Fixes:
  • DHT bucket merging was incorrectly handling removal of nodes from table.
  • Reception of improper DHT messages could lead to an immediate crash (DoS).
  • ut_frag_pmsg_free(): rescheduling of expire event was in wrong block.
  • base16_encode(): would cause buffer overflow when destination too small.
  • Rotate OOB token keys less often, to avoid expiration whilst in transit.
  • socket_udp_event(): ignore empty datagrams.
  • Fixed host cache updates to avoid setting "out of bounds" property values.
  • hcache_find_nearby(): was missing a "break" in the case for HOST_GUESS.
  • Scheduled static checking by Coverity, found 81 problems requring a fix.
  • Fixed TCP message size computing bug, which could corrupt the TCP stream.
  • Configure: fixed endianess detection of IEEE-754 floats on Solaris.
  • Was never configuring TCP quick ACKs due to a missing "break" statement.
  • omalloc() could crash when configuring read-only objects.
  • Ensure we never insert any "unusable host" in the push-proxy set.
  • keys_update_value(): forgot to persist back updated expiration timestamp.
  • Properly flag UDP route as deflatable when GGEP "Z" is seen in queries.
  • Flag UDP route as supporting semi-reliable UDP when query flags are parsed.
  • Under the Hood:
  • GUESS now avoids querying hosts to which we are connected via TCP
  • GUESS: count the amount of hosts reached by query, since G2 queries a cluster.
  • GUESS: increased cached lifetime of query keys to a little less than 1 day.
  • GUESS: defer hosts we cannot requery to avoid constantly looping over them.
  • GUESS: fixed host atom leak when message is synchronously dropped.
  • GUESS: invalidate cached query keys on IP or listening port change.
  • Added a thread management layer on top of the POSIX thread layer.
  • Added support for safe inter-thread signals, handled by our thread layer.
  • Expanded the set of atomic operations we can perform.
  • Added read-write locks, now used by the VMM layer.
  • Addded multi-threaded goodies: barriers, dams, event queues, cond variables.
  • VMM: closed race condition during allocations.
  • Added support for permanent thread-private data.
  • Added primitive fork() handling in a multi-threaded environment.
  • Made float formatting code thread-safe, removing need for funnelling.
  • The ADNS now always runs in a separate thread.
  • Provide both thread-private (hashtable) and thread-local (array) variables.
  • Added new "thread list" shell command to monitor running threads.
  • Added "task list" shell command to list currently defined background tasks.
  • Added the "thread stats" shell command to dump thread statistics.
  • Added "lib show callout" shell command to display callout queue information.
  • Added "lib show files" to show opened files via file_object_xxx().
  • Made sure PROTECT_ATOMS and ATOMS_HAVE_MAGIC are orthogonal settings.
  • Moved the reference count of atoms to the tracking hash table.
  • Callout queue runs the idle callbacks if not scheduled in the last 30 secs.
  • Logging timestamps are now emitted with a millisecond accuracy.
  • Improved g_assert_not_reached() to propagate the routine name as well.
  • Re-architected file_objects to allow permission checking on opened files.
  • Introducing tqsort(), a multi-threaded quicksort for sorting large arrays.
  • Do not mark SIGPROF as harmful to allow profiling.
  • Added a thread-magazine allocator, used by walloc() and vmm_alloc().
  • Allow execution of some shell commands in a separate thread.
  • Added our own plain one-way and two-way list implementation.
  • Added optimized item freeing for embedded lists holding walloc()'ed objects.
  • Added thread-local ARC4 random streams for increased throughput.
  • Added global and per-thread WELL and CMWC random number generators.
  • Added Fortuna-like algorithm (AJE -- Alea Jacta Est) for gathering entropy.
  • Added support for fixed-size hash tables, entirely held in a static buffer.
  • hash_table_replace(): optimized to avoid two hash_table_find() calls.
  • Protect query hit generation against concurrent library rescans.
  • No longer close all file descriptors in main, since threads use them.
  • Semi-reliable UDP: only send last fragment of large message to unknown hosts.
  • Semi-reliable UDP: make sure remote side is ACK-ing sent fragments only.
  • Semi-reliable UDP: avoid endless loops if unsent ACK message is dropped.
  • Semi-reliable UDP: added TX accounting for dropped and physically sent ACKs.
  • Semi-reliable UDP: was not releasing data structure for dropped ACKs.
  • QRP support for generation of 1-bit patches, and optimized 1-bit handling.
  • make_room_internal(): removed bug catcher from 2006, which never triggered.
  • Cleaned up Gnutella handshaking to emit an Accept if the remote sent one.
  • search_results_process(): do not record last hop as hostile on relayed hits.
  • Do not attempt to OOB-proxy queries in search_request()!
  • host_timer(): fixed wrong cut-off by "quick connect pool".
  • Added script to auto-generate enums along with symbolic and English text.
  • options_parse(): fixed parsing of values immediately following the option.
  • Shuffling of large arrays now performed using PRNGs with greater period.
  • Renamed "struct mutex" as "struct lmutex" to avoid conflicts on Solaris.
  • st_search(): randomly shuffle results only when we have more than we can send.
  • Windows: added emulated clock_gettime() and clock_getres().
  • Dispatch entropy to PRNGs only once every 30 seconds at most.
  • Simplified rand31(), restoring its full period, and redesigned rand31_u32().
  • sdbm_rebuild(): was not properly catching errors during copy.
  • prop_get_def(): switched to HCOPY_ARRAY() to avoid any size problems
  • kmsg_handle(): avoid dereferencing a potentially NULL pointer.
  • route_max_forward_ttl(): take a reference instead of a by-value parameter.
  • parq_upload_remove(): fixed assertion, which was always evaluating to TRUE.
  • Report errors if we cannot set a file non-blocking or request close on exec().
  • Base32 decoding could fail spotting bad input due to short base32_map[] array.
  • search_matched(): was not counting the amount of skipped results in a search.
  • getgateway(): properly fallback to netstat parsing when socket() fails.
  • roots_fill_closest(): avoid memory leak on the error path.
  • Fixed UDP TX schedulers to allow both IPv4 and IPv6 message sending.
  • Make sure only developers will use autogen to regenerate the property files.
  • dh_route(): only compress UDP query hits when GUESS queryier supports them.
  • dh_route(): do not attempt UDP compression if message sent via reliable UDP.
  • Count UDP compression attempts and failures, including in semi-reliable UDP.

New in gtk-gnutella 1.0.1 (Apr 1, 2014)

  • Improvements:
  • Generate a NM/1.0 HTTP-like header at the top of the pre-computed nm list.
  • [GTK] Avoid GUI flickering when widget sensitivity is changing quickly.
  • Replace "()" with "[]" in filenames for easier cut-n-paste in shell commands.
  • Windows: improved stack unwinding.
  • Bug Fixes:
  • Fixed grave bug, making all GTKGs appear hostile.
  • qrp_close(): must disable periodic monitoring during shutdown.
  • filename_to_utf8_normalized(): fixed broken if/else logic in loop.
  • Under the Hood:
  • Updated the GeoIP databases.
  • Added a Keywords entry for lintian in the gtk-gnutella.desktop file.
  • Fixed license link to point to GPL-2 on Debian systems.
  • Added gtk-gnutella.appdata.xml for distributions that need such a file.
  • Renamed icon.xpm as icon.48x48.xpm and icon.32x32.xpm as icon.xpm.
  • TLS: disabled SVN signature verification code, since we no longer use SVN.
  • Define our own G_STRFUNC, do not use the version from GLib.
  • vmm_resize(): fixed wrong implementation when vmm_crashing is true.
  • Semi-reliable UDP: drop traffic to host temporarily if we can't send messages.
  • Use a 5-minute TLS ban to avoid reconnecting to host with TLS when it failed.
  • download_mark_active(): do not reset fi->recv_last_rate on HTTP follow-ups
  • bsched_heartbeat(): fixed wrong delay computatation, use tm_elapsed_ms().
  • gtk_gnutella_exit(): always emit final "cleanly exited" info.
  • zalloc_stack_accounting_ctrl(): used wrong lookup key, leading to crashes.
  • mingw_valloc(): handle initial non-hinted allocations larger than page.
  • signal_trap_with(): fixed improper return value computation for sigaction().

New in gtk-gnutella 0.96.8 (Apr 1, 2010)

  • Bug Fixes:
  • Removed an obsolete assertion now that gtk-gnutella supports NOPE DHT values.
  • This was causing a crash each time a NOPE value was received in response
  • to push-proxies queries in the DHT.
  • Fixed memory alignment problem for non-forgiving CPU architectures.
  • The virtual memory manager would crash when the kernel starts allocating
  • pages in zones we wrongly thought were already used.
  • Fixed long-standing bug in the Query Routing Table protocol where a RESET
  • message with the wrong table size could sometimes be sent, causing the remote
  • node to close the connection.
  • Make sure an ultrapeer is not publishing NOPE values in the DHT if support
  • for the DHT was disabled by user, which would be triggering a fatal assertion
  • failure.
  • Under the hood:
  • Fixed Makefile to ensure proper compilation under Gentoo's build scripts.
  • Push-proxy client support now makes sure there is a space after a leading
  • GET or HEAD word in the HTTP request.
  • The DIME parsing layer now given more information in case of an error.
  • Let THEX downloads peruse any supplied Content-Length information from the
  • server (applicable only when the output is not chunked).
  • The VMM layer is now smarter at identifying foreign pages when allocating
  • blocks larger than a single page.
  • When sending BYE messages, do not shutdown the socket layer if using TLS.
  • Compilation cleanup for SunOS, Sun Studio, and versions of GTK < 2.5.0.

New in gtk-gnutella 0.96.6 (Oct 19, 2009)

  • Refuse to share certain directories: /, $HOME, $GTK_GNUTELLA_DIR, and
  • the incomplete and corrupted directories.
  • Downloads GUI: added checkboxes to invert the select/filter patterns.
  • Downloads GUI: added "Modified" column and detail showing the timestamp of
  • the last file modification.
  • Optional beautification operations on filenames: strip leading "-", remove
  • consecutive "_" and prevent "_" surrounding punctuation characters.
  • Fixed significant performance issue in the Gtk+ 1.2 front-end: update of
  • upload statistics was O(n) but is now O(1).
  • Background TTH file verification now lights an icon in the GUI.
  • Show TTH tree depth in the download "Details" pane.
  • Update the bitzi metadata info box when a query finishes, so that it is
  • not required to click on the result again after requesting bitzi data.
  • Added MIME type column for search results.
  • Added "Last Request" and "Last Upload" columns to the Upload History.
  • Almost complete DHT support (missing only publishing of data), but code
  • needs to be explicitly enabled by setting "enable_dht" to TRUE. The DHT
  • knows how to look for alt-locs for files and push-proxies for firewalled
  • hosts, and will store local data for others to query.
  • New shell commands "stats", "download", "echo".
  • It is now possible to rename files being downloaded (through GTK2 or shell,
  • no support in GTK1).
  • Added more filename extensions to the built-in search filters.
  • Switch resources after getting an HTTP error if the connection is kept alive
  • and the error permits follow-ups (non-busy conditions).
  • Improved ability to switch resources after file completion by ignoring
  • trailing swarming data, to keep the connection alive.
  • Bitzi tickets are refreshed when explicitely requested, avoiding reuse
  • of stale metadata
  • Completed files are displayed during hash verification.
  • only propagate good alt-locs for files we are downloading, i.e. addresses
  • of hosts which we know to be serving that file because we contacted them.
  • Many new statistics counters.
  • Allow scheduling of special downloads without considering per-host limits,
  • as these are of a much shorter duration (THEX and browse host requests).
  • Always seed completed files, regardless of their size (no PFSP minimum as
  • with partial files), when their SHA-1 has been verified.
  • Incorrectly encoded Bitzi metadata is translated to Unicode.
  • Browse-host responses are sorted alphanumerically on relative pathnames to
  • allow users to relate files together if they don't understand GGEP "PATH".
  • Improved routing of PUSH messages by also looking whether targetted hosts
  • happen to be one of our immediate neighbours.
  • Updated Norwegian Bokmal and Spanish translations.