| From foo@baz Thu Mar 22 14:57:32 CET 2018 |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| Date: Mon, 1 May 2017 21:43:43 +0300 |
| Subject: cifs: small underflow in cnvrtDosUnixTm() |
| |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| |
| |
| [ Upstream commit 564277eceeca01e02b1ef3e141cfb939184601b4 ] |
| |
| January is month 1. There is no zero-th month. If someone passes a |
| zero month then it means we read from one space before the start of the |
| total_days_of_prev_months[] array. |
| |
| We may as well also be strict about days as well. |
| |
| Fixes: 1bd5bbcb6531 ("[CIFS] Legacy time handling for Win9x and OS/2 part 1") |
| Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: Steve French <smfrench@gmail.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/cifs/netmisc.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/fs/cifs/netmisc.c |
| +++ b/fs/cifs/netmisc.c |
| @@ -980,10 +980,10 @@ struct timespec cnvrtDosUnixTm(__le16 le |
| cifs_dbg(VFS, "illegal hours %d\n", st->Hours); |
| days = sd->Day; |
| month = sd->Month; |
| - if ((days > 31) || (month > 12)) { |
| + if (days < 1 || days > 31 || month < 1 || month > 12) { |
| cifs_dbg(VFS, "illegal date, month %d day: %d\n", month, days); |
| - if (month > 12) |
| - month = 12; |
| + days = clamp(days, 1, 31); |
| + month = clamp(month, 1, 12); |
| } |
| month -= 1; |
| days += total_days_of_prev_months[month]; |