Skip to content

Commit 8fe9682

Browse files
Fix C-Bindings not properly handling the event of a null decoder (#37)
1 parent 2bf9c84 commit 8fe9682

File tree

2 files changed

+52
-31
lines changed

2 files changed

+52
-31
lines changed

c_bindings/decoder.rs

+51-30
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
#![allow(clippy::not_unsafe_ptr_arg_deref)]
1818

1919
use crate::types;
20-
use types::{Kind, Status, Buffer};
20+
use types::{Buffer, Kind, Status};
2121

22+
use polyglot_rs::Decoder as PolyglotDecoder;
2223
use std::ffi::{c_char, CString};
2324
use std::io::Cursor;
24-
use polyglot_rs::{Decoder as PolyglotDecoder};
2525

2626
#[repr(C)]
2727
#[derive(Debug)]
@@ -30,7 +30,11 @@ pub struct Decoder {
3030
}
3131

3232
#[no_mangle]
33-
pub extern "C" fn polyglot_new_decoder(status: *mut Status, buffer_pointer: *mut u8, buffer_size: u32) -> *mut Decoder {
33+
pub extern "C" fn polyglot_new_decoder(
34+
status: *mut Status,
35+
buffer_pointer: *mut u8,
36+
buffer_size: u32,
37+
) -> *mut Decoder {
3438
Status::check_not_null(status);
3539

3640
if buffer_pointer.is_null() {
@@ -68,27 +72,30 @@ pub extern "C" fn polyglot_decode_none(status: *mut Status, decoder: *mut Decode
6872
}
6973
}
7074

71-
unsafe {
72-
(*decoder).cursor.decode_none()
73-
}
75+
unsafe { (*decoder).cursor.decode_none() }
7476
}
7577

7678
#[no_mangle]
77-
pub extern "C" fn polyglot_decode_array(status: *mut Status, decoder: *mut Decoder, array_kind: Kind) -> u32 {
79+
pub extern "C" fn polyglot_decode_array(
80+
status: *mut Status,
81+
decoder: *mut Decoder,
82+
array_kind: Kind,
83+
) -> u32 {
7884
Status::check_not_null(status);
7985

8086
if decoder.is_null() {
8187
unsafe {
8288
*status = Status::NullPointer;
8389
}
90+
return 0;
8491
}
8592

8693
unsafe {
8794
match (*decoder).cursor.decode_array(array_kind.into()) {
88-
Ok(size ) => {
95+
Ok(size) => {
8996
*status = Status::Pass;
9097
size as u32
91-
},
98+
}
9299
Err(_) => {
93100
*status = Status::Fail;
94101
0
@@ -98,21 +105,30 @@ pub extern "C" fn polyglot_decode_array(status: *mut Status, decoder: *mut Decod
98105
}
99106

100107
#[no_mangle]
101-
pub extern "C" fn polyglot_decode_map(status: *mut Status, decoder: *mut Decoder, key_kind: Kind, value_kind: Kind) -> u32 {
108+
pub extern "C" fn polyglot_decode_map(
109+
status: *mut Status,
110+
decoder: *mut Decoder,
111+
key_kind: Kind,
112+
value_kind: Kind,
113+
) -> u32 {
102114
Status::check_not_null(status);
103115

104116
if decoder.is_null() {
105117
unsafe {
106118
*status = Status::NullPointer;
107119
}
120+
return 0;
108121
}
109122

110123
unsafe {
111-
match (*decoder).cursor.decode_map(key_kind.into(), value_kind.into()) {
112-
Ok(size ) => {
124+
match (*decoder)
125+
.cursor
126+
.decode_map(key_kind.into(), value_kind.into())
127+
{
128+
Ok(size) => {
113129
*status = Status::Pass;
114130
size as u32
115-
},
131+
}
116132
Err(_) => {
117133
*status = Status::Fail;
118134
0
@@ -129,17 +145,18 @@ pub extern "C" fn polyglot_decode_bytes(status: *mut Status, decoder: *mut Decod
129145
unsafe {
130146
*status = Status::NullPointer;
131147
}
148+
return std::ptr::null_mut();
132149
}
133150

134151
unsafe {
135152
match (*decoder).cursor.decode_bytes() {
136-
Ok(value ) => {
153+
Ok(value) => {
137154
*status = Status::Pass;
138155
let mut boxed_value = value.into_boxed_slice();
139156
let buffer = Buffer::new_raw(boxed_value.as_mut_ptr(), boxed_value.len() as u32);
140157
std::mem::forget(boxed_value);
141158
buffer
142-
},
159+
}
143160
Err(_) => {
144161
*status = Status::Fail;
145162
std::ptr::null_mut()
@@ -152,7 +169,8 @@ pub extern "C" fn polyglot_decode_bytes(status: *mut Status, decoder: *mut Decod
152169
pub extern "C" fn polyglot_free_decode_bytes(buffer: *mut Buffer) {
153170
if !buffer.is_null() {
154171
unsafe {
155-
let boxed_value = std::slice::from_raw_parts_mut((*buffer).data, (*buffer).length as usize) ;
172+
let boxed_value =
173+
std::slice::from_raw_parts_mut((*buffer).data, (*buffer).length as usize);
156174
let value = boxed_value.as_mut_ptr();
157175
drop(Box::from_raw(value));
158176
drop(Box::from_raw(buffer));
@@ -161,7 +179,10 @@ pub extern "C" fn polyglot_free_decode_bytes(buffer: *mut Buffer) {
161179
}
162180

163181
#[no_mangle]
164-
pub extern "C" fn polyglot_decode_string(status: *mut Status, decoder: *mut Decoder) -> *mut c_char{
182+
pub extern "C" fn polyglot_decode_string(
183+
status: *mut Status,
184+
decoder: *mut Decoder,
185+
) -> *mut c_char {
165186
Status::check_not_null(status);
166187

167188
if decoder.is_null() {
@@ -184,7 +205,7 @@ pub extern "C" fn polyglot_decode_string(status: *mut Status, decoder: *mut Deco
184205
std::ptr::null_mut()
185206
}
186207
};
187-
},
208+
}
188209
Err(_) => {
189210
*status = Status::Fail;
190211
std::ptr::null_mut()
@@ -203,7 +224,7 @@ pub extern "C" fn polyglot_free_decode_string(c_string: *mut c_char) {
203224
}
204225

205226
#[no_mangle]
206-
pub extern "C" fn polyglot_decode_error(status: *mut Status, decoder: *mut Decoder) -> *mut c_char{
227+
pub extern "C" fn polyglot_decode_error(status: *mut Status, decoder: *mut Decoder) -> *mut c_char {
207228
Status::check_not_null(status);
208229

209230
if decoder.is_null() {
@@ -226,7 +247,7 @@ pub extern "C" fn polyglot_decode_error(status: *mut Status, decoder: *mut Decod
226247
std::ptr::null_mut()
227248
}
228249
};
229-
},
250+
}
230251
Err(_) => {
231252
*status = Status::Fail;
232253
std::ptr::null_mut()
@@ -260,7 +281,7 @@ pub extern "C" fn polyglot_decode_bool(status: *mut Status, decoder: *mut Decode
260281
Ok(value) => {
261282
*status = Status::Pass;
262283
value
263-
},
284+
}
264285
Err(_) => {
265286
*status = Status::Fail;
266287
false
@@ -285,7 +306,7 @@ pub extern "C" fn polyglot_decode_u8(status: *mut Status, decoder: *mut Decoder)
285306
Ok(value) => {
286307
*status = Status::Pass;
287308
value
288-
},
309+
}
289310
Err(_) => {
290311
*status = Status::Fail;
291312
0
@@ -310,7 +331,7 @@ pub extern "C" fn polyglot_decode_u16(status: *mut Status, decoder: *mut Decoder
310331
Ok(value) => {
311332
*status = Status::Pass;
312333
value
313-
},
334+
}
314335
Err(_) => {
315336
*status = Status::Fail;
316337
0
@@ -335,7 +356,7 @@ pub extern "C" fn polyglot_decode_u32(status: *mut Status, decoder: *mut Decoder
335356
Ok(value) => {
336357
*status = Status::Pass;
337358
value
338-
},
359+
}
339360
Err(_) => {
340361
*status = Status::Fail;
341362
0
@@ -360,7 +381,7 @@ pub extern "C" fn polyglot_decode_u64(status: *mut Status, decoder: *mut Decoder
360381
Ok(value) => {
361382
*status = Status::Pass;
362383
value
363-
},
384+
}
364385
Err(_) => {
365386
*status = Status::Fail;
366387
0
@@ -385,7 +406,7 @@ pub extern "C" fn polyglot_decode_i32(status: *mut Status, decoder: *mut Decoder
385406
Ok(value) => {
386407
*status = Status::Pass;
387408
value
388-
},
409+
}
389410
Err(_) => {
390411
*status = Status::Fail;
391412
0
@@ -410,7 +431,7 @@ pub extern "C" fn polyglot_decode_i64(status: *mut Status, decoder: *mut Decoder
410431
Ok(value) => {
411432
*status = Status::Pass;
412433
value
413-
},
434+
}
414435
Err(_) => {
415436
*status = Status::Fail;
416437
0
@@ -435,7 +456,7 @@ pub extern "C" fn polyglot_decode_f32(status: *mut Status, decoder: *mut Decoder
435456
Ok(value) => {
436457
*status = Status::Pass;
437458
value
438-
},
459+
}
439460
Err(_) => {
440461
*status = Status::Fail;
441462
0.0
@@ -460,11 +481,11 @@ pub extern "C" fn polyglot_decode_f64(status: *mut Status, decoder: *mut Decoder
460481
Ok(value) => {
461482
*status = Status::Pass;
462483
value
463-
},
484+
}
464485
Err(_) => {
465486
*status = Status::Fail;
466487
0.0
467488
}
468489
}
469490
}
470-
}
491+
}

c_bindings/encoder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -454,4 +454,4 @@ pub extern "C" fn polyglot_encode_f64(status: *mut Status, encoder: *mut Encoder
454454
},
455455
}
456456
}
457-
}
457+
}

0 commit comments

Comments
 (0)