Your message dated Tue, 3 Dec 2024 19:49:19 +0000
with message-id <[email protected]>
and subject line Re: Bug#1088985: libsoup doesn't close connections, remaining 
as CLOSE_WAIT forever
has caused the Debian Bug report #1088985,
regarding libsoup doesn't close connections, remaining as CLOSE_WAIT forever
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
1088985: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1088985
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: libsoup-3.0-0
Version: 3.2.2-2
Severity: important
X-Debbugs-Cc: [email protected]

Dear maintainer,

first of all, this bug has been fixed in libsoup 3.3 and later.

I wrote a little http server in C with libsoup and a client in
python using requests. The client periodically asks the server
for some data and closes the connection.

I found that in a Raspberry Pi with Raspbian (based on Debian
stable), the client hung up after some time working. After
researching, I discovered a lot of CLOSE_WAIT connections
linked to my server. After some time, there were so many
connections in that state that no new connections could be
made.

I did several tests, including writting a minimal server and
doing petitions with CURL, both in the Raspberry Pi as in a
virtual machine with DEBIAN BOOKWORM, and was able to
reproduce it, and confirmed that the culprit is libsoup:
updating it to version 3.3.0 (compiled from the git sources)
the problem disappears.

HOW TO REPRODUCE:

compile and launch this minimal server:

  #include <gio/gio.h>
  #include <glib.h>
  #include <libsoup/soup.h>
  #include <stdio.h>

  #define SERVER_PORT 40006

  SoupServer *server;
  static int counter = 0;

  void server_call(
    SoupServer* server,
    SoupServerMessage* msg,
    const char* path,
    GHashTable* query,
    gpointer user_data
  ) {
    gchar *response = g_strdup_printf("{\"counter\":%d}", counter++);
    g_print("Received petition; response: %s\n", response);
    soup_server_message_set_response(msg, "application/json", SOUP_MEMORY_TAKE, 
response, strlen(response));
    soup_server_message_set_status(msg, 200, "OK");
  }

  void startup(GApplication *app, gpointer data) {
    server = soup_server_new ("server-header", "simple-httpd ", NULL);
    GError *error = NULL;
    soup_server_listen_all (server, SERVER_PORT, SOUP_SERVER_LISTEN_IPV4_ONLY, 
&error);
    soup_server_add_handler(server, NULL, server_call, NULL, NULL);
  }

  int main(int argc, char **argv) {
    g_autoptr(GApplication) app =
        g_application_new("com.rastersoft.souptest", G_APPLICATION_IS_SERVICE);

    g_application_hold(app);
    g_signal_connect(app, "startup", (GCallback)startup, NULL);
    g_application_run(app, argc, argv);
    return 0;
  }

You can use this Makefile:

LIBS=glib-2.0 gio-2.0 gobject-2.0 libsoup-3.0

soup_test: soup_test.o
        gcc -g -o $@ $^ `pkg-config --libs $(LIBS)`

soup_test.o: soup_test.c
        gcc -c -g -O2  `pkg-config --cflags $(LIBS)` -o $@ $<



Now launch the server and, in another terminal, do a

    netstat -ntop |grep CLOSE_WAIT

It should show nothing. Now, run:

    curl http://127.0.0.1:40006

It should show {"counter":0} as response. If you now do again

    netstat -ntop |grep CLOSE_WAIT

one line should appear, pinned to soup_test. Running CURL
more times will do appear more and more CLOSE_WAIT sockets.

As I already commented, this problem can cause resource
exhaustion, and also has already been fixed upstream.

-- System Information:
Debian Release: 12.8
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable-security'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 6.1.0-28-amd64 (SMP w/2 CPU threads; PREEMPT)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages libsoup-3.0-0 depends on:
ii  glib-networking     2.74.0-4
ii  libbrotli1          1.0.9-2+b6
ii  libc6               2.36-9+deb12u9
ii  libglib2.0-0        2.74.6-2+deb12u4
ii  libgssapi-krb5-2    1.20.1-2+deb12u2
ii  libnghttp2-14       1.52.0-1+deb12u2
ii  libpsl5             0.21.2-1
ii  libsoup-3.0-common  3.2.2-2
ii  libsqlite3-0        3.40.1-2+deb12u1
ii  zlib1g              1:1.2.13.dfsg-1

libsoup-3.0-0 recommends no packages.

libsoup-3.0-0 suggests no packages.

-- no debconf information

--- End Message ---
--- Begin Message ---
Version: 3.4.0-1

On Tue, 03 Dec 2024 at 12:42:48 -0700, Sergio Costas wrote:
> first of all, this bug has been fixed in libsoup 3.3 and later.

Recording that in the version tracking. The bug remains valid in bookworm.

If you know or can find what upstream change resolves it, then that
makes it more likely that someone will be able to prepare a bookworm
stable update backporting that change into the 3.2.x branch.

Thanks,
    smcv

--- End Message ---

Reply via email to