From dc4d9af2e6767c047654fdbbebb38843ed997ad0 Mon Sep 17 00:00:00 2001 From: milesdong Date: Tue, 13 Sep 2016 14:36:23 +0800 Subject: [PATCH 01/11] fix invalid memory access in utp_stream and torrent (#1084) fix invalid memory access in uTP PMTUd --- src/torrent.cpp | 3 ++- src/utp_stream.cpp | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/torrent.cpp b/src/torrent.cpp index ffb611da4..fe8ebf04e 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -1989,9 +1989,10 @@ namespace libtorrent file_storage const& fs = m_torrent_file->files(); for (int i = 0; i < fs.num_files(); ++i) { + if (!fs.pad_file_at(i) || fs.file_size(i) == 0) continue; + if (fs.pad_file_at(i)) ++num_pad_files; - if (!fs.pad_file_at(i) || fs.file_size(i) == 0) continue; m_padding += boost::uint32_t(fs.file_size(i)); // TODO: instead of creating the picker up front here, diff --git a/src/utp_stream.cpp b/src/utp_stream.cpp index bf6d791bd..630fffa9b 100644 --- a/src/utp_stream.cpp +++ b/src/utp_stream.cpp @@ -1822,6 +1822,7 @@ bool utp_socket_impl::send_pkt(int const flags) int const effective_mtu = mtu_probe ? m_mtu : m_mtu_floor; int payload_size = (std::min)(m_write_buffer_size , effective_mtu - header_size); + TORRENT_ASSERT(payload_size >= 0); // if we have one MSS worth of data, make sure it fits in our // congestion window and the advertised receive window from @@ -1924,6 +1925,7 @@ bool utp_socket_impl::send_pkt(int const flags) #ifdef TORRENT_DEBUG p->num_fast_resend = 0; #endif + p->mtu_probe = false; p->need_resend = false; ptr = p->buf; h = reinterpret_cast(ptr); From 850eca1f21d1f6e2ae6f0177b91e077c42486534 Mon Sep 17 00:00:00 2001 From: Steven Siloti Date: Mon, 12 Sep 2016 23:37:00 -0700 Subject: [PATCH 02/11] don't pop request until we're done with it (#1085) --- src/web_peer_connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web_peer_connection.cpp b/src/web_peer_connection.cpp index d5b97ab9a..14d64aff2 100644 --- a/src/web_peer_connection.cpp +++ b/src/web_peer_connection.cpp @@ -978,9 +978,9 @@ void web_peer_connection::incoming_payload(char const* buf, int len) , "piece: %d start: %d len: %d" , front_request.piece, front_request.start, front_request.length); #endif - m_requests.pop_front(); incoming_piece(front_request, &m_piece[0]); + m_requests.pop_front(); m_piece.clear(); } } From 22043fd1868c3b915ea3d98ec221226a550411a0 Mon Sep 17 00:00:00 2001 From: sledgehammer999 Date: Wed, 14 Sep 2016 00:07:01 +0300 Subject: [PATCH 03/11] Use std::random instead of Boost.Random when in c++11 mode. (#1087) --- src/random.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/random.cpp b/src/random.cpp index 484d71f2e..c7b5d0f42 100644 --- a/src/random.cpp +++ b/src/random.cpp @@ -34,6 +34,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/random.hpp" #include "libtorrent/assert.hpp" +#ifdef BOOST_NO_CXX11_HDR_RANDOM #include "libtorrent/aux_/disable_warnings_push.hpp" #include @@ -41,6 +42,9 @@ POSSIBILITY OF SUCH DAMAGE. #include #include "libtorrent/aux_/disable_warnings_pop.hpp" +#else +#include +#endif #if !TORRENT_THREADSAFE_STATIC #include "libtorrent/thread.hpp" @@ -48,9 +52,15 @@ POSSIBILITY OF SUCH DAMAGE. namespace libtorrent { +#ifdef BOOST_NO_CXX11_HDR_RANDOM using boost::random::random_device; using boost::random::mt19937; using boost::random::uniform_int_distribution; +#else + using std::random_device; + using std::mt19937; + using std::uniform_int_distribution; +#endif #ifdef TORRENT_BUILD_SIMULATOR From 0759b732c1649c90a506e9be62443e0fd043b3ad Mon Sep 17 00:00:00 2001 From: Steven Siloti Date: Wed, 14 Sep 2016 09:29:07 -0700 Subject: [PATCH 04/11] =?UTF-8?q?web=5Fpeer=5Fconnection:=20make=20a=20cop?= =?UTF-8?q?y=20of=20the=20request=20before=20calling=20incomi=E2=80=A6=20(?= =?UTF-8?q?#1091)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit web_peer_connection: make a copy of the request before calling incoming_piece --- src/web_peer_connection.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/web_peer_connection.cpp b/src/web_peer_connection.cpp index 14d64aff2..234269c84 100644 --- a/src/web_peer_connection.cpp +++ b/src/web_peer_connection.cpp @@ -979,8 +979,15 @@ void web_peer_connection::incoming_payload(char const* buf, int len) , front_request.piece, front_request.start, front_request.length); #endif - incoming_piece(front_request, &m_piece[0]); + // Make a copy of the request and pop it off the queue before calling + // incoming_piece because that may lead to a call to disconnect() + // which will clear the request queue and invalidate any references + // to the request + peer_request const front_request_copy = front_request; m_requests.pop_front(); + + incoming_piece(front_request_copy, &m_piece[0]); + m_piece.clear(); } } From 30ead816906d4ae9509a1eb72b1eacf2a7c03560 Mon Sep 17 00:00:00 2001 From: arvidn Date: Thu, 15 Sep 2016 00:00:05 -0400 Subject: [PATCH 05/11] update Changelog --- ChangeLog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ChangeLog b/ChangeLog index 669e78277..a58912422 100644 --- a/ChangeLog +++ b/ChangeLog @@ -125,6 +125,15 @@ * almost completely changed the storage interface (for custom storage) * added support for hashing pieces in multiple threads + * fix padfile issue + * fix PMTUd bug + * update puff to fix gzip crash + +1.0.10 release + + * fixed inverted priority of incoming piece suggestions + * fixed crash on invalid input in http_parser + * added a new "preformatted" type to bencode entry variant type * fix division by zero in super-seeding logic 1.0.9 release From acf77a53855d848c1b6241dde298a69f3b2dd254 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Sun, 18 Sep 2016 20:08:27 -0400 Subject: [PATCH 06/11] fix tail-padding for last file in create_torrent (#1106) --- ChangeLog | 1 + src/file_storage.cpp | 14 +++++---- test/test_file_storage.cpp | 61 +++++++++++++++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index a58912422..2899f7cf6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,4 @@ + * fix tail-padding for last file in create_torrent * fix internal resolve links lookup for mutable torrents * hint DHT bootstrap nodes of actual bootstrap request diff --git a/src/file_storage.cpp b/src/file_storage.cpp index 834a075f1..e08eb9cea 100644 --- a/src/file_storage.cpp +++ b/src/file_storage.cpp @@ -182,7 +182,7 @@ namespace libtorrent && std::memcmp(branch_path, m_name.c_str(), m_name.size()) == 0) { // the +1 is to skip the trailing '/' (or '\') - int offset = m_name.size() + int const offset = m_name.size() + (m_name.size() == branch_len?0:1); branch_path += offset; branch_len -= offset; @@ -1041,11 +1041,13 @@ namespace libtorrent ++i; // tail-padding is enabled, and the offset after this file is not - // aligned and it's not the last file. The last file must be padded - // too, in order to match an equivalent tail-padded file. + // aligned. The last file must be padded too, in order to match an + // equivalent tail-padded file. add_pad_file(alignment - (off % alignment), i, off, padding_file); TORRENT_ASSERT((off % alignment) == 0); + + if (i == m_files.end()) break; } } m_total_size = off; @@ -1056,8 +1058,8 @@ namespace libtorrent , boost::int64_t& offset , int& pad_file_counter) { - int cur_index = i - m_files.begin(); - int index = m_files.size(); + int const cur_index = i - m_files.begin(); + int const index = m_files.size(); m_files.push_back(internal_file_entry()); ++m_num_files; internal_file_entry& e = m_files.back(); @@ -1080,7 +1082,7 @@ namespace libtorrent if (!m_file_base.empty()) m_file_base.resize(index + 1, 0); #endif - reorder_file(index, cur_index); + if (index != cur_index) reorder_file(index, cur_index); } void file_storage::unload() diff --git a/test/test_file_storage.cpp b/test/test_file_storage.cpp index ccb4b0ac7..dd4b3fa55 100644 --- a/test/test_file_storage.cpp +++ b/test/test_file_storage.cpp @@ -211,7 +211,66 @@ TORRENT_TEST(file_path_hash) TEST_EQUAL(file_hash0, file_hash1); } -// TODO: test file_storage::optimize +// make sure we pad the end of the torrent when tail_padding is specified +TORRENT_TEST(optimize_tail_padding) +{ + file_storage fs; + fs.set_piece_length(512); + fs.add_file(combine_path("s", "1"), 700); + + fs.optimize(512, 512, true); + + // since the size of file 3 is a multiple of the alignment (512), it should + // be prioritized, to minimize the amount of padding. + // after that, we want to pick the largest file (2), and since file 1 is + // smaller than the pad-file limit (512) we won't pad it. Since tail_padding + // is false, we won't pad the tail of the torrent either + + TEST_EQUAL(fs.num_files(), 2); + + TEST_EQUAL(fs.file_size(0), 700); + TEST_EQUAL(fs.file_name(0), "1"); + TEST_EQUAL(fs.pad_file_at(0), false); + + TEST_EQUAL(fs.file_size(1), 1024 - 700); + TEST_EQUAL(fs.pad_file_at(1), true); +} + + +// make sure we fill in padding with small files +TORRENT_TEST(optimize_pad_fillers) +{ + file_storage fs; + fs.set_piece_length(512); + fs.add_file(combine_path("s", "1"), 1); + fs.add_file(combine_path("s", "2"), 1000); + fs.add_file(combine_path("s", "3"), 1001); + + fs.optimize(512, 512, false); + + // first we pick the largest file, then we need to add padding, since file 1 + // is smaller than the pad file limit, it won't be aligned anyway, so we + // place that as part of the padding + + TEST_EQUAL(fs.num_files(), 4); + + TEST_EQUAL(fs.file_size(0), 1001); + TEST_EQUAL(fs.file_name(0), "3"); + TEST_EQUAL(fs.pad_file_at(0), false); + + TEST_EQUAL(fs.file_size(1), 1); + TEST_EQUAL(fs.file_name(1), "1"); + TEST_EQUAL(fs.pad_file_at(1), false); + + TEST_EQUAL(fs.file_size(2), 1024 - (1001 + 1)); + TEST_EQUAL(fs.pad_file_at(2), true); + + TEST_EQUAL(fs.file_size(3), 1000); + TEST_EQUAL(fs.file_name(3), "2"); + TEST_EQUAL(fs.pad_file_at(3), false); +} + +// TODO: add more optimize() tests // TODO: test map_block // TODO: test piece_size(int piece) // TODO: test file_index_at_offset From 93381505d0bb76b1f8ef25ff65f3ede53e5b8268 Mon Sep 17 00:00:00 2001 From: arvidn Date: Sun, 18 Sep 2016 17:14:18 -0700 Subject: [PATCH 07/11] clean up some examples --- examples/make_torrent.cpp | 118 ++++++++----------------------------- examples/simple_client.cpp | 7 +-- 2 files changed, 27 insertions(+), 98 deletions(-) diff --git a/examples/make_torrent.cpp b/examples/make_torrent.cpp index 281451367..d7c8aac9b 100644 --- a/examples/make_torrent.cpp +++ b/examples/make_torrent.cpp @@ -42,6 +42,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/hex.hpp" // for from_hex #include +#include #ifdef TORRENT_WINDOWS #include // for _getcwd @@ -49,65 +50,18 @@ POSSIBILITY OF SUCH DAMAGE. using namespace libtorrent; -int load_file(std::string const& filename, std::vector& v, libtorrent::error_code& ec, int limit = 8000000) +std::vector load_file(std::string const& filename) { - ec.clear(); - FILE* f = fopen(filename.c_str(), "rb"); - if (f == NULL) - { - ec.assign(errno, boost::system::system_category()); - return -1; - } - - int r = fseek(f, 0, SEEK_END); - if (r != 0) - { - ec.assign(errno, boost::system::system_category()); - fclose(f); - return -1; - } - long s = ftell(f); - if (s < 0) - { - ec.assign(errno, boost::system::system_category()); - fclose(f); - return -1; - } - - if (s > limit) - { - fclose(f); - return -2; - } - - r = fseek(f, 0, SEEK_SET); - if (r != 0) - { - ec.assign(errno, boost::system::system_category()); - fclose(f); - return -1; - } - - v.resize(s); - if (s == 0) - { - fclose(f); - return 0; - } - - r = fread(&v[0], 1, v.size(), f); - if (r < 0) - { - ec.assign(errno, boost::system::system_category()); - fclose(f); - return -1; - } - - fclose(f); - - if (r != s) return -3; - - return 0; + std::vector ret; + std::fstream in; + in.exceptions(std::ifstream::failbit); + in.open(filename.c_str(), std::ios_base::in | std::ios_base::binary); + in.seekg(0, std::ios_base::end); + size_t const size = in.tellg(); + in.seekg(0, std::ios_base::beg); + ret.resize(size); + in.read(ret.data(), ret.size()); + return ret; } std::string branch_path(std::string const& f) @@ -383,51 +337,31 @@ int main(int argc, char* argv[]) if (!root_cert.empty()) { - std::vector pem; - load_file(root_cert, pem, ec, 10000); - if (ec) - { - fprintf(stderr, "failed to load root certificate for tracker: %s\n", ec.message().c_str()); - } - else - { - t.set_root_cert(std::string(&pem[0], pem.size())); - } + std::vector pem = load_file(root_cert); + t.set_root_cert(std::string(&pem[0], pem.size())); } // create the torrent and print it to stdout std::vector torrent; bencode(back_inserter(torrent), t.generate()); - FILE* output = stdout; if (!outfile.empty()) - output = fopen(outfile.c_str(), "wb+"); - if (output == NULL) { - fprintf(stderr, "failed to open file \"%s\": (%d) %s\n" - , outfile.c_str(), errno, strerror(errno)); - return 1; + std::fstream out; + out.exceptions(std::ifstream::failbit); + out.open(outfile.c_str(), std::ios_base::out | std::ios_base::binary); + out.write(&torrent[0], torrent.size()); + } + else + { + fwrite(&torrent[0], 1, torrent.size(), stdout); } - fwrite(&torrent[0], 1, torrent.size(), output); - - if (output != stdout) - fclose(output); if (!merklefile.empty()) { - output = fopen(merklefile.c_str(), "wb+"); - if (output == NULL) - { - fprintf(stderr, "failed to open file \"%s\": (%d) %s\n" - , merklefile.c_str(), errno, strerror(errno)); - return 1; - } - int ret = fwrite(&t.merkle_tree()[0], 20, t.merkle_tree().size(), output); - if (ret != int(t.merkle_tree().size())) - { - fprintf(stderr, "failed to write %s: (%d) %s\n" - , merklefile.c_str(), errno, strerror(errno)); - } - fclose(output); + std::fstream merkle; + merkle.exceptions(std::ifstream::failbit); + merkle.open(merklefile.c_str(), std::ios_base::out | std::ios_base::binary); + merkle.write(reinterpret_cast(&t.merkle_tree()[0]), t.merkle_tree().size() * 20); } #ifndef BOOST_NO_EXCEPTIONS diff --git a/examples/simple_client.cpp b/examples/simple_client.cpp index ef43ffc7b..9cb5466de 100644 --- a/examples/simple_client.cpp +++ b/examples/simple_client.cpp @@ -52,14 +52,9 @@ int main(int argc, char* argv[]) settings_pack sett; sett.set_str(settings_pack::listen_interfaces, "0.0.0.0:6881"); lt::session s(sett); - error_code ec; - if (ec) - { - fprintf(stderr, "failed to open listen socket: %s\n", ec.message().c_str()); - return 1; - } add_torrent_params p; p.save_path = "./"; + error_code ec; p.ti = boost::make_shared(std::string(argv[1]), boost::ref(ec), 0); if (ec) { From 85a2a5c5cbbbaf9e7814620cebec76e9cb9a2074 Mon Sep 17 00:00:00 2001 From: arvidn Date: Sun, 18 Sep 2016 15:56:12 -0700 Subject: [PATCH 08/11] don't send user-agent in metadata http downloads or UPnP requests when in anonymous mode --- ChangeLog | 2 ++ include/libtorrent/upnp.hpp | 4 +++- src/session_impl.cpp | 12 ++++++++++-- src/torrent.cpp | 4 +++- src/web_connection_base.cpp | 3 ++- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2899f7cf6..9123c362f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,6 @@ * fix tail-padding for last file in create_torrent + * don't send user-agent in metadata http downloads or UPnP requests when + in anonymous mode * fix internal resolve links lookup for mutable torrents * hint DHT bootstrap nodes of actual bootstrap request diff --git a/include/libtorrent/upnp.hpp b/include/libtorrent/upnp.hpp index 691d27515..ec1614429 100644 --- a/include/libtorrent/upnp.hpp +++ b/include/libtorrent/upnp.hpp @@ -138,6 +138,8 @@ public: , bool ignore_nonrouters); ~upnp(); + void set_user_agent(std::string const& v) { m_user_agent = v; } + void start(); enum protocol_type { none = 0, udp = 1, tcp = 2 }; @@ -357,7 +359,7 @@ private: std::vector m_mappings; - std::string const& m_user_agent; + std::string m_user_agent; // the set of devices we've found std::set m_devices; diff --git a/src/session_impl.cpp b/src/session_impl.cpp index 49c40fd11..4117879c8 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -6501,8 +6501,15 @@ retry: void session_impl::update_anonymous_mode() { - if (!m_settings.get_bool(settings_pack::anonymous_mode)) return; + if (!m_settings.get_bool(settings_pack::anonymous_mode)) + { + if (m_upnp) + m_upnp->set_user_agent(m_settings.get_str(settings_pack::user_agent)); + return; + } + if (m_upnp) + m_upnp->set_user_agent(""); m_settings.set_str(settings_pack::user_agent, ""); url_random(m_peer_id.data(), m_peer_id.data() + 20); } @@ -6825,7 +6832,8 @@ retry: // the upnp constructor may fail and call the callbacks m_upnp = boost::make_shared(boost::ref(m_io_service) , m_listen_interface.address() - , m_settings.get_str(settings_pack::user_agent) + , m_settings.get_bool(settings_pack::anonymous_mode) + ? "" : m_settings.get_str(settings_pack::user_agent) , boost::bind(&session_impl::on_port_mapping , this, _1, _2, _3, _4, _5, 1) , boost::bind(&session_impl::on_port_map_log diff --git a/src/torrent.cpp b/src/torrent.cpp index fe8ebf04e..37d68feba 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -882,7 +882,9 @@ namespace libtorrent )); aux::proxy_settings ps = m_ses.proxy(); conn->get(m_url, seconds(30), 0, &ps - , 5, settings().get_str(settings_pack::user_agent)); + , 5 + , settings().get_bool(settings_pack::anonymous_mode) + ? "" : settings().get_str(settings_pack::user_agent)); set_state(torrent_status::downloading_metadata); } diff --git a/src/web_connection_base.cpp b/src/web_connection_base.cpp index b531cc411..9391db38e 100644 --- a/src/web_connection_base.cpp +++ b/src/web_connection_base.cpp @@ -140,7 +140,8 @@ namespace libtorrent { request += "Host: "; request += m_host; - if (m_first_request || m_settings.get_bool(settings_pack::always_send_user_agent)) { + if ((m_first_request || m_settings.get_bool(settings_pack::always_send_user_agent)) + && !m_settings.get_bool(settings_pack::anonymous_mode)) { request += "\r\nUser-Agent: "; request += m_settings.get_str(settings_pack::user_agent); } From 4d716361c0a7f18cff06fbd5b7e58e6cac276407 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Tue, 20 Sep 2016 22:10:06 -0700 Subject: [PATCH 09/11] minor code cleanup (#1116) --- src/torrent.cpp | 3 +-- src/udp_tracker_connection.cpp | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/torrent.cpp b/src/torrent.cpp index fe8ebf04e..4fb596bf1 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -8272,8 +8272,7 @@ namespace libtorrent else if (m_state == torrent_status::downloading_metadata || m_state == torrent_status::downloading || m_state == torrent_status::finished - || m_state == torrent_status::seeding - || m_state == torrent_status::downloading) + || m_state == torrent_status::seeding) { // torrents that are started (not paused) and // inactive are not part of any list. They will not be touched because diff --git a/src/udp_tracker_connection.cpp b/src/udp_tracker_connection.cpp index 7da664ac8..3e1430884 100644 --- a/src/udp_tracker_connection.cpp +++ b/src/udp_tracker_connection.cpp @@ -619,7 +619,6 @@ namespace libtorrent return true; } - std::vector peer_list; resp.peers4.reserve(num_peers); for (int i = 0; i < num_peers; ++i) { From b20b3ad1acea4c63914d207222c6345ee1208f71 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Wed, 21 Sep 2016 19:54:42 -0700 Subject: [PATCH 10/11] remove file size limit in torrent_info filename constructor (#1126) --- ChangeLog | 1 + src/torrent_info.cpp | 7 +------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9123c362f..68b68e061 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,4 @@ + * remove file size limit in torrent_info filename constructor * fix tail-padding for last file in create_torrent * don't send user-agent in metadata http downloads or UPnP requests when in anonymous mode diff --git a/src/torrent_info.cpp b/src/torrent_info.cpp index 140d7611b..04508c259 100644 --- a/src/torrent_info.cpp +++ b/src/torrent_info.cpp @@ -643,18 +643,13 @@ namespace libtorrent } int load_file(std::string const& filename, std::vector& v - , error_code& ec, int limit = 8000000) + , error_code& ec) { ec.clear(); file f; if (!f.open(filename, file::read_only, ec)) return -1; boost::int64_t s = f.get_size(ec); if (ec) return -1; - if (s > limit) - { - ec = errors::metadata_too_large; - return -2; - } v.resize(std::size_t(s)); if (s == 0) return 0; file::iovec_t b = {&v[0], size_t(s) }; From 62146f43d0e9eb61ec9fd5839a52d56a53ac1a39 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Wed, 21 Sep 2016 22:58:54 -0700 Subject: [PATCH 11/11] fix appveyor (#1132) --- appveyor.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index cbb8df2a6..a16967d6b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,31 +3,35 @@ branches: only: - master - RC_1_1 -os: Previous Visual Studio 2015 clone_depth: 1 environment: matrix: - variant: test_debug compiler: msvc-14.0 + os: Visual Studio 2015 sim: 1 linkflags: '"/LIBPATH:C:\\openssl-1.0.1p-vs2015\\lib"' include: '"c:\\openssl-1.0.1p-vs2015\\include"' - variant: test_debug compiler: msvc-12.0 + os: Visual Studio 2013 x64: 1 linkflags: '"/LIBPATH:C:\\openssl-1.0.1p-vs2013\\lib64"' include: '"c:\\openssl-1.0.1p-vs2013\\include"' - variant: test_debug python_package: 1 compiler: msvc-10.0 + os: Visual Studio 2015 linkflags: '"/LIBPATH:C:\\openssl-1.0.1p-vs2010\\lib"' include: '"c:\\openssl-1.0.1p-vs2010\\include"' - variant: test_barebones compiler: msvc-12.0 + os: Visual Studio 2013 linkflags: '"/LIBPATH:C:\\openssl-1.0.1p-vs2013\\lib"' include: '"c:\\openssl-1.0.1p-vs2013\\include"' - variant: test_release compiler: msvc-12.0 + os: Visual Studio 2013 linkflags: '"/LIBPATH:C:\\openssl-1.0.1p-vs2013\\lib"' include: '"c:\\openssl-1.0.1p-vs2013\\include"'