[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