fix: safety defenders for delay_packet_send

This commit is contained in:
Vadim Vetrov
2025-02-06 18:43:31 +03:00
parent 49304cc111
commit df70763b4a
2 changed files with 26 additions and 21 deletions

View File

@@ -502,18 +502,11 @@ drop:
int send_ip4_frags(const struct section_config_t *section, const uint8_t *packet, size_t pktlen, const size_t *poses, size_t poses_sz, size_t dvs) { int send_ip4_frags(const struct section_config_t *section, const uint8_t *packet, size_t pktlen, const size_t *poses, size_t poses_sz, size_t dvs) {
if (poses_sz == 0) { if (poses_sz == 0) {
lgtrace_addp("raw send packet of %zu bytes with %zu dvs", pktlen, dvs);
if (section->seg2_delay && ((dvs > 0) ^ section->frag_sni_reverse)) { if (section->seg2_delay && ((dvs > 0) ^ section->frag_sni_reverse)) {
if (!instance_config.send_delayed_packet) { return instance_config.send_delayed_packet(
return -EINVAL;
}
lgtrace_addp("Sent %zu delayed for %d", pktlen, section->seg2_delay);
instance_config.send_delayed_packet(
packet, pktlen, section->seg2_delay); packet, pktlen, section->seg2_delay);
return 0;
} else { } else {
lgtrace_addp("Sent %zu bytes", pktlen);
return instance_config.send_raw_packet( return instance_config.send_raw_packet(
packet, pktlen); packet, pktlen);
} }
@@ -588,18 +581,11 @@ out:
int send_tcp_frags(const struct section_config_t *section, const uint8_t *packet, size_t pktlen, const size_t *poses, size_t poses_sz, size_t dvs) { int send_tcp_frags(const struct section_config_t *section, const uint8_t *packet, size_t pktlen, const size_t *poses, size_t poses_sz, size_t dvs) {
if (poses_sz == 0) { if (poses_sz == 0) {
lgtrace_addp("raw send packet of %zu bytes with %zu dvs", pktlen, dvs);
if (section->seg2_delay && ((dvs > 0) ^ section->frag_sni_reverse)) { if (section->seg2_delay && ((dvs > 0) ^ section->frag_sni_reverse)) {
if (!instance_config.send_delayed_packet) { return instance_config.send_delayed_packet(
return -EINVAL;
}
instance_config.send_delayed_packet(
packet, pktlen, section->seg2_delay); packet, pktlen, section->seg2_delay);
return 0;
} else { } else {
lgtrace_addp("raw send packet of %zu bytes with %zu dvs", pktlen, dvs);
return instance_config.send_raw_packet( return instance_config.send_raw_packet(
packet, pktlen); packet, pktlen);
} }

View File

@@ -614,14 +614,33 @@ void *delay_packet_send_fn(void *data) {
} }
int delay_packet_send(const unsigned char *data, size_t data_len, unsigned int delay_ms) { int delay_packet_send(const unsigned char *data, size_t data_len, unsigned int delay_ms) {
int ret;
struct dps_t *dpdt = malloc(sizeof(struct dps_t)); struct dps_t *dpdt = malloc(sizeof(struct dps_t));
if (dpdt == NULL) {
return -ENOMEM;
}
*dpdt = (struct dps_t){0};
dpdt->pkt = malloc(data_len); dpdt->pkt = malloc(data_len);
if (dpdt->pkt == NULL) {
free(dpdt);
return -ENOMEM;
}
memcpy(dpdt->pkt, data, data_len); memcpy(dpdt->pkt, data, data_len);
dpdt->pktlen = data_len; dpdt->pktlen = data_len;
dpdt->timer = delay_ms; dpdt->timer = delay_ms;
pthread_t thr; pthread_t thr = {0};
pthread_create(&thr, NULL, delay_packet_send_fn, dpdt); ret = pthread_create(&thr, NULL, delay_packet_send_fn, dpdt);
pthread_detach(thr); if (ret != 0) {
free(dpdt->pkt);
free(dpdt);
return -ret;
}
ret = pthread_detach(thr);
lgtrace_addp("Scheduled packet send after %d ms", delay_ms); lgtrace_addp("Scheduled packet send after %d ms", delay_ms);
return 0; return 0;