fs: Use 64-bit type for filesystem timestamp

Some filesystems nowadays use 64-bit types for timestamps. So, update
grub_dirhook_info struct to use an grub_int64_t type to store mtime.
This also updates the grub_unixtime2datetime() function to receive
a 64-bit timestamp argument and do 64-bit-safe divisions.

All the remaining conversion from 32-bit to 64-bit should be safe, as
32-bit to 64-bit attributions will be implicitly casted. The most
critical part in the 32-bit to 64-bit conversion is in the function
grub_unixtime2datetime() where it needs to deal with the 64-bit type.
So, for that, the grub_divmod64() helper has been used.

These changes enables the GRUB to support dates beyond y2038.

Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Carlos Maiolino authored and Daniel Kiper committed 2021-06-01 17:19:13 +02:00
1 parent af54062b54
commit 81f1962393
16 files changed
+32 -25

No files matched your search

+2 -2
View File
@@ -48,11 +48,11 @@ grub_err_t grub_set_datetime (struct grub_datetime *datetime);
int grub_get_weekday (struct grub_datetime *datetime);
const char *grub_get_weekday_name (struct grub_datetime *datetime);
void grub_unixtime2datetime (grub_int32_t nix,
void grub_unixtime2datetime (grub_int64_t nix,
struct grub_datetime *datetime);
static inline int
grub_datetime2unixtime (const struct grub_datetime *datetime, grub_int32_t *nix)
grub_datetime2unixtime (const struct grub_datetime *datetime, grub_int64_t *nix)
{
grub_int32_t ret;
int y4, ay;
+2 -2
View File
@@ -39,7 +39,7 @@ struct grub_dirhook_info
unsigned mtimeset:1;
unsigned case_insensitive:1;
unsigned inodeset:1;
grub_int32_t mtime;
grub_int64_t mtime;
grub_uint64_t inode;
};
@@ -81,7 +81,7 @@ struct grub_fs
grub_err_t (*fs_uuid) (grub_device_t device, char **uuid);
/* Get writing time of filesystem. */
grub_err_t (*fs_mtime) (grub_device_t device, grub_int32_t *timebuf);
grub_err_t (*fs_mtime) (grub_device_t device, grub_int64_t *timebuf);
#ifdef GRUB_UTIL
/* Determine sectors available for embedding. */