41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 0fcdbacd8b06c24f5761a0cf9cb0c43cad05c19b Mon Sep 17 00:00:00 2001
 | |
| From: Thomas Watson <twatson52@icloud.com>
 | |
| Date: Mon, 26 Feb 2024 19:51:12 -0600
 | |
| Subject: [PATCH] fs/fcntl: accept more values as F_DUPFD_CLOEXEC args
 | |
| 
 | |
| libwebrtc doesn't pass anything as the arg to this function so the
 | |
| minimum fd ends up as random garbage. If it's bigger than the maximum
 | |
| fd, which is likely, then the duplication fails, and libwebrtc breaks.
 | |
| 
 | |
| The previous patch (081abc5fa701738699705a6c0a41c824df77cb37) rejects
 | |
| args >= 1024 (the default soft max fd) and instead subtitutes a minimum
 | |
| fd of 0 to allow such requests to succeed.
 | |
| 
 | |
| However, gnulib's test suite can pass the following values and expects
 | |
| them to fail; this patch prevents those from succeeding:
 | |
| * -1 (hard-coded)
 | |
| * 1024 (`ulimit -n` value by default)
 | |
| * 1048576 (`ulimit -n` value in Nix build sandbox)
 | |
| 
 | |
| Hopefully the garbage values libwebrtc passes do not match very often.
 | |
| ---
 | |
|  fs/fcntl.c | 2 +-
 | |
|  1 file changed, 1 insertion(+), 1 deletion(-)
 | |
| 
 | |
| diff --git a/fs/fcntl.c b/fs/fcntl.c
 | |
| index f18f87419445..65a6861476ec 100644
 | |
| --- a/fs/fcntl.c
 | |
| +++ b/fs/fcntl.c
 | |
| @@ -326,7 +326,7 @@ static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
 | |
|  		err = f_dupfd(argi, filp, 0);
 | |
|  		break;
 | |
|  	case F_DUPFD_CLOEXEC:
 | |
| -		if (arg >= 1024)
 | |
| +		if ((arg > 1024) && (argi != 1048576) && (argi != -1))
 | |
|  			argi = 0; /* Lol libwebrtc */
 | |
|  		err = f_dupfd(argi, filp, O_CLOEXEC);
 | |
|  		break;
 | |
| -- 
 | |
| 2.43.0
 | |
| 
 | 
