dmi: fix date handling in dmi_get_year()
authorTejun Heo <tj@kernel.org>
Sun, 16 Aug 2009 12:01:22 +0000 (21:01 +0900)
committerJeff Garzik <jgarzik@redhat.com>
Wed, 9 Sep 2009 01:17:47 +0000 (21:17 -0400)
Year parsing in dmi_get_year() had the following two bugs.

* "00" is treated as invalid instead of 2000 because zero return from
  simple_strtoul() is treated as error.

* "0N" where N >= 8 is treated as invalid of 200N because the leading
  0 is considered to specify octal.

Fix the above two bugs by using endptr to detect invalid number and
forcing decimal.

Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/firmware/dmi_scan.c

index 24c84ae81527b558434ef9e4942fba0e266f4712..531e621677ce4c3be04829333864f26ff0e8c38d 100644 (file)
@@ -577,6 +577,7 @@ int dmi_get_year(int field)
 {
        int year;
        const char *s = dmi_get_system_info(field);
+       char *e;
 
        if (!s)
                return -1;
@@ -587,8 +588,8 @@ int dmi_get_year(int field)
                return 0;
 
        s += 1;
-       year = simple_strtoul(s, NULL, 0);
-       if (year && year < 100) {       /* 2-digit year */
+       year = simple_strtoul(s, &e, 10);
+       if (s != e && year < 100) {     /* 2-digit year */
                year += 1900;
                if (year < 1996)        /* no dates < spec 1.0 */
                        year += 100;