Author: markj
Date: Thu Feb 23 17:56:24 2017
New Revision: 314154
URL: https://svnweb.freebsd.org/changeset/base/314154

Log:
  Fix memory leaks in error cases in libdtrace.
  
  Submitted by: Tom Rix <t...@juniper.net>
  MFC after:    1 week
  Differential Revision:        https://reviews.freebsd.org/D9705

Modified:
  head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c
  head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_strtab.c

Modified: head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c        Thu Feb 
23 17:54:17 2017        (r314153)
+++ head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_open.c        Thu Feb 
23 17:56:24 2017        (r314154)
@@ -931,9 +931,11 @@ dt_provmod_open(dt_provmod_t **provmod, 
                         * reallocate it. We normally won't need to do this
                         * because providers aren't being loaded all the time.
                         */
-                       if ((p = realloc(p_providers,len)) == NULL)
+                       if ((p = realloc(p_providers,len)) == NULL) {
+                               free(p_providers);
                                /* How do we report errors here? */
                                return;
+                       }
                        p_providers = p;
                } else
                        break;
@@ -1148,8 +1150,10 @@ dt_vopen(int version, int flags, int *er
        (void) fcntl(ftfd, F_SETFD, FD_CLOEXEC);
 
 alloc:
-       if ((dtp = malloc(sizeof (dtrace_hdl_t))) == NULL)
+       if ((dtp = malloc(sizeof (dtrace_hdl_t))) == NULL) {
+               dt_provmod_destroy(&provmod);
                return (set_open_errno(dtp, errp, EDT_NOMEM));
+       }
 
        bzero(dtp, sizeof (dtrace_hdl_t));
        dtp->dt_oflags = flags;

Modified: head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_strtab.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_strtab.c      Thu Feb 
23 17:54:17 2017        (r314153)
+++ head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_strtab.c      Thu Feb 
23 17:56:24 2017        (r314154)
@@ -256,8 +256,10 @@ dt_strtab_insert(dt_strtab_t *sp, const 
         * Now copy the string data into our buffer list, and then update
         * the global counts of strings and bytes.  Return str's byte offset.
         */
-       if (dt_strtab_copyin(sp, str, len + 1) == -1)
+       if (dt_strtab_copyin(sp, str, len + 1) == -1) {
+               free(hp);
                return (-1L);
+       }
 
        sp->str_nstrs++;
        sp->str_size += len + 1;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to