[Libguestfs] [PATCH v2 1/7] mllib: factorize code to add Checksum.get_checksum function
Cedric Bosdonnat
cbosdonnat at suse.com
Tue Feb 7 16:27:44 UTC 2017
On Tue, 2017-02-07 at 16:13 +0000, Richard W.M. Jones wrote:
> On Tue, Feb 07, 2017 at 04:14:16PM +0100, Cédric Bosdonnat wrote:
> > Getting checksum involves the same code than verifying them. Create
> > a get_checksum function and use it in verify_checksum.
> > ---
> > mllib/checksums.ml | 25 ++++++++++++++++---------
> > mllib/checksums.mli | 9 +++++++++
> > 2 files changed, 25 insertions(+), 9 deletions(-)
> >
> > diff --git a/mllib/checksums.ml b/mllib/checksums.ml
> > index 1009e131c..bee829085 100644
> > --- a/mllib/checksums.ml
> > +++ b/mllib/checksums.ml
> > @@ -45,14 +45,13 @@ let of_string csum_type csum_value =
> > | "sha512" -> SHA512 csum_value
> > | _ -> invalid_arg csum_type
> >
> > -let verify_checksum csum ?tar filename =
> > - let prog, csum_ref =
> > +let do_compute_checksum csum ?tar filename =
> > + let prog =
> > match csum with
> > - | SHA1 c -> "sha1sum", c
> > - | SHA256 c -> "sha256sum", c
> > - | SHA512 c -> "sha512sum", c
> > + | SHA1 _ -> "sha1sum"
> > + | SHA256 _ -> "sha256sum"
> > + | SHA512 _ -> "sha512sum"
> > in
> > -
> > let cmd =
> > match tar with
> > | None ->
> > @@ -66,9 +65,17 @@ let verify_checksum csum ?tar filename =
> > | [] ->
> > error (f_"%s did not return any output") prog
> > | line :: _ ->
> > - let csum_actual = fst (String.split " " line) in
> > - if csum_ref <> csum_actual then
> > - raise (Mismatched_checksum (csum, csum_actual))
> > + fst (String.split " " line)
> > +
> > +let compute_checksum csum_type ?tar filename =
> > + do_compute_checksum (of_string csum_type "") ?tar filename
>
> Why is there a separate do_compute_checksum function here? It seems
> like it is only called from here, not from anywhere else.
I only followed Pino's recommendations here:
https://www.redhat.com/archives/libguestfs/2017-January/msg00015.html
> > +let verify_checksum csum ?tar filename =
> > + let csum_ref = string_of_csum csum in
> > + let csum_type = string_of_csum_t csum in
> > + let csum_actual = compute_checksum csum_type ?tar filename in
> > + if csum_ref <> csum_actual then
> > + raise (Mismatched_checksum (csum, csum_actual))
>
> This is technically correct because all the checksum types happen to
> be different lengths, but really wrong. You should be comparing the
> structured csum_t values, not just the strings.
>
> Unfortunately the original verify_checksum is also broken in the same
> way so this isn't a bug you've added, but it's a bug that needs to be
> fixed.
>
> I think the real problem is that compute_checksum should return a
> structured csum_t, not a string, and then everything else follows
> elegantly from that.
I'll check what I can do with it then.
--
Cedric
More information about the Libguestfs
mailing list