Thread (1 message) 1 message, 1 author, 2019-06-19

Re: [PATCH] wrapper: avoid UB in macOS

From: Junio C Hamano <hidden>
Date: 2019-06-19 14:40:35

Carlo Marcelo Arenas Belón  [off-list ref] writes:
0620b39b3b ("compat: add a mkstemps() compatibility function", 2009-05-31)
included a function based on code from libiberty which would result in
undefined behaviour in platforms where timeval's tv_usec is a 32-bit signed
type as shown by:

wrapper.c:505:31: runtime error: left shift of 594546 by 16 places cannot be represented in type '__darwin_suseconds_t' (aka 'int')
I had to scratch my head wondering what an UB was (spell it out as
"undefined behaviour" if that is what you wanted to say).
interestingly the version of this code from gcc never had this bug and the
code had a cast that would had prevented the issue (at least in 64-bit
platforms) but was misapplied.

change the cast to uint64_t so it also works in 32-bit platforms.
Yup, regardless of the platform, that's the "right" type to use,
certainly more correct than "size_t", as value is declared to be u64
in this function.
 	gettimeofday(&tv, NULL);
-	value = ((size_t)(tv.tv_usec << 16)) ^ tv.tv_sec ^ getpid();
+	value = ((uint64_t)tv.tv_usec << 16) ^ tv.tv_sec ^ getpid();
 	filename_template = &pattern[len - 6 - suffix_len];
 	for (count = 0; count < TMP_MAX; ++count) {
 		uint64_t v = value;
Thanks.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help