mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	Input: evdev - do not block waiting for an event if fd is nonblock
If there is a full packet in the buffer, and we overflow that buffer right after checking for that condition, it would have been possible for us to block indefinitely (rather, until the next full packet) even if the file was marked as O_NONBLOCK. Cc: Jeff Brown <jeffbrown@android.com> Signed-off-by: Dima Zavin <dima@android.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
		
							parent
							
								
									e90f869cae
								
							
						
					
					
						commit
						509f87c5f5
					
				
					 1 changed files with 7 additions and 8 deletions
				
			
		| 
						 | 
					@ -391,14 +391,13 @@ static ssize_t evdev_read(struct file *file, char __user *buffer,
 | 
				
			||||||
	if (count < input_event_size())
 | 
						if (count < input_event_size())
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (client->packet_head == client->tail && evdev->exist &&
 | 
						if (!(file->f_flags & O_NONBLOCK)) {
 | 
				
			||||||
	    (file->f_flags & O_NONBLOCK))
 | 
							retval = wait_event_interruptible(evdev->wait,
 | 
				
			||||||
		return -EAGAIN;
 | 
									client->packet_head != client->tail ||
 | 
				
			||||||
 | 
									!evdev->exist);
 | 
				
			||||||
	retval = wait_event_interruptible(evdev->wait,
 | 
							if (retval)
 | 
				
			||||||
		client->packet_head != client->tail || !evdev->exist);
 | 
								return retval;
 | 
				
			||||||
	if (retval)
 | 
						}
 | 
				
			||||||
		return retval;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!evdev->exist)
 | 
						if (!evdev->exist)
 | 
				
			||||||
		return -ENODEV;
 | 
							return -ENODEV;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue