Merge pull request #358 from TheBlueMatt/2019-07-no-unsafe

forbid unsafe
This commit is contained in:
Matt Corallo 2019-07-24 19:47:44 +00:00 committed by GitHub
commit 38098ba657
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 8 additions and 17 deletions

View file

@ -1,3 +1,5 @@
[![Safety Dance](https://img.shields.io/badge/unsafe-forbidden-success.svg)](https://github.com/rust-secure-code/safety-dance/)
Rust-Lightning, not Rusty's Lightning! Rust-Lightning, not Rusty's Lightning!
===== =====

View file

@ -10,6 +10,7 @@
//! instead of having a rather-separate lightning appendage to a wallet. //! instead of having a rather-separate lightning appendage to a wallet.
#![cfg_attr(not(feature = "fuzztarget"), deny(missing_docs))] #![cfg_attr(not(feature = "fuzztarget"), deny(missing_docs))]
#![forbid(unsafe_code)]
extern crate bitcoin; extern crate bitcoin;
extern crate bitcoin_hashes; extern crate bitcoin_hashes;

View file

@ -713,7 +713,6 @@ mod fuzzy_internal_msgs {
pub(crate) data: OnionRealm0HopData, pub(crate) data: OnionRealm0HopData,
pub(crate) hmac: [u8; 32], pub(crate) hmac: [u8; 32],
} }
unsafe impl ::util::internal_traits::NoDealloc for OnionHopData{}
pub struct DecodedOnionErrorPacket { pub struct DecodedOnionErrorPacket {
pub(crate) hmac: [u8; 32], pub(crate) hmac: [u8; 32],

View file

@ -1,7 +1,7 @@
use ln::channelmanager::{PaymentHash, HTLCSource}; use ln::channelmanager::{PaymentHash, HTLCSource};
use ln::msgs; use ln::msgs;
use ln::router::{Route,RouteHop}; use ln::router::{Route,RouteHop};
use util::{byte_utils, internal_traits}; use util::byte_utils;
use util::chacha20::ChaCha20; use util::chacha20::ChaCha20;
use util::errors::{self, APIError}; use util::errors::{self, APIError};
use util::ser::{Readable, Writeable}; use util::ser::{Readable, Writeable};
@ -17,7 +17,6 @@ use secp256k1::Secp256k1;
use secp256k1::ecdh::SharedSecret; use secp256k1::ecdh::SharedSecret;
use secp256k1; use secp256k1;
use std::ptr;
use std::io::Cursor; use std::io::Cursor;
use std::sync::Arc; use std::sync::Arc;
@ -114,8 +113,6 @@ pub(super) fn build_onion_payloads(route: &Route, starting_htlc_offset: u32) ->
let mut cur_cltv = starting_htlc_offset; let mut cur_cltv = starting_htlc_offset;
let mut last_short_channel_id = 0; let mut last_short_channel_id = 0;
let mut res: Vec<msgs::OnionHopData> = Vec::with_capacity(route.hops.len()); let mut res: Vec<msgs::OnionHopData> = Vec::with_capacity(route.hops.len());
internal_traits::test_no_dealloc::<msgs::OnionHopData>(None);
unsafe { res.set_len(route.hops.len()); }
for (idx, hop) in route.hops.iter().enumerate().rev() { for (idx, hop) in route.hops.iter().enumerate().rev() {
// First hop gets special values so that it can check, on receipt, that everything is // First hop gets special values so that it can check, on receipt, that everything is
@ -123,7 +120,7 @@ pub(super) fn build_onion_payloads(route: &Route, starting_htlc_offset: u32) ->
// the intended recipient). // the intended recipient).
let value_msat = if cur_value_msat == 0 { hop.fee_msat } else { cur_value_msat }; let value_msat = if cur_value_msat == 0 { hop.fee_msat } else { cur_value_msat };
let cltv = if cur_cltv == starting_htlc_offset { hop.cltv_expiry_delta + starting_htlc_offset } else { cur_cltv }; let cltv = if cur_cltv == starting_htlc_offset { hop.cltv_expiry_delta + starting_htlc_offset } else { cur_cltv };
res[idx] = msgs::OnionHopData { res.insert(0, msgs::OnionHopData {
realm: 0, realm: 0,
data: msgs::OnionRealm0HopData { data: msgs::OnionRealm0HopData {
short_channel_id: last_short_channel_id, short_channel_id: last_short_channel_id,
@ -131,7 +128,7 @@ pub(super) fn build_onion_payloads(route: &Route, starting_htlc_offset: u32) ->
outgoing_cltv_value: cltv, outgoing_cltv_value: cltv,
}, },
hmac: [0; 32], hmac: [0; 32],
}; });
cur_value_msat += hop.fee_msat; cur_value_msat += hop.fee_msat;
if cur_value_msat >= 21000000 * 100000000 * 1000 { if cur_value_msat >= 21000000 * 100000000 * 1000 {
return Err(APIError::RouteError{err: "Channel fees overflowed?!"}); return Err(APIError::RouteError{err: "Channel fees overflowed?!"});
@ -147,8 +144,8 @@ pub(super) fn build_onion_payloads(route: &Route, starting_htlc_offset: u32) ->
#[inline] #[inline]
fn shift_arr_right(arr: &mut [u8; 20*65]) { fn shift_arr_right(arr: &mut [u8; 20*65]) {
unsafe { for i in (65..20*65).rev() {
ptr::copy(arr[0..].as_ptr(), arr[65..].as_mut_ptr(), 19*65); arr[i] = arr[i-65];
} }
for i in 0..65 { for i in 0..65 {
arr[i] = 0; arr[i] = 0;

View file

@ -1,7 +0,0 @@
/// A simple marker trait that indicates a type requires no deallocation. Implies we can set_len()
/// on a Vec of these things and will be safe to overwrite them with =.
pub unsafe trait NoDealloc {}
/// Just call with test_no_dealloc::<Type>(None)
#[inline]
pub fn test_no_dealloc<T : NoDealloc>(_: Option<T>) { }

View file

@ -9,7 +9,6 @@ pub(crate) mod chacha20;
#[cfg(not(feature = "fuzztarget"))] #[cfg(not(feature = "fuzztarget"))]
pub(crate) mod poly1305; pub(crate) mod poly1305;
pub(crate) mod chacha20poly1305rfc; pub(crate) mod chacha20poly1305rfc;
pub(crate) mod internal_traits;
pub(crate) mod transaction_utils; pub(crate) mod transaction_utils;
#[macro_use] #[macro_use]