Index: fpdfsdk/src/javascript/PublicMethods.cpp |
diff --git a/fpdfsdk/src/javascript/PublicMethods.cpp b/fpdfsdk/src/javascript/PublicMethods.cpp |
index bd4acaef9a120b763ca0a782f0acc8aed52f280a..55228687bcf86bb394b1e0efcee917fb48044501 100644 |
--- a/fpdfsdk/src/javascript/PublicMethods.cpp |
+++ b/fpdfsdk/src/javascript/PublicMethods.cpp |
@@ -624,7 +624,7 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
FX_BOOL bPm = FALSE; |
FX_BOOL bExit = FALSE; |
bWrongFormat = FALSE; |
- |
+ |
int i=0; |
int j=0; |
@@ -632,7 +632,7 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
{ |
if (bExit) break; |
- FX_WCHAR c = format.GetAt(i); |
+ FX_WCHAR c = format.GetAt(i); |
switch (c) |
{ |
case ':': |
@@ -643,7 +643,7 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
i++; |
j++; |
break; |
- |
+ |
case 'y': |
case 'm': |
case 'd': |
@@ -655,8 +655,9 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
{ |
int oldj = j; |
int nSkip = 0; |
+ int remaining = format.GetLength() - i - 1; |
- if (format.GetAt(i+1) != c) |
+ if (remaining == 0 || format.GetAt(i+1) != c) |
{ |
switch (c) |
{ |
@@ -695,13 +696,13 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
j += nSkip; |
break; |
case 't': |
- bPm = value.GetAt(i) == 'p'; |
+ bPm = (j < value.GetLength() && value.GetAt(j) == 'p'); |
i++; |
j++; |
break; |
- } |
+ } |
} |
- else if (format.GetAt(i+1) == c && format.GetAt(i+2) != c) |
+ else if (remaining == 1 || format.GetAt(i+2) != c) |
{ |
switch (c) |
{ |
@@ -741,13 +742,13 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
j += nSkip; |
break; |
case 't': |
- bPm = (value.GetAt(j) == 'p' && value.GetAt(j+1) == 'm'); |
+ bPm = (j + 1 < value.GetLength() && value.GetAt(j) == 'p' && value.GetAt(j+1) == 'm'); |
i += 2; |
j += 2; |
break; |
} |
} |
- else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) != c) |
+ else if (remaining == 2 || format.GetAt(i+3) != c) |
{ |
switch (c) |
{ |
@@ -766,7 +767,7 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
break; |
} |
} |
- |
+ |
if (!bFind) |
{ |
nMonth = ParseStringInteger(value, j, nSkip, 3); |
@@ -783,7 +784,7 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
break; |
} |
} |
- else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) == c && format.GetAt(i+4) != c) |
+ else if (remaining == 3 || format.GetAt(i+4) != c) |
{ |
switch (c) |
{ |
@@ -815,7 +816,7 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
break; |
} |
} |
- |
+ |
if (!bFind) |
{ |
nMonth = ParseStringInteger(value, j, nSkip, 4); |
@@ -828,11 +829,11 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
i += 4; |
j += 4; |
break; |
- } |
+ } |
} |
else |
{ |
- if (format.GetAt(i) != value.GetAt(j)) |
+ if (j >= value.GetLength() || format.GetAt(i) != value.GetAt(j)) |
{ |
bWrongFormat = TRUE; |
bExit = TRUE; |
@@ -840,7 +841,7 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
i++; |
j++; |
} |
- |
+ |
if (oldj == j) |
{ |
bWrongFormat = TRUE; |
@@ -848,7 +849,7 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
} |
} |
- break; |
+ break; |
default: |
if (value.GetLength() <= j) |
{ |
@@ -863,7 +864,7 @@ double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CF |
i++; |
j++; |
break; |
- } |
+ } |
} |
if (bPm) nHour += 12; |