}
        buf_free(reqbuf);
 
-       free(vpninfo->cstp_pkt);
+       free_pkt(vpninfo, vpninfo->cstp_pkt);
        vpninfo->cstp_pkt = NULL;
 
        vpninfo->ip_info.mtu = 1400;
                int len;
 
                if (!vpninfo->cstp_pkt) {
-                       vpninfo->cstp_pkt = malloc(sizeof(struct pkt) + receive_mtu);
+                       vpninfo->cstp_pkt = alloc_pkt(vpninfo, receive_mtu);
                        if (!vpninfo->cstp_pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                break;
                /* Don't free the 'special' packets */
                if (vpninfo->current_ssl_pkt != &dpd_pkt &&
                    vpninfo->current_ssl_pkt != &nodtls_pkt)
-                       free(vpninfo->current_ssl_pkt);
+                       free_pkt(vpninfo, vpninfo->current_ssl_pkt);
 
                vpninfo->current_ssl_pkt = NULL;
        }
                         * may be in active use while we attempt to connect DTLS.
                         * So use vpninfo->dtls_pkt for this. */
                        if (!vpninfo->dtls_pkt)
-                               vpninfo->dtls_pkt = malloc(sizeof(struct pkt) + receive_mtu);
+                               vpninfo->dtls_pkt = alloc_pkt(vpninfo, receive_mtu);
                        if (!vpninfo->dtls_pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                dtls_close(vpninfo);
                unsigned char *buf;
 
                if (!vpninfo->dtls_pkt) {
-                       vpninfo->dtls_pkt = malloc(sizeof(struct pkt) + len);
+                       vpninfo->dtls_pkt = alloc_pkt(vpninfo, len);
                        if (!vpninfo->dtls_pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                break;
                vpn_progress(vpninfo, PRG_TRACE,
                             _("Sent DTLS packet of %d bytes; DTLS send returned %d\n"),
                             this->len, ret);
-               free(this);
+               free_pkt(vpninfo, this);
        }
 
        return work_done;
 
 
        /* If *any* compression is enabled, we'll need a deflate_pkt to compress into */
        if (deflate_bufsize > vpninfo->deflate_pkt_size) {
-               free(vpninfo->deflate_pkt);
-               vpninfo->deflate_pkt = malloc(sizeof(struct pkt) + deflate_bufsize);
+               free_pkt(vpninfo, vpninfo->deflate_pkt);
+               vpninfo->deflate_pkt = alloc_pkt(vpninfo, deflate_bufsize);
                if (!vpninfo->deflate_pkt) {
                        vpninfo->deflate_pkt_size = 0;
                        vpn_progress(vpninfo, PRG_ERR,
                int len, payload_len;
 
                if (!vpninfo->cstp_pkt) {
-                       vpninfo->cstp_pkt = malloc(sizeof(struct pkt) + receive_mtu);
+                       vpninfo->cstp_pkt = alloc_pkt(vpninfo, receive_mtu);
                        if (!vpninfo->cstp_pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                break;
                }
                /* Don't free the 'special' packets */
                if (vpninfo->current_ssl_pkt == vpninfo->deflate_pkt) {
-                       free(vpninfo->pending_deflated_pkt);
+                       free_pkt(vpninfo, vpninfo->pending_deflated_pkt);
                        vpninfo->pending_deflated_pkt = NULL;
                } else if (vpninfo->current_ssl_pkt != &dpd_pkt &&
                         vpninfo->current_ssl_pkt != &dpd_resp_pkt &&
                         vpninfo->current_ssl_pkt != &keepalive_pkt)
-                       free(vpninfo->current_ssl_pkt);
+                       free_pkt(vpninfo, vpninfo->current_ssl_pkt);
 
                vpninfo->current_ssl_pkt = NULL;
        }
 
                unsigned char *buf;
 
                if (!vpninfo->dtls_pkt) {
-                       vpninfo->dtls_pkt = malloc(sizeof(struct pkt) + len);
+                       vpninfo->dtls_pkt = alloc_pkt(vpninfo, len);
                        if (!vpninfo->dtls_pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                break;
                vpn_progress(vpninfo, PRG_TRACE,
                             _("Sent DTLS packet of %d bytes; DTLS send returned %d\n"),
                             this->len, ret);
-               free(this);
+               free_pkt(vpninfo, this);
        }
 
        return work_done;
 
                struct pkt *pkt;
 
                if (!vpninfo->dtls_pkt) {
-                       vpninfo->dtls_pkt = malloc(sizeof(struct pkt) + len);
+                       vpninfo->dtls_pkt = alloc_pkt(vpninfo, len);
                        if (!vpninfo->dtls_pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                break;
                        }
                }
                if (pkt->data[len - 1] == 0x05) {
-                       struct pkt *newpkt = malloc(sizeof(*pkt) + receive_mtu + vpninfo->pkt_trailer);
+                       struct pkt *newpkt = alloc_pkt(vpninfo, receive_mtu + vpninfo->pkt_trailer);
                        int newlen = receive_mtu;
                        if (!newpkt) {
                                vpn_progress(vpninfo, PRG_ERR,
                                            pkt->data, &pkt->len) || pkt->len) {
                                vpn_progress(vpninfo, PRG_ERR,
                                             _("LZO decompression of ESP packet failed\n"));
-                               free(newpkt);
+                               free_pkt(vpninfo, newpkt);
                                continue;
                        }
                        newpkt->len = receive_mtu - newlen;
                        len = construct_esp_packet(vpninfo, this, 0);
                        if (len < 0) {
                                /* Should we disable ESP? */
-                               free(this);
+                               free_pkt(vpninfo, this);
                                work_done = 1;
                                continue;
                        }
                        unmonitor_write_fd(vpninfo, dtls);
                        vpninfo->deflate_pkt = NULL;
                }
-               free(this);
+               free_pkt(vpninfo, this);
                work_done = 1;
        }
 
        if (vpninfo->dtls_state > DTLS_DISABLED)
                vpninfo->dtls_state = DTLS_SLEEPING;
        if (vpninfo->deflate_pkt) {
-               free(vpninfo->deflate_pkt);
+               free_pkt(vpninfo, vpninfo->deflate_pkt);
                vpninfo->deflate_pkt = NULL;
        }
 }
 
                int len, payload_len;
 
                if (!vpninfo->cstp_pkt) {
-                       vpninfo->cstp_pkt = malloc(sizeof(struct pkt) + receive_mtu);
+                       vpninfo->cstp_pkt = alloc_pkt(vpninfo, receive_mtu);
                        if (!vpninfo->cstp_pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                break;
                }
                /* Don't free the 'special' packets */
                if (vpninfo->current_ssl_pkt != &dpd_pkt)
-                       free(vpninfo->current_ssl_pkt);
+                       free_pkt(vpninfo, vpninfo->current_ssl_pkt);
 
                vpninfo->current_ssl_pkt = NULL;
        }
                plen = sizeof(struct ip6_hdr) + icmplen;
        else
                plen = sizeof(struct ip) + icmplen;
-       struct pkt *pkt = malloc(sizeof(*pkt) + plen + vpninfo->pkt_trailer);
+       struct pkt *pkt = alloc_pkt(vpninfo, plen + vpninfo->pkt_trailer);
        if (!pkt)
                return -ENOMEM;
 
        if (vpninfo->dtls_fd == -1) {
                int fd = udp_connect(vpninfo);
                if (fd < 0) {
-                       free(pkt);
+                       free_pkt(vpninfo, pkt);
                        return fd;
                }
                /* We are not connected until we get an ESP packet back */
                        vpn_progress(vpninfo, PRG_DEBUG, _("Failed to send ESP probe\n"));
        }
 
-       free(pkt);
+       free_pkt(vpninfo, pkt);
 
        vpninfo->dtls_times.last_tx = time(&vpninfo->new_dtls_started);
 
 
        inflateEnd(&vpninfo->inflate_strm);
        deflateEnd(&vpninfo->deflate_strm);
 
-       free(vpninfo->deflate_pkt);
-       free(vpninfo->tun_pkt);
-       free(vpninfo->dtls_pkt);
-       free(vpninfo->cstp_pkt);
+       free_pkt(vpninfo, vpninfo->deflate_pkt);
+       free_pkt(vpninfo, vpninfo->tun_pkt);
+       free_pkt(vpninfo, vpninfo->dtls_pkt);
+       free_pkt(vpninfo, vpninfo->cstp_pkt);
        free(vpninfo->bearer_token);
        free(vpninfo);
 }
 
        if (!tun_is_up(vpninfo)) {
                /* no tun yet; clear any queued packets */
                while ((this = dequeue_packet(&vpninfo->incoming_queue)))
-                       free(this);
+                       free_pkt(vpninfo, this);
 
                return 0;
        }
                        int len = vpninfo->ip_info.mtu;
 
                        if (!out_pkt) {
-                               out_pkt = malloc(sizeof(struct pkt) + len + vpninfo->pkt_trailer);
+                               out_pkt = alloc_pkt(vpninfo, len + vpninfo->pkt_trailer);
                                if (!out_pkt) {
                                        vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                        break;
                vpninfo->stats.rx_pkts++;
                vpninfo->stats.rx_bytes += this->len;
 
-               free(this);
+               free_pkt(vpninfo, this);
        }
        /* Work is not done if we just got rid of packets off the queue */
        return work_done;
 
        buf_free(reqbuf);
 
        vpninfo->partial_rec_size = 0;
-       free(vpninfo->cstp_pkt);
+       free_pkt(vpninfo, vpninfo->cstp_pkt);
        vpninfo->cstp_pkt = NULL;
 
        return ret;
 
                len = receive_mtu + vpninfo->pkt_trailer;
                if (!vpninfo->cstp_pkt) {
-                       vpninfo->cstp_pkt = malloc(sizeof(struct pkt) + len);
+                       vpninfo->cstp_pkt = alloc_pkt(vpninfo, len);
                        if (!vpninfo->cstp_pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                break;
                }
                /* Don't free the 'special' packets */
                if (vpninfo->current_ssl_pkt == vpninfo->deflate_pkt) {
-                       free(vpninfo->pending_deflated_pkt);
+                       free_pkt(vpninfo, vpninfo->pending_deflated_pkt);
                        vpninfo->pending_deflated_pkt = NULL;
                } else if (vpninfo->current_ssl_pkt == &esp_enable_pkt) {
                        /* Only set the ESP state to connected and actually start
                        vpninfo->dtls_state = DTLS_ESTABLISHED;
                        work_done = 1;
                } else {
-                       free(vpninfo->current_ssl_pkt);
+                       free_pkt(vpninfo, vpninfo->current_ssl_pkt);
                }
                vpninfo->current_ssl_pkt = NULL;
        }
                monitor_except_fd(vpninfo, dtls);
        }
 
-       pkt = malloc(sizeof(*pkt) + 1 + vpninfo->pkt_trailer);
+       pkt = alloc_pkt(vpninfo, 1 + vpninfo->pkt_trailer);
        if (!pkt)
                return -ENOMEM;
 
                    send(vpninfo->dtls_fd, (void *)&pkt->esp, pktlen, 0) < 0)
                        vpn_progress(vpninfo, PRG_DEBUG, _("Failed to send ESP probe\n"));
        }
-       free(pkt);
+       free_pkt(vpninfo, pkt);
 
        vpninfo->dtls_times.last_tx = time(&vpninfo->new_dtls_started);
 
 
        q->tail = &q->head;
 }
 
+
+static inline struct pkt *alloc_pkt(struct openconnect_info *vpninfo, int len)
+{
+       return malloc(sizeof(struct pkt) + len);
+}
+
+static inline void free_pkt(struct openconnect_info *vpninfo, struct pkt *pkt)
+{
+       free(pkt);
+}
+
 #define TLS_OVERHEAD 5 /* packet + header */
 #define DTLS_OVERHEAD (1 /* packet + header */ + 13 /* DTLS header */ + \
         20 /* biggest supported MAC (SHA1) */ +  32 /* biggest supported IV (AES-256) */ + \
 
 
                /* Drop any failed outgoing packet from previous connection;
                 * we need to reconfigure before we can send data packets. */
-               free(vpninfo->current_ssl_pkt);
+               free_pkt(vpninfo, vpninfo->current_ssl_pkt);
                vpninfo->current_ssl_pkt = NULL;
                vpninfo->partial_rec_size = 0;
                ppp->ppp_state = PPPS_ESTABLISH;
                int len, payload_len, next_len;
 
                if (!vpninfo->cstp_pkt) {
-                       vpninfo->cstp_pkt = malloc(sizeof(struct pkt) + receive_mtu);
+                       vpninfo->cstp_pkt = alloc_pkt(vpninfo, receive_mtu);
                        if (!vpninfo->cstp_pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                break;
                         * full sized packet so it can remain in vpninfo->cstp_pkt and be reused
                         * for receiving the next packet, if it's something other than data and
                         * doesn't get queued and freed. */
-                       this = vpninfo->cstp_pkt = malloc(sizeof(struct pkt) + receive_mtu);
+                       this = vpninfo->cstp_pkt = alloc_pkt(vpninfo, receive_mtu);
                        if (!this)
                                return -ENOMEM;
                        eh = this->data - rsv_hdr_size;
                        return 1;
                }
 
-               free(this);
+               free_pkt(vpninfo, this);
                vpninfo->current_ssl_pkt = NULL;
        }
 
                                                 proto == PPP_LCP ? ASYNCMAP_LCP : ppp->out_asyncmap);
                        if (!this)
                                return 1; /* XX */
-                       free(vpninfo->current_ssl_pkt);
+                       free_pkt(vpninfo, vpninfo->current_ssl_pkt);
                        vpninfo->current_ssl_pkt = this;
                }
 
                         * may be in active use while we attempt to connect DTLS.
                         * So use vpninfo->dtls_pkt for this. */
                        if (!vpninfo->dtls_pkt)
-                               vpninfo->dtls_pkt = malloc(sizeof(struct pkt) + receive_mtu);
+                               vpninfo->dtls_pkt = alloc_pkt(vpninfo, receive_mtu);
                        if (!vpninfo->dtls_pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                dtls_close(vpninfo);
                        } else if (ret > 0) {
                                vpninfo->dtls_state = DTLS_ESTABLISHED;
                                vpninfo->dtls_pkt = NULL;
-                               free(this);
+                               free_pkt(vpninfo, this);
 
                                /* We are going to take over the PPP now; reset the TCP one */
                                ret = ppp_reset(vpninfo);
 
        monitor_read_fd(vpninfo, ssl);
        monitor_except_fd(vpninfo, ssl);
 
-       free(vpninfo->cstp_pkt);
+       free_pkt(vpninfo, vpninfo->cstp_pkt);
        vpninfo->cstp_pkt = NULL;
 
        return ret;
                int len, payload_len;
 
                if (!pkt) {
-                       pkt = vpninfo->cstp_pkt = malloc(sizeof(struct pkt) + receive_mtu);
+                       pkt = vpninfo->cstp_pkt = alloc_pkt(vpninfo, receive_mtu);
                        if (!pkt) {
                                vpn_progress(vpninfo, PRG_ERR, _("Allocation failed\n"));
                                break;
                }
                /* Don't free the 'special' packets */
                if (vpninfo->current_ssl_pkt == vpninfo->deflate_pkt) {
-                       free(vpninfo->pending_deflated_pkt);
+                       free_pkt(vpninfo, vpninfo->pending_deflated_pkt);
                        vpninfo->pending_deflated_pkt = NULL;
                } else
-                       free(vpninfo->current_ssl_pkt);
+                       free_pkt(vpninfo, vpninfo->current_ssl_pkt);
 
                vpninfo->current_ssl_pkt = NULL;
        }
 
        timeout = vpninfo->reconnect_timeout;
        interval = vpninfo->reconnect_interval;
 
-       free(vpninfo->dtls_pkt);
+       free_pkt(vpninfo, vpninfo->dtls_pkt);
        vpninfo->dtls_pkt = NULL;
-       free(vpninfo->tun_pkt);
+       free_pkt(vpninfo, vpninfo->tun_pkt);
        vpninfo->tun_pkt = NULL;
 
        while (1) {