From 7dbd95fb085c67c8974fc80d4a3e8c285ffac06b Mon Sep 17 00:00:00 2001 From: Artyom Beilis Date: Thu, 16 Feb 2012 21:17:03 +0000 Subject: [PATCH] Provided safer casting to time_t --- private/tcp_cache_protocol.h | 17 +++++++++++++++++ src/session_tcp_storage.cpp | 2 +- src/tcp_cache_client.cpp | 2 +- src/tcp_cache_server.cpp | 4 ++-- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/private/tcp_cache_protocol.h b/private/tcp_cache_protocol.h index fe09cee..d7949df 100644 --- a/private/tcp_cache_protocol.h +++ b/private/tcp_cache_protocol.h @@ -9,6 +9,8 @@ #define TCP_CACHE_PROTO_H #include +#include +#include namespace cppcms { namespace impl { @@ -68,6 +70,21 @@ namespace impl { } operations; }; + inline time_t to_time_t(int64_t v) + { + if(sizeof(time_t) < sizeof(v)) { + if(v > static_cast(std::numeric_limits::max())) { + return std::numeric_limits::max(); + } + else { + return static_cast(v); + } + } + else { + return static_cast(v); + } + } + } // namespace impl } // Namespace cppcms diff --git a/src/session_tcp_storage.cpp b/src/session_tcp_storage.cpp index 283a7cf..3a9bd7b 100644 --- a/src/session_tcp_storage.cpp +++ b/src/session_tcp_storage.cpp @@ -49,7 +49,7 @@ bool tcp_storage::load(std::string const &sid,time_t &timeout,std::string &out) std::string data=sid; tcp().get(sid).transmit(h,data); if(h.opcode==opcodes::session_load_data) { - timeout = h.operations.session_data.timeout; + timeout = to_time_t(h.operations.session_data.timeout); out.swap(data); return true; } diff --git a/src/tcp_cache_client.cpp b/src/tcp_cache_client.cpp index ade9ed8..8e47e6f 100644 --- a/src/tcp_cache_client.cpp +++ b/src/tcp_cache_client.cpp @@ -67,7 +67,7 @@ int tcp_cache::fetch( std::string const &key, if(h.opcode!=opcodes::data) return not_found; - timeout = h.operations.data.timeout; + timeout = to_time_t(h.operations.data.timeout); generation=h.operations.data.generation; diff --git a/src/tcp_cache_server.cpp b/src/tcp_cache_server.cpp index 270b2d7..28b1ec7 100644 --- a/src/tcp_cache_server.cpp +++ b/src/tcp_cache_server.cpp @@ -183,7 +183,7 @@ public: hout_.opcode=opcodes::error; return; } - time_t timeout=hin_.operations.store.timeout; + time_t timeout=to_time_t(hin_.operations.store.timeout); std::string key; key.assign(data_in_.begin(),data_in_.begin()+hin_.operations.store.key_len); std::string data; @@ -199,7 +199,7 @@ public: hout_.opcode=opcodes::error; return; } - time_t timeout=hin_.operations.session_save.timeout; + time_t timeout=to_time_t(hin_.operations.session_save.timeout); std::string sid(data_in_.begin(),data_in_.begin()+32); std::string value(data_in_.begin()+32,data_in_.end()); sessions_->save(sid,timeout,value);