aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Bright <dab@FreeBSD.org>2018-08-14 19:12:45 +0000
committerDavid Bright <dab@FreeBSD.org>2018-08-14 19:12:45 +0000
commit53e992cfb9bfbc5c77588165b3a250a1fa555a23 (patch)
tree4eecd7e9957d83f272000a0e57f81100ffc0d6ed
parente13a20dad7636a6953568929efdfd73338bf7373 (diff)
downloadsrc-53e992cfb9bfbc5c77588165b3a250a1fa555a23.tar.gz
src-53e992cfb9bfbc5c77588165b3a250a1fa555a23.zip
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
Notes
Notes: svn path=/head/; revision=337812
-rw-r--r--sys/dev/netmap/netmap_freebsd.c2
-rw-r--r--tests/sys/kqueue/libkqueue/common.h2
-rw-r--r--tests/sys/kqueue/libkqueue/main.c21
-rw-r--r--tests/sys/kqueue/libkqueue/proc.c5
4 files changed, 22 insertions, 8 deletions
diff --git a/sys/dev/netmap/netmap_freebsd.c b/sys/dev/netmap/netmap_freebsd.c
index f4a97b370f68..b2882768297b 100644
--- a/sys/dev/netmap/netmap_freebsd.c
+++ b/sys/dev/netmap/netmap_freebsd.c
@@ -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,
diff --git a/tests/sys/kqueue/libkqueue/common.h b/tests/sys/kqueue/libkqueue/common.h
index 46f6f54d81dd..814d6cc0fc93 100644
--- a/tests/sys/kqueue/libkqueue/common.h
+++ b/tests/sys/kqueue/libkqueue/common.h
@@ -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);
diff --git a/tests/sys/kqueue/libkqueue/main.c b/tests/sys/kqueue/libkqueue/main.c
index 616eb8ddd696..9b8945e3f2b9 100644
--- a/tests/sys/kqueue/libkqueue/main.c
+++ b/tests/sys/kqueue/libkqueue/main.c
@@ -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));
}
diff --git a/tests/sys/kqueue/libkqueue/proc.c b/tests/sys/kqueue/libkqueue/proc.c
index 79b8d35f4f25..4f97eacdc1a0 100644
--- a/tests/sys/kqueue/libkqueue/proc.c
+++ b/tests/sys/kqueue/libkqueue/proc.c
@@ -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));