nix-daemon: Don't splice with len=SIZE_MAX
Currently, 'nix-daemon --stdio' is always failing for me, due to the splice call always failing with (on a 32-bit host): splice(0, NULL, 3, NULL, 4294967295, SPLICE_F_MOVE) = -1 EINVAL (Invalid argument) With a bit of ftracing (and luck) the problem seems to be that splice() always fails with EINVAL if the len cast as ssize_t is negative: http://lxr.free-electrons.com/source/fs/read_write.c?v=4.4#L384 So use SSIZE_MAX instead of SIZE_MAX.
This commit is contained in:
		
							parent
							
								
									4724903c78
								
							
						
					
					
						commit
						649a81bcd6
					
				
					 1 changed files with 3 additions and 2 deletions
				
			
		|  | @ -23,6 +23,7 @@ | |||
| #include <pwd.h> | ||||
| #include <grp.h> | ||||
| #include <fcntl.h> | ||||
| #include <limits.h> | ||||
| 
 | ||||
| #if __APPLE__ || __FreeBSD__ | ||||
| #include <sys/ucred.h> | ||||
|  | @ -967,14 +968,14 @@ int main(int argc, char * * argv) | |||
|                     if (select(nfds, &fds, nullptr, nullptr, nullptr) == -1) | ||||
|                         throw SysError("waiting for data from client or server"); | ||||
|                     if (FD_ISSET(s, &fds)) { | ||||
|                         auto res = splice(s, nullptr, STDOUT_FILENO, nullptr, SIZE_MAX, SPLICE_F_MOVE); | ||||
|                         auto res = splice(s, nullptr, STDOUT_FILENO, nullptr, SSIZE_MAX, SPLICE_F_MOVE); | ||||
|                         if (res == -1) | ||||
|                             throw SysError("splicing data from daemon socket to stdout"); | ||||
|                         else if (res == 0) | ||||
|                             throw EndOfFile("unexpected EOF from daemon socket"); | ||||
|                     } | ||||
|                     if (FD_ISSET(STDIN_FILENO, &fds)) { | ||||
|                         auto res = splice(STDIN_FILENO, nullptr, s, nullptr, SIZE_MAX, SPLICE_F_MOVE); | ||||
|                         auto res = splice(STDIN_FILENO, nullptr, s, nullptr, SSIZE_MAX, SPLICE_F_MOVE); | ||||
|                         if (res == -1) | ||||
|                             throw SysError("splicing data from stdin to daemon socket"); | ||||
|                         else if (res == 0) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue