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
This commit is contained in:
David Bright 2018-08-14 19:12:45 +00:00
parent e13a20dad7
commit 53e992cfb9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=337812
4 changed files with 22 additions and 8 deletions

View File

@ -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,

View File

@ -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);

View File

@ -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));
}

View File

@ -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));