[issue35191] socket.setblocking(x) treats multiples of 2**32 as False

2018-11-08 Thread Alexey Izbyshev


Change by Alexey Izbyshev :


--
keywords: +patch
pull_requests: +9695
stage:  -> patch review

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue35191] socket.setblocking(x) treats multiples of 2**32 as False

2018-11-08 Thread Alexey Izbyshev


New submission from Alexey Izbyshev :

UBSAN with -fsanitize=implicit-integer-truncation reported a suspicious case:

testSetBlocking_overflow (test.test_socket.NonBlockingTCPTests) ... 
/scratch2/izbyshev/cpython/Modules/socketmodule.c:2688:33: runtime error: 
implicit conversion from type 'long' of value 4294967296 (64-bit, signed) to 
type 'int' changed the value to 0 (32-bit, signed)

It turned out that sock_setblocking() converts its (logically boolean) argument 
to long, but then passes it to internal_setblocking() which accepts int 
(https://github.com/python/cpython/blob/fd512d76456b65c529a5bc58d8cfe73e4a10de7a/Modules/socketmodule.c#L2688).
 This results in unexpected truncation on platforms with 64-bit long.

testSetBlocking_overflow() which is supposed to check this doesn't work because 
it only checks socket timeout which is updated correctly. However, the actual 
state of socket descriptor is changed to the opposite value (non-blocking) in 
this case.

--
components: Extension Modules
messages: 329478
nosy: izbyshev, serhiy.storchaka, vstinner
priority: normal
severity: normal
status: open
title: socket.setblocking(x) treats multiples of 2**32 as False
type: behavior
versions: Python 2.7, Python 3.6, Python 3.7, Python 3.8

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com