svn commit: r337812 - in head: sys/dev/netmap tests/sys/kqueue/libkqueue
David Bright
dab at FreeBSD.org
Tue Aug 14 19:12:47 UTC 2018
Author: dab
Date: Tue Aug 14 19:12:45 2018
New Revision: 337812
URL: https://svnweb.freebsd.org/changeset/base/337812
Log:
Fix several memory leaks.
The libkqueue tests have several places that leak memory by using an
idiom like:
puts(kevent_to_str(kevp));
Rework to save the pointer returned from kevent_to_str() and then
free() it after it has been used.
Reported by: asomers (pointer to Coverity), Coverity
CID: 1296063, 1296064, 1296065, 1296066, 1296067, 1350287, 1394960
Sponsored by: Dell EMC
Modified:
head/sys/dev/netmap/netmap_freebsd.c
head/tests/sys/kqueue/libkqueue/common.h
head/tests/sys/kqueue/libkqueue/main.c
head/tests/sys/kqueue/libkqueue/proc.c
Modified: head/sys/dev/netmap/netmap_freebsd.c
==============================================================================
--- head/sys/dev/netmap/netmap_freebsd.c Tue Aug 14 18:58:16 2018 (r337811)
+++ head/sys/dev/netmap/netmap_freebsd.c Tue Aug 14 19:12:45 2018 (r337812)
@@ -1498,7 +1498,7 @@ netmap_kqfilter(struct cdev *dev, struct knote *kn)
kn->kn_fop = (ev == EVFILT_WRITE) ?
&netmap_wfiltops : &netmap_rfiltops;
kn->kn_hook = priv;
- knlist_add(&si->si.si_note, kn, 1);
+ knlist_add(&si->si.si_note, kn, 0);
// XXX unlock(priv)
ND("register %p %s td %p priv %p kn %p np_nifp %p kn_fp/fpop %s",
na, na->ifp->if_xname, curthread, priv, kn,
Modified: head/tests/sys/kqueue/libkqueue/common.h
==============================================================================
--- head/tests/sys/kqueue/libkqueue/common.h Tue Aug 14 18:58:16 2018 (r337811)
+++ head/tests/sys/kqueue/libkqueue/common.h Tue Aug 14 19:12:45 2018 (r337812)
@@ -43,7 +43,7 @@
extern char *cur_test_id;
int vnode_fd;
-extern const char * kevent_to_str(struct kevent *);
+extern char * kevent_to_str(struct kevent *);
struct kevent * kevent_get(int);
struct kevent * kevent_get_timeout(int, int);
Modified: head/tests/sys/kqueue/libkqueue/main.c
==============================================================================
--- head/tests/sys/kqueue/libkqueue/main.c Tue Aug 14 18:58:16 2018 (r337811)
+++ head/tests/sys/kqueue/libkqueue/main.c Tue Aug 14 19:12:45 2018 (r337812)
@@ -41,13 +41,16 @@ test_no_kevents(void)
int nfds;
struct timespec timeo;
struct kevent kev;
+ char *kev_str;
puts("confirming that there are no events pending");
memset(&timeo, 0, sizeof(timeo));
nfds = kevent(kqfd, NULL, 0, &kev, 1, &timeo);
if (nfds != 0) {
puts("\nUnexpected event:");
- puts(kevent_to_str(&kev));
+ kev_str = kevent_to_str(&kev);
+ puts(kev_str);
+ free(kev_str);
errx(1, "%d event(s) pending, but none expected:", nfds);
}
}
@@ -61,12 +64,15 @@ test_no_kevents_quietly(void)
int nfds;
struct timespec timeo;
struct kevent kev;
+ char *kev_str;
memset(&timeo, 0, sizeof(timeo));
nfds = kevent(kqfd, NULL, 0, &kev, 1, &timeo);
if (nfds != 0) {
puts("\nUnexpected event:");
- puts(kevent_to_str(&kev));
+ kev_str = kevent_to_str(&kev);
+ puts(kev_str);
+ free(kev_str);
errx(1, "%d event(s) pending, but none expected:", nfds);
}
}
@@ -193,18 +199,20 @@ kevent_flags_dump(struct kevent *kev)
}
/* Copied from ../kevent.c kevent_dump() and improved */
-const char *
+char *
kevent_to_str(struct kevent *kev)
{
char buf[512];
+ char *flags_str = kevent_flags_dump(kev);
+ char *fflags_str = kevent_fflags_dump(kev);
snprintf(&buf[0], sizeof(buf),
"[ident=%ju, filter=%d, %s, %s, data=%jd, udata=%p, "
"ext=[%jx %jx %jx %jx]",
(uintmax_t) kev->ident,
kev->filter,
- kevent_flags_dump(kev),
- kevent_fflags_dump(kev),
+ flags_str,
+ fflags_str,
(uintmax_t)kev->data,
kev->udata,
(uintmax_t)kev->ext[0],
@@ -212,6 +220,9 @@ kevent_to_str(struct kevent *kev)
(uintmax_t)kev->ext[2],
(uintmax_t)kev->ext[3]);
+ free(flags_str);
+ free(fflags_str);
+
return (strdup(buf));
}
Modified: head/tests/sys/kqueue/libkqueue/proc.c
==============================================================================
--- head/tests/sys/kqueue/libkqueue/proc.c Tue Aug 14 18:58:16 2018 (r337811)
+++ head/tests/sys/kqueue/libkqueue/proc.c Tue Aug 14 19:12:45 2018 (r337812)
@@ -172,6 +172,7 @@ proc_track(int sleep_time)
int gchild_note = 0;
pid_t gchild_pid = -1;
int done = 0;
+ char *kev_str;
while (!done)
{
@@ -182,7 +183,9 @@ proc_track(int sleep_time)
if (kevp == NULL) {
done = 1;
} else {
- printf(" -- Received kevent: %s\n", kevent_to_str(kevp));
+ kev_str = kevent_to_str(kevp);
+ printf(" -- Received kevent: %s\n", kev_str);
+ free(kev_str);
if ((kevp->fflags & NOTE_CHILD) && (kevp->fflags & NOTE_EXIT)) {
errx(1, "NOTE_CHILD and NOTE_EXIT in same kevent: %s", kevent_to_str(kevp));
More information about the svn-src-head
mailing list