Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/ldpd Fix more memory leaks in case malloc fails



details:   https://anonhg.NetBSD.org/src/rev/53b6d4a34b85
branches:  trunk
changeset: 760405:53b6d4a34b85
user:      kefren <kefren%NetBSD.org@localhost>
date:      Tue Jan 04 10:18:42 2011 +0000

description:
Fix more memory leaks in case malloc fails

diffstat:

 usr.sbin/ldpd/mpls_interface.c |  43 +++++++++++++++++++++++++++++++----------
 1 files changed, 32 insertions(+), 11 deletions(-)

diffs (91 lines):

diff -r a953f32eae9c -r 53b6d4a34b85 usr.sbin/ldpd/mpls_interface.c
--- a/usr.sbin/ldpd/mpls_interface.c    Tue Jan 04 10:14:25 2011 +0000
+++ b/usr.sbin/ldpd/mpls_interface.c    Tue Jan 04 10:18:42 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mpls_interface.c,v 1.3 2011/01/04 09:42:21 wiz Exp $ */
+/* $NetBSD: mpls_interface.c,v 1.4 2011/01/04 10:18:42 kefren Exp $ */
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -83,10 +83,12 @@
                 * let's loop until we have it..
                 */
 
-               so_dest = make_inet_union(inet_ntoa(*addr));
-               if (len != 32)
-                       so_pref = from_cidr_to_union(len);
-
+               if ((so_dest = make_inet_union(inet_ntoa(*addr))) == NULL)
+                       return LDP_E_MEMORY;
+               if (len != 32 && (so_pref = from_cidr_to_union(len)) == NULL) {
+                       free(so_dest);
+                       return LDP_E_MEMORY;
+               }
                do {
                        if (kount == rlookup) {
                                debugp("No route for this prefix\n");
@@ -166,16 +168,25 @@
        so_dest = make_mpls_union(lab->binding);
        so_nexthop = malloc(sizeof(*so_nexthop));
        if (!so_nexthop) {
+               free(so_dest);
                fatalp("Out of memory\n");
                return LDP_E_MEMORY;
        }
        memcpy(so_nexthop, so_gate, so_gate->sa.sa_len);
-       so_tag = make_mpls_union(label);
+       if ((so_tag = make_mpls_union(label)) == NULL) {
+               free(so_dest);
+               free(so_nexthop);
+               fatalp("Out of memory\n");
+               return LDP_E_MEMORY;
+       }
        if (add_route(so_dest, NULL, so_nexthop, NULL, so_tag, FREESO, RTM_ADD) != LDP_E_OK)
                return LDP_E_ROUTE_ERROR;
 
        /* Now, let's add tag to IPv4 route and point it to mpls interface */
-       so_dest = make_inet_union(inet_ntoa(*addr));
+       if ((so_dest = make_inet_union(inet_ntoa(*addr))) == NULL) {
+               fatalp("Out of memory\n");
+               return LDP_E_MEMORY;
+       }
 
        /* if prefixlen == 32 check if it's inserted as host
        * and treat it as host. It may also be set as /32 prefix
@@ -183,12 +194,18 @@
        */
        if ((len == 32) && (rgp->m_rtm.rtm_flags & RTF_HOST))
                so_pref = NULL;
-       else
-               so_pref = from_cidr_to_union(len);
+       else if ((so_pref = from_cidr_to_union(len)) == NULL) {
+               free(so_dest);
+               fatalp("Out of memory\n");
+               return LDP_E_MEMORY;
+       }
 
        /* Add tag to route */
        so_nexthop = malloc(sizeof(*so_nexthop));
        if (!so_nexthop) {
+               free(so_dest);
+               if (so_pref != NULL)
+                       free(so_pref);
                fatalp("Out of memory\n");
                return LDP_E_MEMORY;
        }
@@ -196,9 +213,13 @@
        so_tag = make_mpls_union(label);
        if (so_oldifa != NULL) {
                so_ifa = malloc(sizeof(*so_ifa));
-               if (!so_ifa) {
+               if (so_ifa == NULL) {
+                       free(so_dest);
+                       if (so_pref != NULL)
+                               free(so_pref);
+                       free(so_tag);
+                       free(so_nexthop);
                        fatalp("Out of memory\n");
-                       free(so_nexthop);
                        return LDP_E_MEMORY;
                }
                memcpy(so_ifa, so_oldifa, so_oldifa->sa.sa_len);



Home | Main Index | Thread Index | Old Index