From 6024a6e302bad6bcf073fa84a41a6123305dc845 Mon Sep 17 00:00:00 2001 From: Shawn Paul Landden Date: Tue, 23 Dec 2014 15:04:37 -0800 Subject: [PATCH] udev: fix another strict aliasing issue --- src/udev/ata_id/ata_id.c | 62 +++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/src/udev/ata_id/ata_id.c b/src/udev/ata_id/ata_id.c index 89628c929..fc13819dd 100644 --- a/src/udev/ata_id/ata_id.c +++ b/src/udev/ata_id/ata_id.c @@ -409,7 +409,11 @@ int main(int argc, char *argv[]) { struct udev *udev; struct hd_driveid id; - uint8_t identify[512]; + union { + uint8_t byte[512]; + uint16_t wyde[256]; + uint64_t octa[64]; + } identify; uint16_t *identify_words; char model[41]; char model_enc[256]; @@ -467,30 +471,30 @@ int main(int argc, char *argv[]) goto exit; } - if (disk_identify(udev, fd, identify, &is_packet_device) == 0) { + if (disk_identify(udev, fd, identify.byte, &is_packet_device) == 0) { /* * fix up only the fields from the IDENTIFY data that we are going to * use and copy it into the hd_driveid struct for convenience */ - disk_identify_fixup_string(identify, 10, 20); /* serial */ - disk_identify_fixup_string(identify, 23, 8); /* fwrev */ - disk_identify_fixup_string(identify, 27, 40); /* model */ - disk_identify_fixup_uint16(identify, 0); /* configuration */ - disk_identify_fixup_uint16(identify, 75); /* queue depth */ - disk_identify_fixup_uint16(identify, 75); /* SATA capabilities */ - disk_identify_fixup_uint16(identify, 82); /* command set supported */ - disk_identify_fixup_uint16(identify, 83); /* command set supported */ - disk_identify_fixup_uint16(identify, 84); /* command set supported */ - disk_identify_fixup_uint16(identify, 85); /* command set supported */ - disk_identify_fixup_uint16(identify, 86); /* command set supported */ - disk_identify_fixup_uint16(identify, 87); /* command set supported */ - disk_identify_fixup_uint16(identify, 89); /* time required for SECURITY ERASE UNIT */ - disk_identify_fixup_uint16(identify, 90); /* time required for enhanced SECURITY ERASE UNIT */ - disk_identify_fixup_uint16(identify, 91); /* current APM values */ - disk_identify_fixup_uint16(identify, 94); /* current AAM value */ - disk_identify_fixup_uint16(identify, 128); /* device lock function */ - disk_identify_fixup_uint16(identify, 217); /* nominal media rotation rate */ - memcpy(&id, identify, sizeof id); + disk_identify_fixup_string(identify.byte, 10, 20); /* serial */ + disk_identify_fixup_string(identify.byte, 23, 8); /* fwrev */ + disk_identify_fixup_string(identify.byte, 27, 40); /* model */ + disk_identify_fixup_uint16(identify.byte, 0); /* configuration */ + disk_identify_fixup_uint16(identify.byte, 75); /* queue depth */ + disk_identify_fixup_uint16(identify.byte, 75); /* SATA capabilities */ + disk_identify_fixup_uint16(identify.byte, 82); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 83); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 84); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 85); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 86); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 87); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 89); /* time required for SECURITY ERASE UNIT */ + disk_identify_fixup_uint16(identify.byte, 90); /* time required for enhanced SECURITY ERASE UNIT */ + disk_identify_fixup_uint16(identify.byte, 91); /* current APM values */ + disk_identify_fixup_uint16(identify.byte, 94); /* current AAM value */ + disk_identify_fixup_uint16(identify.byte, 128); /* device lock function */ + disk_identify_fixup_uint16(identify.byte, 217); /* nominal media rotation rate */ + memcpy(&id, identify.byte, sizeof id); } else { /* If this fails, then try HDIO_GET_IDENTITY */ if (ioctl(fd, HDIO_GET_IDENTITY, &id) != 0) { @@ -499,7 +503,7 @@ int main(int argc, char *argv[]) goto close; } } - identify_words = (uint16_t *) identify; + identify_words = &identify.wyde; memcpy (model, id.model, 40); model[40] = '\0'; @@ -613,7 +617,7 @@ int main(int argc, char *argv[]) * the device does not claim compliance with the Serial ATA specification and words * 76 through 79 are not valid and shall be ignored. */ - word = *((uint16_t *) identify + 76); + word = identify_words[76]; if (word != 0x0000 && word != 0xffff) { printf("ID_ATA_SATA=1\n"); /* @@ -630,7 +634,7 @@ int main(int argc, char *argv[]) } /* Word 217 indicates the nominal media rotation rate of the device */ - word = *((uint16_t *) identify + 217); + word = identify_words[217]; if (word != 0x0000) { if (word == 0x0001) { printf ("ID_ATA_ROTATION_RATE_RPM=0\n"); /* non-rotating e.g. SSD */ @@ -644,17 +648,11 @@ int main(int argc, char *argv[]) * format. Word 108 bits (15:12) shall contain 5h, indicating that the naming authority is IEEE. * All other values are reserved. */ - word = *((uint16_t *) identify + 108); + word = identify_words[108]; if ((word & 0xf000) == 0x5000) { uint64_t wwwn; - wwwn = *((uint16_t *) identify + 108); - wwwn <<= 16; - wwwn |= *((uint16_t *) identify + 109); - wwwn <<= 16; - wwwn |= *((uint16_t *) identify + 110); - wwwn <<= 16; - wwwn |= *((uint16_t *) identify + 111); + wwwn = identify.octa[108/4]; printf("ID_WWN=0x%llx\n", (unsigned long long int) wwwn); /* ATA devices have no vendor extension */ printf("ID_WWN_WITH_EXTENSION=0x%llx\n", (unsigned long long int) wwwn); -- 2.30.2