mirror of
https://codeberg.org/guix/guix.git
synced 2025-10-02 02:15:12 +00:00
gnu: Add libtirpc/hurd.
* gnu/packages/onc-rpc.scm (libtirpc/hurd): New variable. * gnu/packages/patches/libtirpc-hurd-client.patch, gnu/packages/patches/libtirpc-hurd.patch: New files. * gnu/local.mk (dist_patch_DATA): Add them.
This commit is contained in:
parent
2e463d6e2c
commit
3dbfab479f
4 changed files with 242 additions and 1 deletions
50
gnu/packages/patches/libtirpc-hurd-client.patch
Normal file
50
gnu/packages/patches/libtirpc-hurd-client.patch
Normal file
|
@ -0,0 +1,50 @@
|
|||
Taken from https://salsa.debian.org/debian/libtirpc/-/raw/master/debian/patches/06-hurd-client-port.diff
|
||||
|
||||
Description: Fix client code for hurd, avoiding malloc overflow
|
||||
When trying to setup a inet connection, it happens the following:
|
||||
- in libtirp, src/clnt_vc.c, clnt_vc_create gets called
|
||||
- when trying to allocate vc_fd_locks, __rpc_dtbsize() is used as size
|
||||
for that array of fd locks
|
||||
- __rpc_dtbsize(), in src/rpc_generic.c, queries using rlimit the
|
||||
maximum (rlim_max) number of file descriptors (RLIMIT_NOFILE):
|
||||
- on Linux, the default is { rlim_cur = 1024, rlim_max = 4096 }
|
||||
- on kFreeBSD, the default is { rlim_cur = 1024, rlim_max = 1024 }
|
||||
- on Hurd, the default is { rlim_cur = 1024, rlim_max = RLIM_INFINITY }
|
||||
meaning that on Hurd the memory allocation fails (as
|
||||
__rpc_dtbsize() * sizeof(int) overflows and is negative)
|
||||
|
||||
Change libtiprc so __rpc_dtbsize falls back on rlim_cur if rlim_max
|
||||
is unlimited.
|
||||
|
||||
This patch fixes the client connection using inet sockets; local unix
|
||||
sockets are not working, for two reasons so far:
|
||||
- getpeername on them gives EOPNOTSUPP
|
||||
- SO_REUSEADDR is not implemented for them
|
||||
Author: Pino Toscano <pino@debian.org>
|
||||
|
||||
Bug-Debian: http://bugs.debian.org/739674
|
||||
Forwarded: no
|
||||
Reviewed-By: Petter Reinholdtsen
|
||||
Last-Update: 2014-03-03
|
||||
|
||||
--- a/src/rpc_generic.c
|
||||
+++ b/src/rpc_generic.c
|
||||
@@ -107,12 +107,17 @@
|
||||
{
|
||||
static int tbsize;
|
||||
struct rlimit rl;
|
||||
+ rlim_t lim;
|
||||
|
||||
if (tbsize) {
|
||||
return (tbsize);
|
||||
}
|
||||
if (getrlimit(RLIMIT_NOFILE, &rl) == 0) {
|
||||
- return (tbsize = (int)rl.rlim_max);
|
||||
+ lim = rl.rlim_max;
|
||||
+ if (lim == RLIM_INFINITY) {
|
||||
+ lim = rl.rlim_cur;
|
||||
+ }
|
||||
+ return (tbsize = (int)lim);
|
||||
}
|
||||
/*
|
||||
* Something wrong. I'll try to save face by returning a
|
Loading…
Add table
Add a link
Reference in a new issue