]> granicus.if.org Git - libevent/commitdiff
Avoid possible SEGVs in select() (in unit tests)
authorPhilip Prindeville <philipp@redfish-solutions.com>
Wed, 28 Mar 2018 14:25:28 +0000 (08:25 -0600)
committerAzat Khuzhin <a3at.mail@gmail.com>
Thu, 29 Mar 2018 22:24:25 +0000 (01:24 +0300)
Per the POSIX definition of select():

http://pubs.opengroup.org/onlinepubs/009696699/functions/pselect.html

"Upon successful completion, the select() function may modify the object
pointed to by the timout argument."

If "struct timeval" pointer is a "static const", it could potentially
be allocated in a RO text segment.  The kernel would then try to copy
back the modified value (with the time remaining) into a read-only
address and SEGV.

Signed-off-by: Philip Prindeville <philipp@redfish-solutions.com>
Closes: #614
evutil_time.c

index 00fd5fb4f77b9af2bc7a2407d91ab4e80771df01..d658b30eda9786ce231857b6f171c2620ef1946c 100644 (file)
@@ -141,7 +141,10 @@ evutil_usleep_(const struct timeval *tv)
        sleep(tv->tv_sec);
        usleep(tv->tv_usec);
 #else
-       select(0, NULL, NULL, NULL, tv);
+       {
+               struct timeval tv2 = *tv;
+               select(0, NULL, NULL, NULL, &tv2);
+       }
 #endif
 }