Message ID | 1370536046-15125-7-git-send-email-armbru@redhat.com |
---|---|
State | New |
Headers | show |
On 06/06/13 18:27, Markus Armbruster wrote: > Classic endianness bug due to careless dirty coding: assuming reading > a byte from an int variable gets the least significant byte. > > Signed-off-by: Markus Armbruster <armbru@redhat.com> > --- > hw/i386/smbios.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/hw/i386/smbios.c b/hw/i386/smbios.c > index 322f0a0..68bd6d0 100644 > --- a/hw/i386/smbios.c > +++ b/hw/i386/smbios.c > @@ -127,6 +127,7 @@ void smbios_add_field(int type, int offset, const void *data, size_t len) > static void smbios_build_type_0_fields(const char *t) > { > char buf[1024]; > + unsigned char major, minor; > > if (get_param_value(buf, sizeof(buf), "vendor", t)) > smbios_add_field(0, offsetof(struct smbios_type_0, vendor_str), > @@ -139,8 +140,7 @@ static void smbios_build_type_0_fields(const char *t) > bios_release_date_str), > buf, strlen(buf) + 1); > if (get_param_value(buf, sizeof(buf), "release", t)) { > - int major, minor; > - sscanf(buf, "%d.%d", &major, &minor); > + sscanf(buf, "%hhd.%hhd", &major, &minor); > smbios_add_field(0, offsetof(struct smbios_type_0, > system_bios_major_release), > &major, 1); > Strictly speaking these should be %hhu, if it's not much of a bother. Otherwise: Reviewed-by: Laszlo Ersek <lersek@redhat.com> (BTW what was wrong with the definitions being in the narrowest scope? :))
Laszlo Ersek <lersek@redhat.com> writes: > On 06/06/13 18:27, Markus Armbruster wrote: >> Classic endianness bug due to careless dirty coding: assuming reading >> a byte from an int variable gets the least significant byte. >> >> Signed-off-by: Markus Armbruster <armbru@redhat.com> >> --- >> hw/i386/smbios.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/hw/i386/smbios.c b/hw/i386/smbios.c >> index 322f0a0..68bd6d0 100644 >> --- a/hw/i386/smbios.c >> +++ b/hw/i386/smbios.c >> @@ -127,6 +127,7 @@ void smbios_add_field(int type, int offset, const void *data, size_t len) >> static void smbios_build_type_0_fields(const char *t) >> { >> char buf[1024]; >> + unsigned char major, minor; >> >> if (get_param_value(buf, sizeof(buf), "vendor", t)) >> smbios_add_field(0, offsetof(struct smbios_type_0, vendor_str), >> @@ -139,8 +140,7 @@ static void smbios_build_type_0_fields(const char *t) >> bios_release_date_str), >> buf, strlen(buf) + 1); >> if (get_param_value(buf, sizeof(buf), "release", t)) { >> - int major, minor; >> - sscanf(buf, "%d.%d", &major, &minor); >> + sscanf(buf, "%hhd.%hhd", &major, &minor); >> smbios_add_field(0, offsetof(struct smbios_type_0, >> system_bios_major_release), >> &major, 1); >> > > Strictly speaking these should be %hhu, if it's not much of a bother. It's not. > Otherwise: > > Reviewed-by: Laszlo Ersek <lersek@redhat.com> > > (BTW what was wrong with the definitions being in the narrowest scope? :)) I don't like spreading declarations all over the function in C. Not entirely sure why. Perhaps it's just habit. Perhaps it's because declarations don't stand out visually, unlike in some other languages.
diff --git a/hw/i386/smbios.c b/hw/i386/smbios.c index 322f0a0..68bd6d0 100644 --- a/hw/i386/smbios.c +++ b/hw/i386/smbios.c @@ -127,6 +127,7 @@ void smbios_add_field(int type, int offset, const void *data, size_t len) static void smbios_build_type_0_fields(const char *t) { char buf[1024]; + unsigned char major, minor; if (get_param_value(buf, sizeof(buf), "vendor", t)) smbios_add_field(0, offsetof(struct smbios_type_0, vendor_str), @@ -139,8 +140,7 @@ static void smbios_build_type_0_fields(const char *t) bios_release_date_str), buf, strlen(buf) + 1); if (get_param_value(buf, sizeof(buf), "release", t)) { - int major, minor; - sscanf(buf, "%d.%d", &major, &minor); + sscanf(buf, "%hhd.%hhd", &major, &minor); smbios_add_field(0, offsetof(struct smbios_type_0, system_bios_major_release), &major, 1);
Classic endianness bug due to careless dirty coding: assuming reading a byte from an int variable gets the least significant byte. Signed-off-by: Markus Armbruster <armbru@redhat.com> --- hw/i386/smbios.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)