}
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) {