On Tue, Apr 23, 2002 at 12:09:14PM +0100, Ben Laurie wrote:
> Solar Designer wrote:
> > This sounds like a bug to me.  Noticed it last year and I've just
> > checked that it's still not resolved in the latest snapshot.
> > 
> > jill!solar:~/build/openssl-SNAP-20020416$ apps/openssl dgst -md5 /bin/ls
> > MD5(/bin/ls)= d93498d9f52c3dc0330ab930fe3ffc50
> > 
> > OK.
> > 
> > jill!solar:~/build/openssl-SNAP-20020416$ apps/openssl dgst -md5 /bin
> > MD5(/bin)= d41d8cd98f00b204e9800998ecf8427e
> > jill!solar:~/build/openssl-SNAP-20020416$ apps/openssl dgst -md5 /dev/log
> > MD5(/dev/log)= d41d8cd98f00b204e9800998ecf8427e
> > 
> > Wrong.  I'd want it to fail with a message to stderr and a non-zero
> > exit code.  Also on any read error, not just on non-regular files.
> > 
> > open("/bin", O_RDONLY)                  = 4
> > [some getpid()'s]
> > read(4, 0x8189fb0, 8192)                = -1 EISDIR (Is a directory)
> > [lots of getpid()'s, why?!]
> > write(1, "MD5(/bin)= d41d8cd98f00b204e9800"..., 44) = 44
> 
> Try this for size (against 0.9.7, but probably will work on other
> versions)....

Applied to the same snapshot as above with "patch -l" (probably tabs
got converted to spaces somewhere in your mail).

It's better but still not perfect:

jill!solar:~/build/openssl-SNAP-20020416$ apps/openssl dgst -md5 /dev/log
Read Error
MD5(/dev/log)= jill!solar:~/build/openssl-SNAP-20020416$ echo $?
0

I'd rather not have it output the "MD5(/dev/log)= " until it has the
hash value and have it exit non-zero.

>                 ret=fread(out,1,(int)outl,(FILE *)b->ptr);
> +               if(ret == 0 && ferror((FILE *)b->ptr))
> +                       ret=-1;

I am looking at this out of context (so I don't know if the fread()
will always be re-called when "ret" is smaller than the requested
"outl") but I'd change the "ret == 0" to "ret < outl" (possibly with
a cast) or drop this check entirely (the ferror() alone is sufficient).

size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);

     Upon successful completion, fread() returns the number of members
     successfully read which is less than nitems only if a read error or
     end-of-file is encountered. If size or nitems is 0, fread() returns 0
     and the contents of the array and the state of the stream remain
     unchanged. Otherwise, if a read error occurs, the error indicator for
     the stream is set and errno is set to indicate the error.

(SUSv2)

> --- apps/dgst.c 2002/04/06 18:59:57     1.23.2.2
> +++ apps/dgst.c 2002/04/23 11:06:14
> @@ -362,7 +362,13 @@
>         for (;;)
>                 {
>                 i=BIO_read(bp,(char *)buf,BUFSIZE);
> -               if (i <= 0) break;
> +               if(i < 0)
> +                   {
> +                       BIO_printf(bio_err, "Read Error\n");
> +                       ERR_print_errors(bio_err);
> +                       return;
> +                       }
> +               if (i == 0) break;
>                 }

I'm not sure how this would handle partial reads.  I don't know the
semantics of BIO_read(), but it appears weird to retry with the same
arguments on any positive return value.

Thank you for working on this!

-- 
/sd
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to