On 1 October 2015 at 19:55, Dirk Hohndel <[email protected]> wrote: > On Thu, Oct 01, 2015 at 06:32:15PM +0300, Lubomir I. Ivanov wrote: >> after seeing a warning about strict-aliasing in: >> divesite.c: create_divesite_uuid() >> >> i think i found a potential problem. the cast at the end of the >> function can have different results on big/little endian machines, >> while i'm pretty sure we want the same result on both. >> >> if the first 4 bytes of the SHA1 are: >> 01 02 03 04 >> >> we want them serialized in the XML always as: >> <site uuid=''01020304" .../> >> >> on big endian machines that will be the result, while on little endian >> the result would be: >> <site uuid=''04030201" .../> > > Since most systems are little endian these days (at least most systems > people run Subsurface on) I think we should standardize on the little > endian order. > > So in order to keep things unchanged for everyone on a PC, can you send a > modified patch that forces little endian order? >
sure thing! :-) here is the updated patch. lubomir --
From 952241fe2e3070bbd707b2826bbbdaa83312b010 Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" <[email protected]> Date: Thu, 1 Oct 2015 20:13:20 +0300 Subject: [PATCH 2/2] divesite.c: preserve byte-order in create_divesite_uuid() Casting as *(uint32_t *)hash can have a different meaning between little and big endian machines, yet the divesite input properties can be the same. To preserve the byte order from the generated SHA1 we form the uint32_t as big-endian ignoring the machine endianness. From there on, the uint32_t can be serialized to XML exactly the same on all machines. Signed-off-by: Lubomir I. Ivanov <[email protected]> --- divesite.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/divesite.c b/divesite.c index e9eed2a..a96f568 100644 --- a/divesite.c +++ b/divesite.c @@ -196,7 +196,7 @@ uint32_t create_divesite_uuid(const char *name, timestamp_t divetime) SHA1_Update(&ctx, name, strlen(name)); SHA1_Final(hash, &ctx); // now return the first 32 of the 160 bit hash - return *(uint32_t *)hash; + return hash[0] | hash[1] << 8 | hash[2] << 16 | hash[3] << 24; } /* allocate a new site and add it to the table */ -- 1.7.11.msysgit.0
_______________________________________________ subsurface mailing list [email protected] http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface
