Index: boost/date_time/format_date_parser.hpp =================================================================== --- boost/date_time/format_date_parser.hpp (revision 58921) +++ boost/date_time/format_date_parser.hpp (working copy) @@ -273,6 +273,9 @@ while (itr != format_str.end() && (sitr != stream_end)) { if (*itr == '%') { itr++; + if (itr == format_str.end()) { + break; + } if (*itr != '%') { switch(*itr) { case 'a': @@ -484,6 +487,9 @@ while (itr != format_str.end() && (sitr != stream_end)) { if (*itr == '%') { itr++; + if (itr == format_str.end()) { + break; + } if (*itr != '%') { switch(*itr) { case 'b': @@ -589,6 +595,9 @@ while (itr != format_str.end() && (sitr != stream_end)) { if (*itr == '%') { itr++; + if (itr == format_str.end()) { + break; + } if (*itr != '%') { switch(*itr) { case 'a': @@ -682,6 +691,9 @@ while (itr != format_str.end() && (sitr != stream_end)) { if (*itr == '%') { itr++; + if (itr == format_str.end()) { + break; + } if (*itr != '%') { //match_results mr; switch(*itr) { Index: boost/date_time/time_facet.hpp =================================================================== --- boost/date_time/time_facet.hpp (revision 58921) +++ boost/date_time/time_facet.hpp (working copy) @@ -784,6 +784,9 @@ while (itr != m_time_duration_format.end() && (sitr != stream_end)) { if (*itr == '%') { ++itr; + if (itr == m_time_duration_format.end()) { + break; + } if (*itr != '%') { switch(*itr) { case 'O': @@ -956,6 +959,9 @@ while (itr != this->m_format.end() && (sitr != stream_end)) { if (*itr == '%') { ++itr; + if (itr == this->format_str.end()) { + break; + } if (*itr != '%') { // the cases are grouped by date & time flags - not alphabetical order switch(*itr) { @@ -1135,7 +1141,7 @@ { if(time_is_local) { // skip if 't' is a ptime ++itr; - if(*itr == 'P') { + if(itr != this->format_str.end() && *itr == 'P') { // skip leading whitespace while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; } // parse zone