Skip to content
This repository was archived by the owner on Jul 11, 2021. It is now read-only.

Commit 7fde6c0

Browse files
committed
check if input string is valid utf8, namely check that it does not contains NULL bytes
1 parent ba00b44 commit 7fde6c0

File tree

7 files changed

+205
-44
lines changed

7 files changed

+205
-44
lines changed

Cargo.lock

+7-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rediSQL"
3-
version = "1.0.2"
3+
version = "1.0.3-rc01"
44
authors = ["Simone Mosciatti <[email protected]>"]
55

66
[lib]

redisql_lib/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "redisql_lib"
3-
version = "0.5.4"
3+
version = "0.5.5-rc01"
44
authors = ["Simone Mosciatti <[email protected]>"]
55

66
[build-dependencies]

redisql_lib/src/redis.rs

+16-10
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use std::io::{BufReader, Read, Write};
1313
use std::os::raw::{c_char, c_long};
1414
use std::slice;
1515
use std::str;
16-
use std::string;
1716
use std::sync::mpsc::{Receiver, RecvError, Sender};
1817
use std::sync::{Arc, Mutex, MutexGuard, RwLock};
1918

@@ -415,38 +414,45 @@ fn reply_with_error(
415414
}
416415

417416
pub fn create_argument(
418-
ctx: *mut rm::ffi::RedisModuleCtx,
419417
argv: *mut *mut rm::ffi::RedisModuleString,
420418
argc: i32,
421-
) -> (rm::Context, Vec<&'static str>) {
422-
let context = rm::Context::new(ctx);
423-
let argvector = parse_args(argv, argc).unwrap();
424-
(context, argvector)
419+
) -> Result<Vec<&'static str>, RediSQLError> {
420+
match parse_args(argv, argc) {
421+
Err(e) => Err(RediSQLError::new(
422+
format!(
423+
"String valid up to byte number {}",
424+
e.valid_up_to()
425+
),
426+
"Got a non-valid UTF8 string as input".to_string(),
427+
)),
428+
Ok(argvector) => Ok(argvector),
429+
}
425430
}
426431

427432
fn parse_args(
428433
argv: *mut *mut rm::ffi::RedisModuleString,
429434
argc: i32,
430-
) -> Result<Vec<&'static str>, string::FromUtf8Error> {
435+
) -> Result<Vec<&'static str>, std::str::Utf8Error> {
431436
let mut args: Vec<&'static str> =
432437
Vec::with_capacity(argc as usize);
433438
for i in 0..argc {
434439
let redis_str = unsafe { *argv.offset(i as isize) };
435-
let arg = unsafe { string_ptr_len(redis_str) };
440+
let arg = unsafe { string_ptr_len(redis_str)? };
436441
args.push(arg);
437442
}
438443
Ok(args)
439444
}
440445

441446
pub unsafe fn string_ptr_len(
442447
str: *mut rm::ffi::RedisModuleString,
443-
) -> &'static str {
448+
) -> Result<&'static str, std::str::Utf8Error> {
444449
let mut len = 0;
445450
let base =
446451
rm::ffi::RedisModule_StringPtrLen.unwrap()(str, &mut len)
447452
as *mut u8;
448453
let slice = slice::from_raw_parts(base, len);
449-
str::from_utf8_unchecked(slice).trim_end_matches(char::from(0))
454+
let s = str::from_utf8(slice)?;
455+
Ok(s.trim_end_matches(char::from(0)))
450456
}
451457

452458
#[repr(C)]

src/commands.rs

+99-14
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,15 @@ pub extern "C" fn ExecStatement(
9191
argc: ::std::os::raw::c_int,
9292
) -> i32 {
9393
STATISTICS.exec_statement();
94-
let (context, argvector) = r::create_argument(ctx, argv, argc);
94+
95+
let context = r::rm::Context::new(ctx);
96+
let argvector = match r::create_argument(argv, argc) {
97+
Ok(argvector) => argvector,
98+
Err(error) => {
99+
STATISTICS.exec_statement_err();
100+
return error.reply(&context);
101+
}
102+
};
95103

96104
match argvector.len() {
97105
0...2 => {
@@ -166,7 +174,14 @@ pub extern "C" fn QueryStatement(
166174
argc: ::std::os::raw::c_int,
167175
) -> i32 {
168176
STATISTICS.query_statement();
169-
let (context, argvector) = r::create_argument(ctx, argv, argc);
177+
let context = r::rm::Context::new(ctx);
178+
let argvector = match r::create_argument(argv, argc) {
179+
Ok(argvector) => argvector,
180+
Err(error) => {
181+
STATISTICS.query_statement_err();
182+
return error.reply(&context);
183+
}
184+
};
170185

171186
match argvector.len() {
172187
0...2 => {
@@ -233,7 +248,14 @@ pub extern "C" fn QueryStatementInto(
233248
argc: ::std::os::raw::c_int,
234249
) -> i32 {
235250
STATISTICS.query_statement_into();
236-
let (context, argvector) = r::create_argument(ctx, argv, argc);
251+
let context = r::rm::Context::new(ctx);
252+
let argvector = match r::create_argument(argv, argc) {
253+
Ok(argvector) => argvector,
254+
Err(error) => {
255+
STATISTICS.query_statement_into_err();
256+
return error.reply(&context);
257+
}
258+
};
237259

238260
match argvector.len() {
239261
0...3 => {
@@ -307,7 +329,15 @@ pub extern "C" fn Exec(
307329
argc: ::std::os::raw::c_int,
308330
) -> i32 {
309331
STATISTICS.exec();
310-
let (context, argvector) = r::create_argument(ctx, argv, argc);
332+
let context = r::rm::Context::new(ctx);
333+
let argvector = match r::create_argument(argv, argc) {
334+
Ok(argvector) => argvector,
335+
Err(error) => {
336+
STATISTICS.exec_err();
337+
return error.reply(&context);
338+
}
339+
};
340+
311341
match argvector.len() {
312342
3 => with_ch_and_loopdata(
313343
context.as_ptr(),
@@ -384,7 +414,15 @@ pub extern "C" fn Query(
384414
argc: ::std::os::raw::c_int,
385415
) -> i32 {
386416
STATISTICS.query();
387-
let (context, argvector) = r::create_argument(ctx, argv, argc);
417+
let context = r::rm::Context::new(ctx);
418+
let argvector = match r::create_argument(argv, argc) {
419+
Ok(argvector) => argvector,
420+
Err(error) => {
421+
STATISTICS.query_err();
422+
return error.reply(&context);
423+
}
424+
};
425+
388426
match argvector.len() {
389427
3 => with_ch_and_loopdata(
390428
context.as_ptr(),
@@ -449,7 +487,15 @@ pub extern "C" fn QueryInto(
449487
argc: ::std::os::raw::c_int,
450488
) -> i32 {
451489
STATISTICS.query_into();
452-
let (context, argvector) = r::create_argument(ctx, argv, argc);
490+
let context = r::rm::Context::new(ctx);
491+
let argvector = match r::create_argument(argv, argc) {
492+
Ok(argvector) => argvector,
493+
Err(error) => {
494+
STATISTICS.query_into_err();
495+
return error.reply(&context);
496+
}
497+
};
498+
453499
match argvector.len() {
454500
4 => {
455501
let stream_name = argvector[1];
@@ -521,7 +567,15 @@ pub extern "C" fn CreateStatement(
521567
) -> i32 {
522568
STATISTICS.create_statement();
523569

524-
let (context, argvector) = r::create_argument(ctx, argv, argc);
570+
let context = r::rm::Context::new(ctx);
571+
let argvector = match r::create_argument(argv, argc) {
572+
Ok(argvector) => argvector,
573+
Err(error) => {
574+
STATISTICS.create_statement_err();
575+
return error.reply(&context);
576+
}
577+
};
578+
525579
match argvector.len() {
526580
4 => {
527581
with_ch_and_loopdata(
@@ -592,7 +646,15 @@ pub extern "C" fn UpdateStatement(
592646
argc: ::std::os::raw::c_int,
593647
) -> i32 {
594648
STATISTICS.update_statement();
595-
let (context, argvector) = r::create_argument(ctx, argv, argc);
649+
let context = r::rm::Context::new(ctx);
650+
let argvector = match r::create_argument(argv, argc) {
651+
Ok(argvector) => argvector,
652+
Err(error) => {
653+
STATISTICS.update_statement_err();
654+
return error.reply(&context);
655+
}
656+
};
657+
596658
match argvector.len() {
597659
4 => {
598660
with_ch_and_loopdata(
@@ -665,7 +727,16 @@ pub extern "C" fn DeleteStatement(
665727
argc: ::std::os::raw::c_int,
666728
) -> i32 {
667729
STATISTICS.delete_statement();
668-
let (context, argvector) = r::create_argument(ctx, argv, argc);
730+
731+
let context = r::rm::Context::new(ctx);
732+
let argvector = match r::create_argument(argv, argc) {
733+
Ok(argvector) => argvector,
734+
Err(error) => {
735+
STATISTICS.delete_statement_err();
736+
return error.reply(&context);
737+
}
738+
};
739+
669740
match argvector.len() {
670741
3 => with_ch_and_loopdata(
671742
context.as_ptr(),
@@ -737,7 +808,14 @@ pub extern "C" fn CreateDB(
737808
argc: ::std::os::raw::c_int,
738809
) -> i32 {
739810
STATISTICS.create_db();
740-
let (context, argvector) = r::create_argument(ctx, argv, argc);
811+
let context = r::rm::Context::new(ctx);
812+
let argvector = match r::create_argument(argv, argc) {
813+
Ok(argvector) => argvector,
814+
Err(error) => {
815+
STATISTICS.create_db_err();
816+
return error.reply(&context);
817+
}
818+
};
741819

742820
match argvector.len() {
743821
2 | 3 => {
@@ -895,7 +973,14 @@ pub extern "C" fn MakeCopy(
895973
) -> i32 {
896974
debug!("MakeCopy | Start");
897975
STATISTICS.copy();
898-
let (context, argvector) = r::create_argument(ctx, argv, argc);
976+
let context = r::rm::Context::new(ctx);
977+
let argvector = match r::create_argument(argv, argc) {
978+
Ok(argvector) => argvector,
979+
Err(error) => {
980+
STATISTICS.copy_err();
981+
return error.reply(&context);
982+
}
983+
};
899984

900985
match argvector.len() {
901986
3 => with_ch_and_loopdata(
@@ -985,10 +1070,10 @@ pub extern "C" fn MakeCopy(
9851070
#[allow(non_snake_case)]
9861071
pub extern "C" fn GetStatistics(
9871072
ctx: *mut r::rm::ffi::RedisModuleCtx,
988-
argv: *mut *mut r::rm::ffi::RedisModuleString,
989-
argc: ::std::os::raw::c_int,
1073+
_argv: *mut *mut r::rm::ffi::RedisModuleString,
1074+
_argc: ::std::os::raw::c_int,
9901075
) -> i32 {
991-
let (context, _argvector) = r::create_argument(ctx, argv, argc);
1076+
let context = r::rm::Context::new(ctx);
9921077
let data = STATISTICS.values().data;
9931078

9941079
let len = data.len() as c_long;

sync_engine/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "sync_engine"
3-
version = "0.5.0"
3+
version = "0.5.1-rc01"
44
authors = ["Simone Mosciatti <[email protected]>"]
55

66
[build-dependencies]

0 commit comments

Comments
 (0)