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.

Changed files
+35 -2
nixos
tests
pkgs
tools
networking
+15 -1
nixos/tests/tinydns.nix
···
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
+
"""
+
)
'';
})
+8 -1
pkgs/tools/networking/djbdns/default.nix
···
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
+12
pkgs/tools/networking/djbdns/softlimit.patch
···
+
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);