mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
X.509: Fix leap year handling again
There are still a couple of minor issues in the X.509 leap year handling: (1) To avoid doing a modulus-by-400 in addition to a modulus-by-100 when determining whether the year is a leap year or not, I divided the year by 100 after doing the modulus-by-100, thereby letting the compiler do one instruction for both, and then did a modulus-by-4. Unfortunately, I then passed the now-modified year value to mktime64() to construct a time value. Since this isn't a fast path and since mktime64() does a bunch of divisions, just condense down to "% 400". It's also easier to read. (2) The default month length for any February where the year doesn't divide by four exactly is obtained from the month_length[] array where the value is 29, not 28. This is fixed by altering the table. Reported-by: Rudolf Polzer <rpolzer@google.com> Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: David Woodhouse <David.Woodhouse@intel.com> Acked-by: Arnd Bergmann <arnd@arndb.de> cc: stable@vger.kernel.org
This commit is contained in:
parent
06aae59242
commit
ac4cbedfdf
@ -471,7 +471,7 @@ int x509_decode_time(time64_t *_t, size_t hdrlen,
|
|||||||
unsigned char tag,
|
unsigned char tag,
|
||||||
const unsigned char *value, size_t vlen)
|
const unsigned char *value, size_t vlen)
|
||||||
{
|
{
|
||||||
static const unsigned char month_lengths[] = { 31, 29, 31, 30, 31, 30,
|
static const unsigned char month_lengths[] = { 31, 28, 31, 30, 31, 30,
|
||||||
31, 31, 30, 31, 30, 31 };
|
31, 31, 30, 31, 30, 31 };
|
||||||
const unsigned char *p = value;
|
const unsigned char *p = value;
|
||||||
unsigned year, mon, day, hour, min, sec, mon_len;
|
unsigned year, mon, day, hour, min, sec, mon_len;
|
||||||
@ -517,9 +517,9 @@ int x509_decode_time(time64_t *_t, size_t hdrlen,
|
|||||||
if (year % 4 == 0) {
|
if (year % 4 == 0) {
|
||||||
mon_len = 29;
|
mon_len = 29;
|
||||||
if (year % 100 == 0) {
|
if (year % 100 == 0) {
|
||||||
year /= 100;
|
mon_len = 28;
|
||||||
if (year % 4 != 0)
|
if (year % 400 == 0)
|
||||||
mon_len = 28;
|
mon_len = 29;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user