From 5b10ca298c4906da8431c9061acbff754c6dbc29 Mon Sep 17 00:00:00 2001 From: David Xu Date: Tue, 20 Dec 2005 00:21:53 +0000 Subject: [PATCH] MFBSD: Split fread into MT-safe and none MT-safe versions, let __vfscanf call none MT-safe version, so that sscanf does not leak memory. --- lib/libc/stdio/fread.c | 16 ++++++++++++---- lib/libc/stdio/local.h | 3 ++- lib/libc/stdio/vfscanf.c | 6 +++--- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/libc/stdio/fread.c b/lib/libc/stdio/fread.c index 9ccce13451..521eef61c4 100644 --- a/lib/libc/stdio/fread.c +++ b/lib/libc/stdio/fread.c @@ -35,7 +35,7 @@ * * @(#)fread.c 8.2 (Berkeley) 12/11/93 * $FreeBSD: src/lib/libc/stdio/fread.c,v 1.7 1999/08/28 00:01:04 peter Exp $ - * $DragonFly: src/lib/libc/stdio/fread.c,v 1.7 2005/11/20 11:07:30 swildner Exp $ + * $DragonFly: src/lib/libc/stdio/fread.c,v 1.8 2005/12/20 00:21:53 davidxu Exp $ */ #include "namespace.h" @@ -49,6 +49,17 @@ size_t fread(void *buf, size_t size, size_t count, FILE *fp) +{ + size_t ret; + + FLOCKFILE(fp); + ret = __fread(buf, size, count, fp); + FUNLOCKFILE(fp); + return (ret); +} + +size_t +__fread(void *buf, size_t size, size_t count, FILE *fp) { size_t resid; char *p; @@ -62,7 +73,6 @@ fread(void *buf, size_t size, size_t count, FILE *fp) */ if ((resid = count * size) == 0) return (0); - FLOCKFILE(fp); if (fp->pub._r < 0) fp->pub._r = 0; total = resid; @@ -75,13 +85,11 @@ fread(void *buf, size_t size, size_t count, FILE *fp) resid -= r; if (__srefill(fp)) { /* no more input: return partial result */ - FUNLOCKFILE(fp); return ((total - resid) / size); } } memcpy((void *)p, (void *)fp->pub._p, resid); fp->pub._r -= resid; fp->pub._p += resid; - FUNLOCKFILE(fp); return (count); } diff --git a/lib/libc/stdio/local.h b/lib/libc/stdio/local.h index d49e2587bc..3bba1360f0 100644 --- a/lib/libc/stdio/local.h +++ b/lib/libc/stdio/local.h @@ -36,7 +36,7 @@ * @(#)local.h 8.3 (Berkeley) 7/3/94 * * $FreeBSD: src/lib/libc/stdio/local.h,v 1.1.1.2.6.1 2001/03/05 11:27:49 obrien Exp $ - * $DragonFly: src/lib/libc/stdio/local.h,v 1.9 2005/08/02 00:44:39 joerg Exp $ + * $DragonFly: src/lib/libc/stdio/local.h,v 1.10 2005/12/20 00:21:53 davidxu Exp $ */ #include /* for off_t */ @@ -71,6 +71,7 @@ extern int __vfprintf(FILE *, const char *, __va_list); extern wint_t __fgetwc_unlock(FILE *); extern wint_t __fputwc_unlock(wchar_t, FILE *); extern int __vfwprintf_unlocked(FILE *, const wchar_t *, __va_list); +extern size_t __fread(void *buf, size_t size, size_t count, FILE *fp); extern int __sdidinit; diff --git a/lib/libc/stdio/vfscanf.c b/lib/libc/stdio/vfscanf.c index cb4ea75b15..c69ce29ae1 100644 --- a/lib/libc/stdio/vfscanf.c +++ b/lib/libc/stdio/vfscanf.c @@ -35,7 +35,7 @@ * * @(#)vfscanf.c 8.1 (Berkeley) 6/4/93 * $FreeBSD: /repoman/r/ncvs/src/lib/libc/stdio/vfscanf.c,v 1.35 2004/01/31 23:16:09 das Exp $ - * $DragonFly: src/lib/libc/stdio/vfscanf.c,v 1.9 2005/11/20 11:07:30 swildner Exp $ + * $DragonFly: src/lib/libc/stdio/vfscanf.c,v 1.10 2005/12/20 00:21:53 davidxu Exp $ */ #include "namespace.h" @@ -361,8 +361,8 @@ literal: } nread += sum; } else { - size_t r = fread((void *)va_arg(ap, char *), 1, - width, fp); + size_t r = __fread((void *)va_arg(ap, char *), + 1, width, fp); if (r == 0) goto input_failure; -- 2.41.0