efi_loader: check time in SetTime()
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Fri, 31 May 2019 05:35:19 +0000 (07:35 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Fri, 31 May 2019 21:27:12 +0000 (23:27 +0200)
The UEFI spec prescribes that we check that the timestamp passed to
SetTime() is checked for validity.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_runtime.c

index 058b40a88768dc394dac1fd933ab8abf6d27902a..2082d1304fea7fb718d741ed8b7e2d40f691df2f 100644 (file)
@@ -214,6 +214,30 @@ out:
 #endif
 }
 
+#ifdef CONFIG_DM_RTC
+
+/**
+ * efi_validate_time() - checks if timestamp is valid
+ *
+ * @time:      timestamp to validate
+ * Returns:    0 if timestamp is valid, 1 otherwise
+ */
+static int efi_validate_time(struct efi_time *time)
+{
+       return (!time ||
+               time->year < 1900 || time->year > 9999 ||
+               !time->month || time->month > 12 || !time->day ||
+               time->day > rtc_month_days(time->month - 1, time->year) ||
+               time->hour > 23 || time->minute > 59 || time->second > 59 ||
+               time->nanosecond > 999999999 ||
+               time->daylight &
+               ~(EFI_TIME_IN_DAYLIGHT | EFI_TIME_ADJUST_DAYLIGHT) ||
+               ((time->timezone < -1440 || time->timezone > 1440) &&
+               time->timezone != EFI_UNSPECIFIED_TIMEZONE));
+}
+
+#endif
+
 /**
  * efi_set_time_boottime() - set current time
  *
@@ -235,7 +259,7 @@ static efi_status_t EFIAPI efi_set_time_boottime(struct efi_time *time)
 
        EFI_ENTRY("%p", time);
 
-       if (!time) {
+       if (efi_validate_time(time)) {
                ret = EFI_INVALID_PARAMETER;
                goto out;
        }