Public bug reported:

When compiling the following code and executing the program, the child
process hangs forever on a mutex that was held by `getaddrinfo` on
another thread at the time of the fork. I don't see anything in the
manpage for `getaddrinfo` that suggests this shouldn't work. I suspect
glibc is missing a call to `pthread_atfork`.

mre.cpp
```
#include <thread>

#include <netdb.h>
#include <unistd.h>

void spamGetaddrinfo()
{
    for (int i = 0; i< 100; ++i)
    {
        addrinfo *addrInfo{nullptr};
        ::getaddrinfo("google.com", "80", nullptr, &addrInfo);
    }
    printf("Thread is done\n");
}

int main()
{
    auto thread = std::thread{spamGetaddrinfo};

    usleep(1);

    if (auto pid = fork(); pid != 0)
    {
        // Parent
        printf("Parent is done\n");
        thread.join();
    }
    else
    {
        // Child
        addrinfo *addrInfo{nullptr};
        ::getaddrinfo("google.com", "80", nullptr, &addrInfo);

        printf("Child is done\n");
    }
}
```

Run `g++ -std=c++17 -pthread mre.cpp && ./a.out`

Expected output:
```
Parent is done
Child is done
Thread is done
```

Actual output:
```
Parent is done
Thread is done
```

When finished, use `pkill a.out` to remove the leftover child process.

ProblemType: Bug
DistroRelease: Ubuntu 18.04
Package: libc6 2.27-3ubuntu1.5
ProcVersionSignature: Ubuntu 4.15.0-166.174-generic 4.15.18
Uname: Linux 4.15.0-166-generic x86_64
ApportVersion: 2.20.9-0ubuntu7.27
Architecture: amd64
Date: Wed Mar 23 10:32:43 2022
Dependencies:
 gcc-8-base 8.4.0-1ubuntu1~18.04
 libc6 2.27-3ubuntu1.5
 libgcc1 1:8.4.0-1ubuntu1~18.04
InstallationDate: Installed on 2019-12-07 (836 days ago)
InstallationMedia: Ubuntu-Server 18.04.3 LTS "Bionic Beaver" - Release amd64 
(20190805)
ProcEnviron:
 LANG=en_US.UTF-8
 TERM=screen
 SHELL=/bin/bash
 XDG_RUNTIME_DIR=<set>
 PATH=(custom, user)
SourcePackage: glibc
UpgradeStatus: No upgrade log present (probably fresh install)

** Affects: glibc (Ubuntu)
     Importance: Undecided
         Status: New


** Tags: amd64 apport-bug bionic uec-images

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1966100

Title:
  getaddrinfo not fork-safe

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1966100/+subscriptions


-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to