mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-08 07:56:16 -05:00
3dbfab479f
* 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.
50 lines
1.7 KiB
Diff
50 lines
1.7 KiB
Diff
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
|