BUG/MINOR: connections: Make sure we free the connection on failure.
authorOlivier Houchard <cognet@ci0.org>
Fri, 20 Mar 2020 13:26:32 +0000 (14:26 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 31 Mar 2020 14:52:58 +0000 (16:52 +0200)
In connect_server(), make sure we properly free a newly created connection
if we somehow fail, and it has not yet been attached to a conn_stream, or
it would lead to a memory leak.
This should appease coverity for backend.c, as reported in inssue #556.

This should be backported to 2.1, 2.0 and 1.9

(cherry picked from commit c0caac2cc8f51c5802f0128a4ceb0c73ff601ead)
[wt: minor ctx adjustment]
Signed-off-by: Willy Tarreau <w@1wt.eu>

src/backend.c

index 6e50a5c..8ca5123 100644 (file)
@@ -1407,13 +1407,18 @@ int connect_server(struct stream *s)
                }
        }
 
-       if (!srv_conn || !sockaddr_alloc(&srv_conn->dst))
+       if (!srv_conn || !sockaddr_alloc(&srv_conn->dst)) {
+               if (srv_conn)
+                       conn_free(srv_conn);
                return SF_ERR_RESOURCE;
+       }
 
        if (!(s->flags & SF_ADDR_SET)) {
                err = assign_server_address(s);
-               if (err != SRV_STATUS_OK)
+               if (err != SRV_STATUS_OK) {
+                       conn_free(srv_conn);
                        return SF_ERR_INTERNAL;
+               }
        }
 
        /* copy the target address into the connection */
@@ -1429,11 +1434,15 @@ int connect_server(struct stream *s)
                else if (obj_type(s->target) == OBJ_TYPE_PROXY) {
                        /* proxies exclusively run on raw_sock right now */
                        conn_prepare(srv_conn, protocol_by_family(srv_conn->dst->ss_family), xprt_get(XPRT_RAW));
-                       if (!(srv_conn->ctrl))
+                       if (!(srv_conn->ctrl)) {
+                               conn_free(srv_conn);
                                return SF_ERR_INTERNAL;
+                       }
                }
-               else
+               else {
+                       conn_free(srv_conn);
                        return SF_ERR_INTERNAL;  /* how did we get there ? */
+               }
 
 #if defined(USE_OPENSSL) && defined(TLSEXT_TYPE_application_layer_protocol_negotiation)
                if (!srv ||