Skip to content

Commit 8da3d73

Browse files
committed
Don't panic on reading invalid seed file
1 parent a80a929 commit 8da3d73

File tree

3 files changed

+49
-15
lines changed

3 files changed

+49
-15
lines changed

bindings/ldk_node.udl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ enum NodeError {
116116
[Error]
117117
enum BuildError {
118118
"InvalidSeedBytes",
119+
"InvalidSeedFile",
119120
"InvalidSystemTime",
120121
"IOReadFailed",
121122
"IOWriteFailed",

src/builder.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,10 @@ enum GossipSourceConfig {
7272
/// [`Node`]: crate::Node
7373
#[derive(Debug, Clone)]
7474
pub enum BuildError {
75-
/// The given seed bytes are invalid, e.g, are of invalid length.
75+
/// The given seed bytes are invalid, e.g., have invalid length.
7676
InvalidSeedBytes,
77+
/// The given seed file is invalid, e.g., has invalid length, or could not be read.
78+
InvalidSeedFile,
7779
/// The current system time is invalid, clocks might have gone backwards.
7880
InvalidSystemTime,
7981
/// We failed to read data from the [`KVStore`].
@@ -92,6 +94,7 @@ impl fmt::Display for BuildError {
9294
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9395
match *self {
9496
Self::InvalidSeedBytes => write!(f, "Given seed bytes are invalid."),
97+
Self::InvalidSeedFile => write!(f, "Given seed file is invalid or could not be read."),
9598
Self::InvalidSystemTime => {
9699
write!(f, "System time is invalid. Clocks might have gone back in time.")
97100
}
@@ -389,7 +392,8 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
389392
let seed_bytes = match entropy_source_config {
390393
Some(EntropySourceConfig::SeedBytes(bytes)) => bytes.clone(),
391394
Some(EntropySourceConfig::SeedFile(seed_path)) => {
392-
io::utils::read_or_generate_seed_file(seed_path)
395+
io::utils::read_or_generate_seed_file(seed_path, Arc::clone(&logger))
396+
.map_err(|_| BuildError::InvalidSeedFile)?
393397
}
394398
Some(EntropySourceConfig::Bip39Mnemonic { mnemonic, passphrase }) => match passphrase {
395399
Some(passphrase) => mnemonic.to_seed(passphrase),
@@ -398,7 +402,8 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
398402
None => {
399403
// Default to read or generate from the default location generate a seed file.
400404
let seed_path = format!("{}/keys_seed", config.storage_dir_path);
401-
io::utils::read_or_generate_seed_file(&seed_path)
405+
io::utils::read_or_generate_seed_file(&seed_path, Arc::clone(&logger))
406+
.map_err(|_| BuildError::InvalidSeedFile)?
402407
}
403408
};
404409

src/io/utils.rs

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,53 @@ use std::sync::Arc;
2424

2525
use super::KVStore;
2626

27-
pub(crate) fn read_or_generate_seed_file(keys_seed_path: &str) -> [u8; WALLET_KEYS_SEED_LEN] {
27+
pub(crate) fn read_or_generate_seed_file<L: Deref>(
28+
keys_seed_path: &str, logger: L,
29+
) -> std::io::Result<[u8; WALLET_KEYS_SEED_LEN]>
30+
where
31+
L::Target: Logger,
32+
{
2833
if Path::new(&keys_seed_path).exists() {
29-
let seed = fs::read(keys_seed_path).expect("Failed to read keys seed file");
30-
assert_eq!(
31-
seed.len(),
32-
WALLET_KEYS_SEED_LEN,
33-
"Failed to read keys seed file: unexpected length"
34-
);
34+
let seed = fs::read(keys_seed_path).map_err(|e| {
35+
log_error!(logger, "Failed to read keys seed file: {}", keys_seed_path);
36+
e
37+
})?;
38+
39+
if seed.len() != WALLET_KEYS_SEED_LEN {
40+
log_error!(
41+
logger,
42+
"Failed to read keys seed file due to invalid length: {}",
43+
keys_seed_path
44+
);
45+
return Err(std::io::Error::new(
46+
std::io::ErrorKind::InvalidData,
47+
"Failed to read keys seed file due to invalid length",
48+
));
49+
}
50+
3551
let mut key = [0; WALLET_KEYS_SEED_LEN];
3652
key.copy_from_slice(&seed);
37-
key
53+
Ok(key)
3854
} else {
3955
let mut key = [0; WALLET_KEYS_SEED_LEN];
4056
thread_rng().fill_bytes(&mut key);
4157

42-
let mut f = fs::File::create(keys_seed_path).expect("Failed to create keys seed file");
43-
f.write_all(&key).expect("Failed to write node keys seed to disk");
44-
f.sync_all().expect("Failed to sync node keys seed to disk");
45-
key
58+
let mut f = fs::File::create(keys_seed_path).map_err(|e| {
59+
log_error!(logger, "Failed to create keys seed file: {}", keys_seed_path);
60+
e
61+
})?;
62+
63+
f.write_all(&key).map_err(|e| {
64+
log_error!(logger, "Failed to write node keys seed to disk: {}", keys_seed_path);
65+
e
66+
})?;
67+
68+
f.sync_all().map_err(|e| {
69+
log_error!(logger, "Failed to sync node keys seed to disk: {}", keys_seed_path);
70+
e
71+
})?;
72+
73+
Ok(key)
4674
}
4775
}
4876

0 commit comments

Comments
 (0)