diff options
author | Oscar Forner Martinez <oscar.forner.martinez@gmail.com> | 2015-01-06 19:54:19 -0500 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2015-01-07 03:51:49 -0500 |
commit | e4a93be6cb281fb3dbbd41b22aee02cb0e551ba8 (patch) | |
tree | b0428e113fdd21fb24504807a6de83c6971bdc25 | |
parent | 6744e90b0fa1fc6a908fa26935a5ed9e63413063 (diff) |
isofs: Fix bug in the way to check if the year is a leap year
Changed the whole algorithm for a call to mktime64 that takes
care of all that details.
Signed-off-by: Oscar Forner Martinez <oscar.forner.martinez@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r-- | fs/isofs/util.c | 18 |
1 files changed, 4 insertions, 14 deletions
diff --git a/fs/isofs/util.c b/fs/isofs/util.c index 01e1ee7a998b..005a15cfd30a 100644 --- a/fs/isofs/util.c +++ b/fs/isofs/util.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/fs/isofs/util.c | 2 | * linux/fs/isofs/util.c |
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <linux/time.h> | ||
5 | #include "isofs.h" | 6 | #include "isofs.h" |
6 | 7 | ||
7 | /* | 8 | /* |
@@ -17,9 +18,9 @@ | |||
17 | int iso_date(char * p, int flag) | 18 | int iso_date(char * p, int flag) |
18 | { | 19 | { |
19 | int year, month, day, hour, minute, second, tz; | 20 | int year, month, day, hour, minute, second, tz; |
20 | int crtime, days, i; | 21 | int crtime; |
21 | 22 | ||
22 | year = p[0] - 70; | 23 | year = p[0]; |
23 | month = p[1]; | 24 | month = p[1]; |
24 | day = p[2]; | 25 | day = p[2]; |
25 | hour = p[3]; | 26 | hour = p[3]; |
@@ -31,18 +32,7 @@ int iso_date(char * p, int flag) | |||
31 | if (year < 0) { | 32 | if (year < 0) { |
32 | crtime = 0; | 33 | crtime = 0; |
33 | } else { | 34 | } else { |
34 | int monlen[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; | 35 | crtime = mktime64(year+1900, month, day, hour, minute, second); |
35 | |||
36 | days = year * 365; | ||
37 | if (year > 2) | ||
38 | days += (year+1) / 4; | ||
39 | for (i = 1; i < month; i++) | ||
40 | days += monlen[i-1]; | ||
41 | if (((year+2) % 4) == 0 && month > 2) | ||
42 | days++; | ||
43 | days += day - 1; | ||
44 | crtime = ((((days * 24) + hour) * 60 + minute) * 60) | ||
45 | + second; | ||
46 | 36 | ||
47 | /* sign extend */ | 37 | /* sign extend */ |
48 | if (tz & 0x80) | 38 | if (tz & 0x80) |