diff --git a/src/goodbyedpi.c b/src/goodbyedpi.c index 6689b71..322a783 100644 --- a/src/goodbyedpi.c +++ b/src/goodbyedpi.c @@ -181,7 +181,11 @@ static void add_filter_str(int proto, int port) { const char *udp = " or (udp and !impostor and !loopback and (udp.SrcPort == %d or udp.DstPort == %d))"; const char *tcp = " or (tcp and !impostor and !loopback " MAXPAYLOADSIZE_TEMPLATE " and (tcp.SrcPort == %d or tcp.DstPort == %d))"; - size_t new_filter_size = strlen(filter_string) + (proto == IPPROTO_UDP ? strlen(udp) : strlen(tcp)) + 16; + const size_t udp_length = strlen(udp); + const size_t tcp_length = strlen(tcp); + const size_t filter_string_length = strlen(filter_string); + + size_t new_filter_size = filter_string_length + (proto == IPPROTO_UDP ? udp_length : tcp_length) + 16; char *new_filter = malloc(new_filter_size); sprintf(new_filter, proto == IPPROTO_UDP ? udp : tcp, port, port); @@ -190,11 +194,10 @@ static void add_filter_str(int proto, int port) { filter_string = new_filter; } -static void add_ip_id_str(int id) { - const char *ipid = " or ip.Id == %d"; - char *addfilter = malloc(strlen(ipid) + 16); - sprintf(addfilter, ipid, id); +static void add_ip_id_str(int id) { + char addfilter[32]; + snprintf(addfilter, sizeof(addfilter), " or ip.Id == %d", id); char *newstr = repl_str(filter_string, IPID_TEMPLATE, addfilter); free(filter_string); @@ -205,17 +208,20 @@ static void add_ip_id_str(int id) { filter_passive_string = newstr; } + static void add_maxpayloadsize_str(unsigned short maxpayload) { const char *maxpayloadsize_str = "and (tcp.PayloadLength ? tcp.PayloadLength < %hu or tcp.Payload32[0] == 0x47455420 or tcp.Payload32[0] == 0x504F5354 : true)"; - char *addfilter = malloc(strlen(maxpayloadsize_str) + 16); + char *addfilter; - sprintf(addfilter, maxpayloadsize_str, maxpayload); + asprintf(&addfilter, maxpayloadsize_str, maxpayload); char *newstr = repl_str(filter_string, MAXPAYLOADSIZE_TEMPLATE, addfilter); free(filter_string); filter_string = newstr; + free(addfilter); } + static void finalize_filter_strings() { char *newstr = repl_str(filter_string, IPID_TEMPLATE, ""); free(filter_string);