misc: get rid of an unaligned read
authornotaz <notasas@gmail.com>
Sun, 28 Aug 2022 20:51:40 +0000 (23:51 +0300)
committernotaz <notasas@gmail.com>
Sun, 28 Aug 2022 20:51:40 +0000 (23:51 +0300)
96c6ec7055ecef55b3dd221c86b796512bf52107 introduced an unaligned read
which is undefined behavior in C, even if most hardware allows it
(but some very old ARMs don't). Perf. doesn't matter here so read
byte-by-byte.

notaz/pcsx_rearmed#261

libpcsxcore/misc.c

index 7aa4fef..c06a8a4 100644 (file)
@@ -55,10 +55,11 @@ struct iso_directory_record {
        char name                       [1];
 };
 
-void mmssdd( char *b, char *p )
+static void mmssdd( char *b, char *p )
 {
        int m, s, d;
-       int block = SWAP32(*((uint32_t*) b));
+       unsigned char *ub = (void *)b;
+       int block = (ub[3] << 24) | (ub[2] << 16) | (ub[1] << 8) | ub[0];
 
        block += 150;
        m = block / 4500;                       // minutes