[Glibc-bsd-commits] r5088 - in trunk/freebsd-glue: debian src

Robert Millan rmh at alioth.debian.org
Sat Oct 26 14:07:20 UTC 2013


Author: rmh
Date: 2013-10-26 14:07:19 +0000 (Sat, 26 Oct 2013)
New Revision: 5088

Modified:
   trunk/freebsd-glue/debian/changelog
   trunk/freebsd-glue/src/funopen.c
Log:
Fix improper allocation in funopen(). (Closes: #726970)

Modified: trunk/freebsd-glue/debian/changelog
===================================================================
--- trunk/freebsd-glue/debian/changelog	2013-10-26 13:38:15 UTC (rev 5087)
+++ trunk/freebsd-glue/debian/changelog	2013-10-26 14:07:19 UTC (rev 5088)
@@ -1,3 +1,9 @@
+freebsd-glue (0.1.12) UNRELEASED; urgency=low
+
+  * Fix improper allocation in funopen(). (Closes: #726970)
+
+ -- Robert Millan <rmh at debian.org>  Sat, 26 Oct 2013 00:27:03 +0200
+
 freebsd-glue (0.1.11) unstable; urgency=low
 
   * Fix unresolved dependencies on libc hidden symbols (_open, _read,

Modified: trunk/freebsd-glue/src/funopen.c
===================================================================
--- trunk/freebsd-glue/src/funopen.c	2013-10-26 13:38:15 UTC (rev 5087)
+++ trunk/freebsd-glue/src/funopen.c	2013-10-26 14:07:19 UTC (rev 5088)
@@ -1,37 +1,64 @@
 #include <stdio.h>
+#include <stdlib.h>
 #include <errno.h>
 
+struct cookiebox
+{
+  void *cookie;
+  int (*readfn) (void *, char *, int);
+  int (*writefn) (void *, const char *, int);
+  int (*closefn) (void *);
+};
+
+static ssize_t
+cookiebox_read (void *cookie, char *buf, size_t size)
+{
+  struct cookiebox *cookiebox = cookie;
+  return cookiebox->readfn (cookiebox->cookie, buf, size);
+}
+
+static ssize_t
+cookiebox_write (void *cookie, const char *buf, size_t size)
+{
+  struct cookiebox *cookiebox = cookie;
+  return cookiebox->writefn (cookiebox->cookie, buf, size);
+}
+
+static int
+cookiebox_close (void *cookie)
+{
+  struct cookiebox *cookiebox = cookie;
+  int ret = cookiebox->closefn (cookiebox->cookie);
+  free (cookiebox);
+  return ret;
+}
+
 FILE *
 funopen (const void *cookie, int (*readfn)(void *, char *, int),
 	 int (*writefn)(void *, const char *, int),
 	 fpos_t (*seekfn)(void *, fpos_t, int), int (*closefn)(void *))
 {
-  auto ssize_t cookie_read (void *cookie, char *buf, size_t size);
-  auto ssize_t cookie_read (void *cookie, char *buf, size_t size)
-  {
-    return readfn (cookie, buf, size);
-  }
-
-  auto ssize_t cookie_write (void *cookie, const char *buf, size_t size);
-  auto ssize_t cookie_write (void *cookie, const char *buf, size_t size)
-  {
-    return writefn (cookie, buf, size);
-  }
-
   if (seekfn)
     {
       errno = ENOSYS;
       return NULL;
     }
 
-  cookie_io_functions_t funcs = {
-    .read = cookie_read,
-    .write = cookie_write,
+  cookie_io_functions_t cookiebox_funcs = {
+    .read = cookiebox_read,
+    .write = cookiebox_write,
     .seek = NULL,
-    .close = closefn
+    .close = cookiebox_close
   };
 
-  return fopencookie ((void *) cookie, "r+", funcs);
+  struct cookiebox *cookiebox = malloc (sizeof (*cookiebox));
+  
+  cookiebox->cookie = (void *) cookie;
+  cookiebox->readfn = readfn;
+  cookiebox->writefn = writefn;
+  cookiebox->closefn = closefn;
+
+  return fopencookie ((void *) cookiebox, "r+", cookiebox_funcs);
 }
 
 FILE *




More information about the Glibc-bsd-commits mailing list