MFBSD:
authorDavid Xu <davidxu@dragonflybsd.org>
Tue, 20 Dec 2005 00:21:53 +0000 (00:21 +0000)
committerDavid Xu <davidxu@dragonflybsd.org>
Tue, 20 Dec 2005 00:21:53 +0000 (00:21 +0000)
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
lib/libc/stdio/local.h
lib/libc/stdio/vfscanf.c

index 9ccce13..521eef6 100644 (file)
@@ -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"
 
 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);
 }
index d49e258..3bba136 100644 (file)
@@ -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 <sys/types.h> /* 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;
 
index cb4ea75..c69ce29 100644 (file)
@@ -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;