Audit ast_sockaddr_resolve() usage for memory leaks.
authorRichard Mudgett <rmudgett@digium.com>
Tue, 17 Mar 2015 21:52:47 +0000 (21:52 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 17 Mar 2015 21:52:47 +0000 (21:52 +0000)
Valgrind found some memory leaks associated with ast_sockaddr_resolve().
Most of the leaks had already been fixed by earlier memory leak hunt
patches.  This patch performs an audit of ast_sockaddr_resolve() and found
one more.

* Fix ast_sockaddr_resolve() memory leak in
apps/app_externalivr.c:app_exec().

* Made main/netsock2.c:ast_sockaddr_resolve() always set the addrs
parameter for safety so the pointer will never be uninitialized on return.
The same goes for res/res_pjsip_acl.c:extract_contact_addr().

* Made functions that call ast_sockaddr_resolve() with RAII_VAR()
controlling the addrs variable use ast_free instead of ast_free_ptr to
provide better MALLOC_DEBUG information.

Review: https://reviewboard.asterisk.org/r/4509/
........

Merged revisions 433056 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 433057 from http://svn.asterisk.org/svn/asterisk/branches/13

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@433058 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_externalivr.c
main/netsock2.c
res/res_pjsip_acl.c
res/res_pjsip_sdp_rtp.c
res/res_pjsip_t38.c

index 5649c69..9cb8839 100644 (file)
@@ -519,6 +519,8 @@ static int app_exec(struct ast_channel *chan, const char *data)
                        break;
                }
 
+               ast_free(addrs);
+
                if (i == num_addrs) {
                        ast_chan_log(LOG_ERROR, chan, "Could not connect to any host.  ExternalIVR failed.\n");
                        goto exit;
index 0e83f27..8d36805 100644 (file)
@@ -287,11 +287,13 @@ int ast_sockaddr_resolve(struct ast_sockaddr **addrs, const char *str,
        int     e, i, res_cnt;
 
        if (!str) {
+               *addrs = NULL;
                return 0;
        }
 
        s = ast_strdupa(str);
        if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) {
+               *addrs = NULL;
                return 0;
        }
 
@@ -302,6 +304,7 @@ int ast_sockaddr_resolve(struct ast_sockaddr **addrs, const char *str,
        if ((e = getaddrinfo(host, port, &hints, &res))) {
                ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n",
                        host, S_OR(port, "(null)"), gai_strerror(e));
+               *addrs = NULL;
                return 0;
        }
 
@@ -311,6 +314,7 @@ int ast_sockaddr_resolve(struct ast_sockaddr **addrs, const char *str,
        }
 
        if (res_cnt == 0) {
+               *addrs = NULL;
                goto cleanup;
        }
 
index ec9f3ae..a04f2b4 100644 (file)
@@ -139,9 +139,11 @@ static int extract_contact_addr(pjsip_contact_hdr *contact, struct ast_sockaddr
        char host[256];
 
        if (!contact || contact->star) {
+               *addrs = NULL;
                return 0;
        }
        if (!PJSIP_URI_SCHEME_IS_SIP(contact->uri) && !PJSIP_URI_SCHEME_IS_SIPS(contact->uri)) {
+               *addrs = NULL;
                return 0;
        }
        sip_uri = pjsip_uri_get_uri(contact->uri);
index a2550df..6856b73 100644 (file)
@@ -758,7 +758,7 @@ static int negotiate_incoming_sdp_stream(struct ast_sip_session *session, struct
                                         const struct pjmedia_sdp_session *sdp, const struct pjmedia_sdp_media *stream)
 {
        char host[NI_MAXHOST];
-       RAII_VAR(struct ast_sockaddr *, addrs, NULL, ast_free_ptr);
+       RAII_VAR(struct ast_sockaddr *, addrs, NULL, ast_free);
        enum ast_media_type media_type = stream_to_media_type(session_media->stream_type);
        enum ast_sip_session_media_encryption encryption = AST_SIP_MEDIA_ENCRYPT_NONE;
        int res;
@@ -1116,7 +1116,7 @@ static int apply_negotiated_sdp_stream(struct ast_sip_session *session, struct a
                                       const struct pjmedia_sdp_session *local, const struct pjmedia_sdp_media *local_stream,
                                       const struct pjmedia_sdp_session *remote, const struct pjmedia_sdp_media *remote_stream)
 {
-       RAII_VAR(struct ast_sockaddr *, addrs, NULL, ast_free_ptr);
+       RAII_VAR(struct ast_sockaddr *, addrs, NULL, ast_free);
        enum ast_media_type media_type = stream_to_media_type(session_media->stream_type);
        char host[NI_MAXHOST];
        int fdno, res;
index d91d370..0298671 100644 (file)
@@ -619,7 +619,7 @@ static int negotiate_incoming_sdp_stream(struct ast_sip_session *session, struct
 {
        struct t38_state *state;
        char host[NI_MAXHOST];
-       RAII_VAR(struct ast_sockaddr *, addrs, NULL, ast_free_ptr);
+       RAII_VAR(struct ast_sockaddr *, addrs, NULL, ast_free);
 
        if (!session->endpoint->media.t38.enabled) {
                return -1;
@@ -762,7 +762,7 @@ static int apply_negotiated_sdp_stream(struct ast_sip_session *session, struct a
                                       const struct pjmedia_sdp_session *local, const struct pjmedia_sdp_media *local_stream,
                                       const struct pjmedia_sdp_session *remote, const struct pjmedia_sdp_media *remote_stream)
 {
-       RAII_VAR(struct ast_sockaddr *, addrs, NULL, ast_free_ptr);
+       RAII_VAR(struct ast_sockaddr *, addrs, NULL, ast_free);
        char host[NI_MAXHOST];
        struct t38_state *state;