Skip to content

Commit e900d68

Browse files
committed
Remove all instance of .expect with proper error handling
Doing this improperly can crash the Erlang VM. Every instnace of this where the end type is a result type or something analygous (like the Term<'a> type) now is expectless. More work needs to be done for functions that do not fit this architype which is 13 methods in arm/src
1 parent 256be67 commit e900d68

File tree

1 file changed

+54
-78
lines changed

1 file changed

+54
-78
lines changed

arm/src/rustler_util.rs

Lines changed: 54 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -126,25 +126,22 @@ impl<'a> RustlerDecoder<'a> for Binary<'a> {
126126
impl RustlerEncoder for Vec<u8> {
127127
fn rustler_encode<'a>(&self, env: Env<'a>) -> Result<Term<'a>, Error> {
128128
let mut erl_bin = OwnedBinary::new(self.len())
129-
.ok_or("could not create OwnedBinary")
130-
.expect("could not allocate binary");
129+
.ok_or_else(|| Error::RaiseTerm(Box::new("could not create OwnedBinary")))?;
131130
let _ = erl_bin.as_mut_slice().write_all(&self.as_slice());
132131
Ok(erl_bin.release(env).to_term(env))
133132
}
134133
}
135134

136135
impl<'a> RustlerDecoder<'a> for Vec<u8> {
137136
fn rustler_decode(term: Term<'a>) -> NifResult<Self> {
138-
let binary: Binary = term.decode().expect("failed to decode binary");
139-
Ok(binary.as_slice().to_vec())
137+
term.decode::<Binary>().map(|t| t.to_vec())
140138
}
141139
}
142140

143141
impl RustlerEncoder for Vec<u32> {
144142
fn rustler_encode<'a>(&self, env: Env<'a>) -> Result<Term<'a>, Error> {
145143
let mut erl_bin: OwnedBinary = OwnedBinary::new(self.len() * 4)
146-
.ok_or("could not create OwnedBinary")
147-
.expect("could not allocate binary");
144+
.ok_or_else(|| Error::RaiseTerm(Box::new("could not create OwnedBinary")))?;
148145
let bytes: &[u8] = words_to_bytes(self.as_slice());
149146
let _ = erl_bin.as_mut_slice().write_all(bytes);
150147
Ok(erl_bin.release(env).to_term(env))
@@ -153,10 +150,8 @@ impl RustlerEncoder for Vec<u32> {
153150

154151
impl<'a> RustlerDecoder<'a> for Vec<u32> {
155152
fn rustler_decode(term: Term<'a>) -> NifResult<Self> {
156-
let binary: Binary = term.decode().expect("failed to decode binary");
157-
let bytes: &[u8] = binary.as_slice();
158-
let words: Vec<u32> = bytes_to_words(bytes);
159-
Ok(words)
153+
term.decode::<Binary>()
154+
.map(|b| bytes_to_words(b.as_slice()))
160155
}
161156
}
162157

@@ -175,9 +170,7 @@ impl<'a> RustlerDecoder<'a> for Digest {
175170

176171
impl RustlerEncoder for AffinePoint {
177172
fn rustler_encode<'a>(&self, env: Env<'a>) -> Result<Term<'a>, Error> {
178-
bincode::serialize(self)
179-
.expect("failed to encode AffinePoint")
180-
.rustler_encode(env)
173+
bincode_serialize(self)?.rustler_encode(env)
181174
}
182175
}
183176

@@ -190,9 +183,7 @@ impl<'a> RustlerDecoder<'a> for AffinePoint {
190183

191184
impl RustlerEncoder for Signature {
192185
fn rustler_encode<'a>(&self, env: Env<'a>) -> Result<Term<'a>, Error> {
193-
bincode::serialize(self)
194-
.expect("failed to encode Signature")
195-
.rustler_encode(env)
186+
bincode_serialize(self)?.rustler_encode(env)
196187
}
197188
}
198189

@@ -213,7 +204,7 @@ impl RustlerEncoder for RecoveryId {
213204
impl<'a> RustlerDecoder<'a> for RecoveryId {
214205
fn rustler_decode(term: Term<'a>) -> NifResult<Self> {
215206
let byte: u8 = term.decode()?;
216-
Ok(RecoveryId::from_byte(byte).expect("invalid RecoveryId"))
207+
RecoveryId::from_byte(byte).ok_or_else(|| Error::Term(Box::new("RecoveryId")))
217208
}
218209
}
219210

@@ -228,7 +219,7 @@ impl RustlerEncoder for SigningKey {
228219
impl<'a> RustlerDecoder<'a> for SigningKey {
229220
fn rustler_decode(term: Term<'a>) -> NifResult<Self> {
230221
let bytez: Vec<u8> = RustlerDecoder::rustler_decode(term)?;
231-
Ok(SigningKey::from_slice(&bytez).expect("invalid SigningKey"))
222+
SigningKey::from_slice(&bytez).map_err(|_| Error::Term(Box::new("invalid SigningKey")))
232223
}
233224
}
234225

@@ -261,8 +252,8 @@ impl<'a> RustlerDecoder<'a> for ComplianceUnit {
261252

262253
impl Encoder for ComplianceUnit {
263254
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
264-
let encoded = self.rustler_encode(env);
265-
encoded.expect("failed to encode ComplianceUnit")
255+
self.rustler_encode(env)
256+
.unwrap_or_else(|_e| env.error_tuple("failed to encode ComplianceUnit"))
266257
}
267258
}
268259

@@ -304,8 +295,8 @@ impl<'a> RustlerDecoder<'a> for ExpirableBlob {
304295

305296
impl Encoder for ExpirableBlob {
306297
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
307-
let encoded = self.rustler_encode(env);
308-
encoded.expect("failed to encode ExpirableBlob")
298+
self.rustler_encode(env)
299+
.unwrap_or_else(|_e| env.error_tuple("failed to encode ExpirableBlob"))
309300
}
310301
}
311302

@@ -365,8 +356,8 @@ impl<'a> RustlerDecoder<'a> for AppData {
365356

366357
impl Encoder for AppData {
367358
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
368-
let encoded = self.rustler_encode(env);
369-
encoded.expect("failed to encode AppData")
359+
self.rustler_encode(env)
360+
.unwrap_or_else(|_e| env.error_tuple("failed to encode AppData"))
370361
}
371362
}
372363

@@ -459,8 +450,8 @@ impl<'a> RustlerDecoder<'a> for LogicInstance {
459450

460451
impl Encoder for LogicVerifierInputs {
461452
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
462-
let encoded = self.rustler_encode(env);
463-
encoded.expect("failed to encode LogicVerifierInputs")
453+
self.rustler_encode(env)
454+
.unwrap_or_else(|_| env.error_tuple("failed to encode LogicVerifierInputs"))
464455
}
465456
}
466457

@@ -508,8 +499,8 @@ impl<'a> RustlerDecoder<'a> for Action {
508499

509500
impl Encoder for Action {
510501
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
511-
let encoded = self.rustler_encode(env);
512-
encoded.expect("failed to encode Action")
502+
self.rustler_encode(env)
503+
.unwrap_or_else(|_e| env.error_tuple("failed to encode Action"))
513504
}
514505
}
515506

@@ -529,11 +520,8 @@ impl RustlerEncoder for MerkleTree {
529520
let encoded_vec: Term = self
530521
.leaves
531522
.iter()
532-
.map(|leaf| {
533-
leaf.rustler_encode(env)
534-
.expect("could not encode MerkleTree leaf")
535-
})
536-
.collect::<Vec<Term>>()
523+
.map(|leaf| leaf.rustler_encode(env))
524+
.collect::<NifResult<Vec<Term>>>()?
537525
.encode(env);
538526

539527
let map = map_new(env)
@@ -547,22 +535,21 @@ impl RustlerEncoder for MerkleTree {
547535
impl<'a> RustlerDecoder<'a> for MerkleTree {
548536
fn rustler_decode(term: Term<'a>) -> NifResult<Self> {
549537
let leaves_term = term.map_get(at_leaves().encode(term.get_env()))?;
550-
let leaves_terms =
551-
Vec::<Term>::decode(leaves_term).expect("failed to decode MerkleTree leaves");
538+
let leaves_terms = Vec::<Term>::decode(leaves_term)?;
552539

553540
let leaves: Vec<Digest> = leaves_terms
554541
.iter()
555-
.map(|term| RustlerDecoder::rustler_decode(*term).expect("failed to decode leaf"))
556-
.collect();
542+
.map(|term| RustlerDecoder::rustler_decode(*term))
543+
.collect::<NifResult<Vec<_>>>()?;
557544

558545
Ok(MerkleTree { leaves })
559546
}
560547
}
561548

562549
impl Encoder for MerkleTree {
563550
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
564-
let encoded = self.rustler_encode(env);
565-
encoded.expect("failed to encode MerkleTree")
551+
self.rustler_encode(env)
552+
.unwrap_or_else(|_e| env.error_tuple("failed to encode MerkleTree"))
566553
}
567554
}
568555

@@ -581,44 +568,33 @@ impl RustlerEncoder for MerklePath {
581568
.0
582569
.iter()
583570
.map(|(hash, is_right)| {
584-
let hash_term = hash
585-
.rustler_encode(env)
586-
.expect("could not encode MerklePath hash");
587-
let is_right_term = is_right.encode(env);
588-
(hash_term, is_right_term).encode(env)
571+
Ok((hash.rustler_encode(env)?, is_right.encode(env)).encode(env))
589572
})
590-
.collect();
573+
.collect::<NifResult<Vec<Term>>>()?;
591574

592575
Ok(encoded_vec.encode(env))
593576
}
594577
}
595578

596579
impl<'a> RustlerDecoder<'a> for MerklePath {
597580
fn rustler_decode(term: Term<'a>) -> NifResult<Self> {
598-
let path_terms = Vec::<Term>::decode(term).expect("failed to decode MerklePath list");
599-
600-
let path: Vec<(Digest, bool)> = path_terms
581+
Vec::<Term>::decode(term)?
601582
.iter()
602583
.map(|term| {
603-
let tuple: (Term, Term) = term.decode().expect("failed to decode MerklePath tuple");
604-
let hash: Digest = RustlerDecoder::rustler_decode(tuple.0)
605-
.expect("failed to decode MerklePath hash");
606-
let is_right: bool = tuple
607-
.1
608-
.decode()
609-
.expect("failed to decode MerklePath boolean");
610-
(hash, is_right)
584+
let tuple: (Term, Term) = term.decode()?;
585+
let hash: Digest = RustlerDecoder::rustler_decode(tuple.0)?;
586+
let is_right: bool = tuple.1.decode()?;
587+
Ok((hash, is_right))
611588
})
612-
.collect();
613-
614-
Ok(MerklePath(path))
589+
.collect::<NifResult<Vec<(Digest, bool)>>>()
590+
.map(MerklePath)
615591
}
616592
}
617593

618594
impl Encoder for MerklePath {
619595
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
620-
let encoded = self.rustler_encode(env);
621-
encoded.expect("failed to encode MerklePath")
596+
self.rustler_encode(env)
597+
.unwrap_or_else(|_e| env.error_tuple("failed to encode MerklePath"))
622598
}
623599
}
624600

@@ -711,8 +687,8 @@ impl<'a> RustlerDecoder<'a> for ComplianceInstance {
711687

712688
impl Encoder for ComplianceInstance {
713689
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
714-
let encoded = self.rustler_encode(env);
715-
encoded.expect("failed to encode ComplianceInstance")
690+
self.rustler_encode(env)
691+
.unwrap_or_else(|_| env.error_tuple("failed to encode compliance instance"))
716692
}
717693
}
718694

@@ -785,8 +761,8 @@ impl<'a> RustlerDecoder<'a> for ComplianceWitness {
785761

786762
impl Encoder for ComplianceWitness {
787763
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
788-
let encoded = self.rustler_encode(env);
789-
encoded.expect("failed to encode ComplianceWitness")
764+
self.rustler_encode(env)
765+
.unwrap_or_else(|_| env.error_tuple("failed to encode compliance witness"))
790766
}
791767
}
792768

@@ -816,8 +792,8 @@ impl<'a> RustlerDecoder<'a> for NullifierKeyCommitment {
816792

817793
impl Encoder for NullifierKeyCommitment {
818794
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
819-
let encoded = self.rustler_encode(env);
820-
encoded.expect("failed to encode NullifierKeyCommitment")
795+
self.rustler_encode(env)
796+
.unwrap_or_else(|_| env.error_tuple("failed to encode nullifier"))
821797
}
822798
}
823799

@@ -846,8 +822,8 @@ impl<'a> RustlerDecoder<'a> for NullifierKey {
846822

847823
impl Encoder for NullifierKey {
848824
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
849-
let encoded = self.rustler_encode(env);
850-
encoded.expect("failed to encode NullifierKey")
825+
self.rustler_encode(env)
826+
.unwrap_or_else(|_| env.error_tuple("failed to encode NullifierKey"))
851827
}
852828
}
853829

@@ -939,8 +915,8 @@ impl<'a> RustlerDecoder<'a> for Resource {
939915

940916
impl Encoder for Resource {
941917
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
942-
let encoded = self.rustler_encode(env);
943-
encoded.expect("failed to encode Resource")
918+
self.rustler_encode(env)
919+
.unwrap_or_else(|_| env.error_tuple("failed to encode Resource"))
944920
}
945921
}
946922

@@ -981,8 +957,8 @@ impl<'a> RustlerDecoder<'a> for DeltaProof {
981957

982958
impl Encoder for DeltaProof {
983959
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
984-
let encoded = self.rustler_encode(env);
985-
encoded.expect("failed to encode DeltaProof")
960+
self.rustler_encode(env)
961+
.unwrap_or_else(|_| env.error_tuple("failed to encode DeltaProof"))
986962
}
987963
}
988964

@@ -1019,8 +995,8 @@ impl<'a> RustlerDecoder<'a> for DeltaWitness {
1019995

1020996
impl Encoder for DeltaWitness {
1021997
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
1022-
let encoded = self.rustler_encode(env);
1023-
encoded.expect("failed to encode DeltaWitness")
998+
self.rustler_encode(env)
999+
.unwrap_or_else(|_| env.error_tuple("failed to encode DeltaWitness"))
10241000
}
10251001
}
10261002

@@ -1073,7 +1049,7 @@ impl<'a> RustlerDecoder<'a> for LogicVerifier {
10731049
impl Encoder for LogicVerifier {
10741050
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
10751051
let encoded = self.rustler_encode(env);
1076-
encoded.expect("failed to encode LogicVerifier")
1052+
encoded.unwrap_or_else(|_e| env.error_tuple("failed to encode LogicVerifier"))
10771053
}
10781054
}
10791055

@@ -1131,8 +1107,8 @@ impl<'a> RustlerDecoder<'a> for Transaction {
11311107

11321108
impl Encoder for Transaction {
11331109
fn encode<'a>(&self, env: Env<'a>) -> Term<'a> {
1134-
let encoded = self.rustler_encode(env);
1135-
encoded.expect("failed to encode Transaction")
1110+
self.rustler_encode(env)
1111+
.unwrap_or_else(|_| env.error_tuple("failed to encode Transaction"))
11361112
}
11371113
}
11381114

0 commit comments

Comments
 (0)