udev: fix another strict aliasing issue

This commit is contained in:
Shawn Paul Landden 2014-12-23 15:04:37 -08:00 committed by Zbigniew Jędrzejewski-Szmek
parent bf3dd6b1a7
commit 6024a6e302

View file

@ -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);