mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	Issue #28471: Fix crash (GIL state related) in socket.setblocking
This commit is contained in:
		
							parent
							
								
									33bb64fb30
								
							
						
					
					
						commit
						fa22b29960
					
				
					 3 changed files with 31 additions and 9 deletions
				
			
		|  | @ -4552,6 +4552,18 @@ def testExceptionTree(self): | |||
|         self.assertTrue(issubclass(socket.gaierror, OSError)) | ||||
|         self.assertTrue(issubclass(socket.timeout, OSError)) | ||||
| 
 | ||||
|     def test_setblocking_invalidfd(self): | ||||
|         # Regression test for issue #28471 | ||||
| 
 | ||||
|         sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) | ||||
|         sock = socket.socket( | ||||
|             socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno()) | ||||
|         sock0.close() | ||||
| 
 | ||||
|         with self.assertRaises(OSError): | ||||
|             sock.setblocking(False) | ||||
| 
 | ||||
| 
 | ||||
| @unittest.skipUnless(sys.platform == 'linux', 'Linux specific test') | ||||
| class TestLinuxAbstractNamespace(unittest.TestCase): | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,6 +13,10 @@ Core and Builtins | |||
| - Issue #23782: Fixed possible memory leak in _PyTraceback_Add() and exception | ||||
|   loss in PyTraceBack_Here(). | ||||
| 
 | ||||
| - Issue #28471: Fix "Python memory allocator called without holding the GIL" | ||||
|   crash in socket.setblocking. | ||||
| 
 | ||||
| 
 | ||||
| Library | ||||
| ------- | ||||
| 
 | ||||
|  |  | |||
|  | @ -622,6 +622,7 @@ set_gaierror(int error) | |||
| static int | ||||
| internal_setblocking(PySocketSockObject *s, int block) | ||||
| { | ||||
|     int result = -1; | ||||
| #ifdef MS_WINDOWS | ||||
|     u_long arg; | ||||
| #endif | ||||
|  | @ -641,34 +642,39 @@ internal_setblocking(PySocketSockObject *s, int block) | |||
| #if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)) | ||||
|     block = !block; | ||||
|     if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1) | ||||
|         goto error; | ||||
|         goto done; | ||||
| #else | ||||
|     delay_flag = fcntl(s->sock_fd, F_GETFL, 0); | ||||
|     if (delay_flag == -1) | ||||
|         goto error; | ||||
|         goto done; | ||||
|     if (block) | ||||
|         new_delay_flag = delay_flag & (~O_NONBLOCK); | ||||
|     else | ||||
|         new_delay_flag = delay_flag | O_NONBLOCK; | ||||
|     if (new_delay_flag != delay_flag) | ||||
|         if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1) | ||||
|             goto error; | ||||
|             goto done; | ||||
| #endif | ||||
| #else /* MS_WINDOWS */ | ||||
|     arg = !block; | ||||
|     if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0) | ||||
|         goto error; | ||||
|         goto done; | ||||
| #endif /* MS_WINDOWS */ | ||||
| 
 | ||||
|     result = 0; | ||||
| 
 | ||||
|   done: | ||||
|     Py_END_ALLOW_THREADS | ||||
| 
 | ||||
|     return 0; | ||||
|   error: | ||||
|     if (result) { | ||||
| #ifndef MS_WINDOWS | ||||
|         PyErr_SetFromErrno(PyExc_OSError); | ||||
| #else | ||||
|         PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError()); | ||||
| #endif | ||||
|     return -1; | ||||
|     } | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Yury Selivanov
						Yury Selivanov