svn commit: r292955 - head/lib/libmd
Allan Jude
allanjude at freebsd.org
Thu Dec 31 07:15:05 UTC 2015
On 2015-12-30 23:10, Bruce Evans wrote:
> On Thu, 31 Dec 2015, Bruce Evans wrote:
>
>>
>> wc /proc/0/* works. md5 works like wc using a hack to avoid calling this
>> broken function. E.g.,
>>
>> for i in $(ls /proc/0/*); do echo -n "$i: "; md5 <$i; done # gives
>>
>> /proc/0/cmdline: 3c5896b1ac441f4998f052e2126e8d20
>> /proc/0/ctl: d41d8cd98f00b204e9800998ecf8427e
>> /proc/0/etype: 674441960ca1ba2de08ad4e50c9fde98
>> /proc/0/rlimit: 67d6ad67b412e1bceb7cb508a3492197
>> /proc/0/status: 3ccc3067b97c3232ea2dbcb64c458fd4
>
> Further examples:
>
> md5 # on terminal input
>
> works correctly by not using MDXFileChunk().
>
> md5 /dev/stdin # on the same terminal input
>
> produces the d41d8cd98f00b204e9800998ecf8427e garbage using
> MDXFileChunk(). truss shows that lseek() is broken too -- MDXFileChunk()
> tries it and it succeeds on the unseekable file /dev/stdin. Bugs in this
> area are common. E.g., lseek() on named pipes was broken so that it
> succeeded, by rearranging the plumbing use fileops more or less and not
> attaching lseek right.
>
> cat | md5 # on the same terminal input
>
> works correctly by not using MDXFileChunk().
>
> cat | md5 /dev/stdin # on the same terminal input
>
> doesn't work correctly, but it fails better than without the pipe. Now
> a seek error occurs and is reported as "md5: /dev/stdin: Illegal seek"
> (I can't see where it is reported). Then md5 exits. Then cat waits to
> read input. Then cat fails to write output and is killed by SIGPIPE.
> So md5 handled the seek error in a fail-safe though incorrect way. One
> correct way is to fall back to the working code, but it is better to
> just use that without an lseek check.
>
> It is a bug that [l]stat() on /dev/stdin sees the device file and not the
> actual stdin file. md5 can't work around this except by not using stat().
>
> Bruce
>
It seems these problems also slow things down, a lot:
# time md5 /media/md5test/bigdata
MD5 (/media/md5test/bigdata) = 6afad0bf5d8318093e943229be05be67
4.310u 3.476s 0:07.79 99.8% 20+167k 0+0io 0pf+0w
# time env LD_PRELOAD=/usr/obj/media/svn/md5/head/tmp/lib/libmd.so
/usr/obj/media/svn/md5/head/sbin/md5/md5 /media/md5test/bigdata
MD5 (/media/md5test/bigdata) = 6afad0bf5d8318093e943229be05be67
4.133u 0.354s 0:04.49 99.7% 20+167k 1+0io 0pf+0w
(file is fully cached in ZFS ARC, dd reads it at 11GB/s)
Will investigate more tomorrow.
char *
MDXFile(const char *filename, char *buf)
{
unsigned char buffer[16*1024];
MDX_CTX ctx;
int f, i;
MDXInit(&ctx);
f = open(filename, O_RDONLY);
if (f < 0)
return 0;
i = 0;
while (1) {
i = read(f, buffer, sizeof(buffer));
if (i <= 0)
break;
MDXUpdate(&ctx, buffer, i);
}
close(f);
return (MDXEnd(&ctx, buf));
}
--
Allan Jude
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 834 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freebsd.org/pipermail/svn-src-head/attachments/20151231/afc97b8b/attachment.sig>
More information about the svn-src-head
mailing list