mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	imsg no longer associates file descriptors with the imsg they were sent with,
work around this for the moment (it is not clear if this is intentional).
This commit is contained in:
		
							
								
								
									
										27
									
								
								proc.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								proc.c
									
									
									
									
									
								
							@@ -55,6 +55,7 @@ struct tmuxpeer {
 | 
				
			|||||||
	struct tmuxproc	*parent;
 | 
						struct tmuxproc	*parent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct imsgbuf	 ibuf;
 | 
						struct imsgbuf	 ibuf;
 | 
				
			||||||
 | 
						int		 lastfd;
 | 
				
			||||||
	struct event	 event;
 | 
						struct event	 event;
 | 
				
			||||||
	uid_t		 uid;
 | 
						uid_t		 uid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -71,7 +72,7 @@ static int	peer_check_version(struct tmuxpeer *, struct imsg *);
 | 
				
			|||||||
static void	proc_update_event(struct tmuxpeer *);
 | 
					static void	proc_update_event(struct tmuxpeer *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
proc_event_cb(__unused int fd, short events, void *arg)
 | 
					proc_event_cb(int fd, short events, void *arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct tmuxpeer	*peer = arg;
 | 
						struct tmuxpeer	*peer = arg;
 | 
				
			||||||
	ssize_t		 n;
 | 
						ssize_t		 n;
 | 
				
			||||||
@@ -89,12 +90,16 @@ proc_event_cb(__unused int fd, short events, void *arg)
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			if (n == 0)
 | 
								if (n == 0)
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			log_debug("peer %p message %d", peer, imsg.hdr.type);
 | 
								fd = imsg_get_fd(&imsg);
 | 
				
			||||||
 | 
								log_debug("peer %p message %d fd %d", peer,
 | 
				
			||||||
 | 
								    imsg.hdr.type, fd);
 | 
				
			||||||
 | 
								if (fd != -1) {
 | 
				
			||||||
 | 
									if (peer->lastfd != -1)
 | 
				
			||||||
 | 
										close(peer->lastfd);
 | 
				
			||||||
 | 
									peer->lastfd = fd;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (peer_check_version(peer, &imsg) != 0) {
 | 
								if (peer_check_version(peer, &imsg) != 0) {
 | 
				
			||||||
				fd = imsg_get_fd(&imsg);
 | 
					 | 
				
			||||||
				if (fd != -1)
 | 
					 | 
				
			||||||
					close(fd);
 | 
					 | 
				
			||||||
				imsg_free(&imsg);
 | 
									imsg_free(&imsg);
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -308,6 +313,7 @@ proc_add_peer(struct tmuxproc *tp, int fd,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	peer = xcalloc(1, sizeof *peer);
 | 
						peer = xcalloc(1, sizeof *peer);
 | 
				
			||||||
	peer->parent = tp;
 | 
						peer->parent = tp;
 | 
				
			||||||
 | 
						peer->lastfd = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	peer->dispatchcb = dispatchcb;
 | 
						peer->dispatchcb = dispatchcb;
 | 
				
			||||||
	peer->arg = arg;
 | 
						peer->arg = arg;
 | 
				
			||||||
@@ -336,6 +342,8 @@ proc_remove_peer(struct tmuxpeer *peer)
 | 
				
			|||||||
	event_del(&peer->event);
 | 
						event_del(&peer->event);
 | 
				
			||||||
	imsgbuf_clear(&peer->ibuf);
 | 
						imsgbuf_clear(&peer->ibuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (peer->lastfd != -1)
 | 
				
			||||||
 | 
							close(peer->lastfd);
 | 
				
			||||||
	close(peer->ibuf.fd);
 | 
						close(peer->ibuf.fd);
 | 
				
			||||||
	free(peer);
 | 
						free(peer);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -387,3 +395,12 @@ proc_get_peer_uid(struct tmuxpeer *peer)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	return (peer->uid);
 | 
						return (peer->uid);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					proc_get_last_fd(struct tmuxpeer *peer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int	fd = peer->lastfd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						peer->lastfd = -1;
 | 
				
			||||||
 | 
						return (fd);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3559,13 +3559,13 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg)
 | 
				
			|||||||
	case MSG_IDENTIFY_STDIN:
 | 
						case MSG_IDENTIFY_STDIN:
 | 
				
			||||||
		if (datalen != 0)
 | 
							if (datalen != 0)
 | 
				
			||||||
			fatalx("bad MSG_IDENTIFY_STDIN size");
 | 
								fatalx("bad MSG_IDENTIFY_STDIN size");
 | 
				
			||||||
		c->fd = imsg_get_fd(imsg);
 | 
							c->fd = proc_get_last_fd(c->peer);
 | 
				
			||||||
		log_debug("client %p IDENTIFY_STDIN %d", c, c->fd);
 | 
							log_debug("client %p IDENTIFY_STDIN %d", c, c->fd);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case MSG_IDENTIFY_STDOUT:
 | 
						case MSG_IDENTIFY_STDOUT:
 | 
				
			||||||
		if (datalen != 0)
 | 
							if (datalen != 0)
 | 
				
			||||||
			fatalx("bad MSG_IDENTIFY_STDOUT size");
 | 
								fatalx("bad MSG_IDENTIFY_STDOUT size");
 | 
				
			||||||
		c->out_fd = imsg_get_fd(imsg);
 | 
							c->out_fd = proc_get_last_fd(c->peer);
 | 
				
			||||||
		log_debug("client %p IDENTIFY_STDOUT %d", c, c->out_fd);
 | 
							log_debug("client %p IDENTIFY_STDOUT %d", c, c->out_fd);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case MSG_IDENTIFY_ENVIRON:
 | 
						case MSG_IDENTIFY_ENVIRON:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -2225,6 +2225,7 @@ void	proc_flush_peer(struct tmuxpeer *);
 | 
				
			|||||||
void	proc_toggle_log(struct tmuxproc *);
 | 
					void	proc_toggle_log(struct tmuxproc *);
 | 
				
			||||||
pid_t	proc_fork_and_daemon(int *);
 | 
					pid_t	proc_fork_and_daemon(int *);
 | 
				
			||||||
uid_t	proc_get_peer_uid(struct tmuxpeer *);
 | 
					uid_t	proc_get_peer_uid(struct tmuxpeer *);
 | 
				
			||||||
 | 
					int	proc_get_last_fd(struct tmuxpeer *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* cfg.c */
 | 
					/* cfg.c */
 | 
				
			||||||
extern int cfg_finished;
 | 
					extern int cfg_finished;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user