Re: [PATCH] isofs: handle Rock Ridge long-form dates before 1900
From: Jan Kara
Date: Wed Nov 04 2026 - 07:28:19 EST
On Thu 29-10-26 00:49:02, Hungyu Lin wrote:
> iso_date() stores the year relative to 1900 and rejects negative values.
> Rock Ridge LONG_FORM timestamps encode calendar years from 1 to 9999,
> so valid years before 1900 are returned as seconds since the Unix epoch
> equal to zero instead of their recorded dates. For example, an 1899
> timestamp on an image produced by xorriso is reported as 1970 by stat,
> and cp -p preserves that incorrect time.
>
> Use the calendar year for both timestamp formats and pass it directly
> to mktime64(). Keep the epoch fallback for year zero, while allowing
> valid long-form years before 1900. Short-form dates are unchanged.
>
> Fixes: 5ea45f54c8d6 ("isofs: fix Y2038 and Y2156 issues in Rock Ridge TF entry")
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Hungyu Lin <dennylin0707@xxxxxxxxx>
Thanks for the fix. I've added it to my tree. I've dropped the CC stable
since this really isn't a serious issue...
Honza
> ---
> fs/isofs/util.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/fs/isofs/util.c b/fs/isofs/util.c
> index 42f479da0b28..6f9a90e58a89 100644
> --- a/fs/isofs/util.c
> +++ b/fs/isofs/util.c
> @@ -25,7 +25,7 @@ struct timespec64 iso_date(u8 *p, int flags)
> year = (p[0] - '0') * 1000 +
> (p[1] - '0') * 100 +
> (p[2] - '0') * 10 +
> - (p[3] - '0') - 1900;
> + (p[3] - '0');
> month = ((p[4] - '0') * 10 + (p[5] - '0'));
> day = ((p[6] - '0') * 10 + (p[7] - '0'));
> hour = ((p[8] - '0') * 10 + (p[9] - '0'));
> @@ -34,7 +34,7 @@ struct timespec64 iso_date(u8 *p, int flags)
> ts.tv_nsec = ((p[14] - '0') * 10 + (p[15] - '0')) * 10000000;
> tz = p[16];
> } else {
> - year = p[0];
> + year = p[0] + 1900;
> month = p[1];
> day = p[2];
> hour = p[3];
> @@ -45,10 +45,10 @@ struct timespec64 iso_date(u8 *p, int flags)
> tz = flags & ISO_DATE_HIGH_SIERRA ? 0 : p[6];
> }
>
> - if (year < 0) {
> + if (year < 1) {
> ts.tv_sec = 0;
> } else {
> - ts.tv_sec = mktime64(year+1900, month, day, hour, minute, second);
> + ts.tv_sec = mktime64(year, month, day, hour, minute, second);
>
> /* sign extend */
> if (tz & 0x80)
> --
> 2.43.0
>
--
Jan Kara <jack@xxxxxxxx>
SUSE Labs, CR