mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
isofs: handle Rock Ridge long-form dates before 1900
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: 5ea45f54c8 ("isofs: fix Y2038 and Y2156 issues in Rock Ridge TF entry")
Signed-off-by: Hungyu Lin <dennylin0707@gmail.com>
Link: https://patch.msgid.link/20261029004902.76944-1-dennylin0707@gmail.com
Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
3f57fc2c49
commit
0cbfc16fe4
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user