Skip to content

Commit 6f6ddb3

Browse files
committed
Don't panic on reading invalid seed file
1 parent 6912d0b commit 6f6ddb3

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
@@ -120,6 +120,7 @@ enum NodeError {
120120
[Error]
121121
enum BuildError {
122122
"InvalidSeedBytes",
123+
"InvalidSeedFile",
123124
"InvalidSystemTime",
124125
"ReadFailed",
125126
"WriteFailed",

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
@@ -39,25 +39,53 @@ pub fn generate_entropy_mnemonic() -> Mnemonic {
3939
Mnemonic::from_entropy(&entropy).unwrap()
4040
}
4141

42-
pub(crate) fn read_or_generate_seed_file(keys_seed_path: &str) -> [u8; WALLET_KEYS_SEED_LEN] {
42+
pub(crate) fn read_or_generate_seed_file<L: Deref>(
43+
keys_seed_path: &str, logger: L,
44+
) -> std::io::Result<[u8; WALLET_KEYS_SEED_LEN]>
45+
where
46+
L::Target: Logger,
47+
{
4348
if Path::new(&keys_seed_path).exists() {
44-
let seed = fs::read(keys_seed_path).expect("Failed to read keys seed file");
45-
assert_eq!(
46-
seed.len(),
47-
WALLET_KEYS_SEED_LEN,
48-
"Failed to read keys seed file: unexpected length"
49-
);
49+
let seed = fs::read(keys_seed_path).map_err(|e| {
50+
log_error!(logger, "Failed to read keys seed file: {}", keys_seed_path);
51+
e
52+
})?;
53+
54+
if seed.len() != WALLET_KEYS_SEED_LEN {
55+
log_error!(
56+
logger,
57+
"Failed to read keys seed file due to invalid length: {}",
58+
keys_seed_path
59+
);
60+
return Err(std::io::Error::new(
61+
std::io::ErrorKind::InvalidData,
62+
"Failed to read keys seed file due to invalid length",
63+
));
64+
}
65+
5066
let mut key = [0; WALLET_KEYS_SEED_LEN];
5167
key.copy_from_slice(&seed);
52-
key
68+
Ok(key)
5369
} else {
5470
let mut key = [0; WALLET_KEYS_SEED_LEN];
5571
thread_rng().fill_bytes(&mut key);
5672

57-
let mut f = fs::File::create(keys_seed_path).expect("Failed to create keys seed file");
58-
f.write_all(&key).expect("Failed to write node keys seed to disk");
59-
f.sync_all().expect("Failed to sync node keys seed to disk");
60-
key
73+
let mut f = fs::File::create(keys_seed_path).map_err(|e| {
74+
log_error!(logger, "Failed to create keys seed file: {}", keys_seed_path);
75+
e
76+
})?;
77+
78+
f.write_all(&key).map_err(|e| {
79+
log_error!(logger, "Failed to write node keys seed to disk: {}", keys_seed_path);
80+
e
81+
})?;
82+
83+
f.sync_all().map_err(|e| {
84+
log_error!(logger, "Failed to sync node keys seed to disk: {}", keys_seed_path);
85+
e
86+
})?;
87+
88+
Ok(key)
6189
}
6290
}
6391

0 commit comments

Comments
 (0)