-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
5 changed files
with
746 additions
and
36 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
// Copyright (c) 2018 The SalemCash developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#include <support/cleanse.h> | ||
|
||
#include <cstring> | ||
|
||
#if defined(_MSC_VER) | ||
#include <Windows.h> // For SecureZeroMemory. | ||
#endif | ||
|
||
/* Compilers have a bad habit of removing "superfluous" memset calls that | ||
* are trying to zero memory. For example, when memset()ing a buffer and | ||
* then free()ing it, the compiler might decide that the memset is | ||
* unobservable and thus can be removed. | ||
* | ||
* Previously we used OpenSSL which tried to stop this by a) implementing | ||
* memset in assembly on x86 and b) putting the function in its own file | ||
* for other platforms. | ||
* | ||
* This change removes those tricks in favour of using asm directives to | ||
* scare the compiler away. As best as our compiler folks can tell, this is | ||
* sufficient and will continue to be so. | ||
* | ||
* Adam Langley <[email protected]> | ||
* Commit: ad1907fe73334d6c696c8539646c21b11178f20f | ||
* BoringSSL (LICENSE: ISC) | ||
*/ | ||
void memory_cleanse(void *ptr, size_t len) | ||
{ | ||
std::memset(ptr, 0, len); | ||
|
||
/* As best as we can tell, this is sufficient to break any optimisations that | ||
might try to eliminate "superfluous" memsets. If there's an easy way to | ||
detect memset_s, it would be better to use that. */ | ||
#if defined(_MSC_VER) | ||
SecureZeroMemory(ptr, len); | ||
#else | ||
__asm__ __volatile__("" : : "r"(ptr) : "memory"); | ||
#endif | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// Copyright (c) 2018 The SalemCash developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef SALEMCASH_SUPPORT_CLEANSE_H | ||
#define SALEMCASH_SUPPORT_CLEANSE_H | ||
|
||
#include <stdlib.h> | ||
|
||
// Attempt to overwrite data in the specified memory span. | ||
void memory_cleanse(void *ptr, size_t len); | ||
|
||
#endif // SALEMCASH_SUPPORT_CLEANSE_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// Copyright (c) 2018 The SalemCash developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef SALEMCASH_SUPPORT_EVENTS_H | ||
#define SALEMCASH_SUPPORT_EVENTS_H | ||
|
||
#include <ios> | ||
#include <memory> | ||
|
||
#include <event2/event.h> | ||
#include <event2/http.h> | ||
|
||
#define MAKE_RAII(type) \ | ||
/* deleter */\ | ||
struct type##_deleter {\ | ||
void operator()(struct type* ob) {\ | ||
type##_free(ob);\ | ||
}\ | ||
};\ | ||
/* unique ptr typedef */\ | ||
typedef std::unique_ptr<struct type, type##_deleter> raii_##type | ||
|
||
MAKE_RAII(event_base); | ||
MAKE_RAII(event); | ||
MAKE_RAII(evhttp); | ||
MAKE_RAII(evhttp_request); | ||
MAKE_RAII(evhttp_connection); | ||
|
||
inline raii_event_base obtain_event_base() { | ||
auto result = raii_event_base(event_base_new()); | ||
if (!result.get()) | ||
throw std::runtime_error("cannot create event_base"); | ||
return result; | ||
} | ||
|
||
inline raii_event obtain_event(struct event_base* base, evutil_socket_t s, short events, event_callback_fn cb, void* arg) { | ||
return raii_event(event_new(base, s, events, cb, arg)); | ||
} | ||
|
||
inline raii_evhttp obtain_evhttp(struct event_base* base) { | ||
return raii_evhttp(evhttp_new(base)); | ||
} | ||
|
||
inline raii_evhttp_request obtain_evhttp_request(void(*cb)(struct evhttp_request *, void *), void *arg) { | ||
return raii_evhttp_request(evhttp_request_new(cb, arg)); | ||
} | ||
|
||
inline raii_evhttp_connection obtain_evhttp_connection_base(struct event_base* base, std::string host, uint16_t port) { | ||
auto result = raii_evhttp_connection(evhttp_connection_base_new(base, nullptr, host.c_str(), port)); | ||
if (!result.get()) | ||
throw std::runtime_error("create connection failed"); | ||
return result; | ||
} | ||
|
||
#endif // SALEMCASH_SUPPORT_EVENTS_H |
Oops, something went wrong.