* 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
 |