djbdns: fix crash due to data ulimit

This fixes: https://github.com/NixOS/nixpkgs/issues/119066.

When `djbdns` is repeatedly queried it will crash with:

```
mmap: tinydns (842): VmData 331776 exceed data ulimit 300000. Update limits or use boot option ignore_rlimit_data.
```

So we increase the softlimit from 300000 to 4500000 as suggested in
the issue.

The `tinydns` NixOS test has been extended with testing for the faulty
behaviour.
This commit is contained in:
Bas van Dijk 2021-11-08 17:28:41 +00:00
parent dd1edacb7b
commit 7a8b4907e2
3 changed files with 35 additions and 2 deletions

View file

@ -21,6 +21,20 @@ import ./make-test-python.nix ({ lib, ...} : {
testScript = ''
nameserver.start()
nameserver.wait_for_unit("tinydns.service")
nameserver.succeed("host bla.foo.bar 192.168.1.1 | grep '1\.2\.3\.4'")
# We query tinydns a few times to trigger the bug:
#
# nameserver # [ 6.105872] mmap: tinydns (842): VmData 331776 exceed data ulimit 300000. Update limits or use boot option ignore_rlimit_data.
#
# which was reported in https://github.com/NixOS/nixpkgs/issues/119066.
# Without the patch <nixpkgs/pkgs/tools/networking/djbdns/softlimit.patch>
# it fails on the 10th iteration.
nameserver.succeed(
"""
for i in {1..15}; do
host bla.foo.bar 192.168.1.1 | grep '1\.2\.3\.4'
done
"""
)
'';
})

View file

@ -19,7 +19,14 @@ stdenv.mkDerivation {
sha256 = "0j3baf92vkczr5fxww7rp1b7gmczxmmgrqc8w2dy7kgk09m85k9w";
};
patches = [ ./hier.patch ./fix-nix-usernamespace-build.patch ];
patches = [
./hier.patch
./fix-nix-usernamespace-build.patch
# To fix https://github.com/NixOS/nixpkgs/issues/119066.
# Note that the NixOS test <nixpkgs/nixos/tests/tinydns.nix> tests for this.
./softlimit.patch
];
postPatch = ''
echo gcc -O2 -include ${glibc.dev}/include/errno.h > conf-cc

View file

@ -0,0 +1,12 @@
diff -Naur a/tinydns-conf.c b/tinydns-conf.c
--- a/tinydns-conf.c 2001-02-11 21:11:45.000000000 +0000
+++ b/tinydns-conf.c 2021-11-08 17:23:06.181385437 +0000
@@ -46,7 +46,7 @@
start("run");
outs("#!/bin/sh\nexec 2>&1\nexec envuidgid "); outs(user);
- outs(" envdir ./env softlimit -d300000 ");
+ outs(" envdir ./env softlimit -d4500000 ");
outs(auto_home); outs("/bin/tinydns\n");
finish();
perm(0755);