Skip to content

Commit

Permalink
Merge 46ee98d into 95f8260
Browse files Browse the repository at this point in the history
  • Loading branch information
djs55 committed Apr 4, 2016
2 parents 95f8260 + 46ee98d commit d66db88
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 2 deletions.
21 changes: 19 additions & 2 deletions lib/mirage_block_safe.ml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,23 @@ let rec check_buffers op sector_size = function
>>= fun () ->
check_buffers op sector_size bs

let check_in_range op size_sectors offset =
if offset < 0L || offset >= size_sectors
then fatalf "%s: sector offset out of range 0 <= %Ld < %Ld" op offset size_sectors
else Lwt.return (`Ok ())

let check op sector_size size_sectors offset buffers =
let open Mirage_block_monad.Infix in
check_buffers op sector_size buffers
>>= fun () ->
check_in_range op size_sectors offset
>>= fun () ->
let length = List.fold_left (fun acc b -> Cstruct.len b + acc) 0 buffers in
let next_sector = Int64.(add offset (of_int @@ length / sector_size)) in
if next_sector > size_sectors
then fatalf "%s: sector offset out of range %Ld > %Ld" op next_sector size_sectors
else Lwt.return (`Ok ())

module BLOCK(B: V1_LWT.BLOCK) = struct
include B

Expand All @@ -52,7 +69,7 @@ module BLOCK(B: V1_LWT.BLOCK) = struct
B.get_info t
>>= fun info ->
let open Mirage_block_monad.Infix in
check_buffers "read" info.sector_size buffers
check "read" info.sector_size info.size_sectors offset buffers
>>= fun () ->
unsafe_read t offset buffers

Expand All @@ -61,7 +78,7 @@ module BLOCK(B: V1_LWT.BLOCK) = struct
B.get_info t
>>= fun info ->
let open Mirage_block_monad.Infix in
check_buffers "write" info.sector_size buffers
check "write" info.sector_size info.size_sectors offset buffers
>>= fun () ->
unsafe_write t offset buffers
end
75 changes: 75 additions & 0 deletions lib_test/tests.ml
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,77 @@ let safe_good_buffer_length () =
return () in
Lwt_main.run t

let safe_bad_sector_start () =
let t =
Ramdisk.connect ~name:"ramdisk"
>>= fun x ->
let ramdisk = expect_ok "ramdisk" x in
let module Safe = Mirage_block.Make_safe_BLOCK(Ramdisk) in
Ramdisk.get_info ramdisk
>>= fun info ->
let sector = Cstruct.create info.Ramdisk.sector_size in
Safe.read ramdisk (-1L) [ sector ]
>>= fun x ->
expect_unknown x;
Safe.write ramdisk (-1L) [ sector ]
>>= fun x ->
expect_unknown x;
return () in
Lwt_main.run t

let safe_good_sector_start () =
let t =
Ramdisk.connect ~name:"ramdisk"
>>= fun x ->
let ramdisk = expect_ok "ramdisk" x in
let module Safe = Mirage_block.Make_safe_BLOCK(Ramdisk) in
Ramdisk.get_info ramdisk
>>= fun info ->
Safe.read ramdisk 0L []
>>= fun x ->
expect_ok "Safe.read" x;
Safe.write ramdisk 0L []
>>= fun x ->
expect_ok "Safe.write" x;
return () in
Lwt_main.run t

let safe_bad_sector_end () =
let t =
Ramdisk.connect ~name:"ramdisk"
>>= fun x ->
let ramdisk = expect_ok "ramdisk" x in
let module Safe = Mirage_block.Make_safe_BLOCK(Ramdisk) in
Ramdisk.get_info ramdisk
>>= fun info ->
let sector = Cstruct.create info.Ramdisk.sector_size in
Safe.read ramdisk info.Ramdisk.size_sectors [ sector ]
>>= fun x ->
expect_unknown x;
Safe.write ramdisk info.Ramdisk.size_sectors [ sector ]
>>= fun x ->
expect_unknown x;
return () in
Lwt_main.run t

let safe_good_sector_end () =
let t =
Ramdisk.connect ~name:"ramdisk"
>>= fun x ->
let ramdisk = expect_ok "ramdisk" x in
let module Safe = Mirage_block.Make_safe_BLOCK(Ramdisk) in
Ramdisk.get_info ramdisk
>>= fun info ->
let sector = Cstruct.create info.Ramdisk.sector_size in
Safe.read ramdisk (Int64.pred info.Ramdisk.size_sectors) [ sector ]
>>= fun x ->
expect_ok "Safe.read" x;
Safe.write ramdisk (Int64.pred info.Ramdisk.size_sectors) [ sector ]
>>= fun x ->
expect_ok "Safe.write" x;
return () in
Lwt_main.run t

let tests = [
"ramdisk compare" >:: ramdisk_compare;
"different compare" >:: different_compare;
Expand All @@ -161,6 +232,10 @@ let tests = [
"sparse copy an empty disk" >:: sparse_copy;
"safe wrapper catches bad buffer lengths" >:: safe_bad_buffer_length;
"safe wrapper accepts good buffer lengths" >:: safe_good_buffer_length;
"safe wrapper catches bad sector start" >:: safe_bad_sector_start;
"safe wrapper accepts good sector start" >:: safe_good_sector_start;
"safe wrapper catches bad sector end" >:: safe_bad_sector_end;
"safe wrapper accepts good sector end" >:: safe_good_sector_end;
]

let _ =
Expand Down

0 comments on commit d66db88

Please sign in to comment.