Opened 9 years ago

Closed 8 years ago

#9880 closed Bugs (fixed)

[windows] boost::condition_variable.timed_wait() exception if system time < 1970

Reported by: anonymous Owned by: viboes
Milestone: Boost 1.57.0 Component: thread
Version: Boost 1.55.0 Severity: Problem
Keywords: Cc:

Description (last modified by viboes)

Os: any windows. Set system time < 01.01.1970, for example 01.01.1950.

Any call to boost::condition_variable.timed_wait() with relative(!) time throw exception because boost try get system time in posix format.

How to fix: boost\thread\win32\thread_data.hpp, line 179 (boost 1.55.0). In constructor

            timeout(uintmax_t milliseconds_):
                start(win32::GetTickCount64()),
                milliseconds(milliseconds_),
                relative(true),
                abs_time(boost::get_system_time())
            {}

we set "relative(true)" and there for not need to set variable "abs_time". Must be:

            timeout(uintmax_t milliseconds_):
                start(win32::GetTickCount64()),
                milliseconds(milliseconds_),
                relative(true)
            {}

Change History (13)

comment:1 by anonymous, 9 years ago

Component: Nonedate_time
Owner: set to az_sw_dude

comment:2 by viboes, 9 years ago

Component: date_timethread
Owner: changed from az_sw_dude to viboes
Status: newassigned

comment:3 by viboes, 9 years ago

Description: modified (diff)

comment:4 by viboes, 9 years ago

This code has been there since the beginning.

Have you found a regression? If yes, on which version it was working?

Could you provide an example, please?

comment:5 by viboes, 9 years ago

BTW, why do you want to set the current time < 1970?

comment:6 by alex, 9 years ago

I am the developer of anti-virus, respectively, our product should work with any conditions that malicious software may do. We found that the boost has architectural problem with the fact that he is trying to get the system time in posix format when specifying relative time. We found some workarounds solutions, but a problem with the condition variable could not solve. Example executed on windows 8.1, visual studio 2012, boost_1_55_0. Thanks!

#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include "windows.h"
#include "boost/thread.hpp"

#define IF_ERR_RET(x) if(!(x)) {printf("Error: %d in %s(%d)\n", GetLastError(), __FILE__, __LINE__); return FALSE;}
#define TRY try {
#define CATCH } catch(std::exception& exc) {printf("Exception %s in %s(%d)\n", exc.what(), __FILE__, __LINE__);}

bool setYear(int year)
{
	SYSTEMTIME tm;
	GetLocalTime(&tm);
	tm.wYear = year;
	IF_ERR_RET(SetLocalTime(&tm));

	return TRUE;
}
void Func(void)
{
	Sleep(10000);
}
int _tmain(int argc, _TCHAR* argv[])
{
	IF_ERR_RET(setYear(1950));

	TRY;
	boost::condition_variable cv;
	boost::mutex			mtx;
	boost::mutex::scoped_lock lck(mtx);
	cv.timed_wait(lck, boost::posix_time::milliseconds(1000)); // exception
	CATCH;  

	TRY;
	boost::thread thr(&Func);
	thr.timed_join(boost::posix_time::milliseconds(1000)); // exception
	CATCH;  

	TRY;
	boost::thread thr(&Func);
	thr.try_join_for(boost::chrono::milliseconds(1000)); // exception
	CATCH;  

	TRY;
	boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); // exception
	CATCH;  

	TRY;
	boost::posix_time::second_clock::local_time(); // exception
	CATCH;  

	IF_ERR_RET(setYear(2014));

	return 0;
}

comment:7 by viboes, 9 years ago

Ok, I understand your concern. I will take a look. Could you answer to the questions: Have you found a regression? If yes, on which version it was working?

comment:8 by alex, 9 years ago

I was not looking for a regression, but I think that this error has always been. boost_1_51_0, boost_1_55_0 - the problem persists.

comment:9 by viboes, 9 years ago

I have no access to a windows machine. So before updating the code I want to be sure it fixes the issue.

Please, could you point me where abs_time is used if relative is true?

Thanks in advance, Vicente

comment:10 by viboes, 9 years ago

Summary: boost::condition_variable.timed_wait() exception if system time < 1970[windows] boost::condition_variable.timed_wait() exception if system time < 1970

comment:11 by viboes, 8 years ago

Could you tell me which exception is thrown?

comment:12 by viboes, 8 years ago

I have removed the initialization

abs_time(boost::get_system_time())

comment:13 by viboes, 8 years ago

Milestone: To Be DeterminedBoost 1.57.0
Resolution: fixed
Status: assignedclosed
Note: See TracTickets for help on using tickets.