@@ -301,8 +301,9 @@ static void forward_query(int udpfd, union mysockaddr *udpaddr,
301
301
302
302
if (gobig && !bitvector )
303
303
{
304
- casediff = (i /BITS_IN_INT ) + 1 ; /* length of array */
305
- if ((bitvector = whine_malloc (casediff )))
304
+ casediff = ((i - 1 )/BITS_IN_INT ) + 1 ; /* length of array */
305
+ /* whine_malloc() zeros memory */
306
+ if ((bitvector = whine_malloc (casediff * sizeof (unsigned int ))))
306
307
goto big_redo ;
307
308
}
308
309
}
@@ -402,6 +403,7 @@ static void forward_query(int udpfd, union mysockaddr *udpaddr,
402
403
header -> id = ntohs (forward -> new_id );
403
404
404
405
forward -> frec_src .encode_bitmap = option_bool (OPT_NO_0x20 ) ? 0 : rand32 ();
406
+ forward -> frec_src .encode_bigmap = NULL ;
405
407
p = (unsigned char * )(header + 1 );
406
408
if (!extract_name (header , plen , & p , (char * )& forward -> frec_src .encode_bitmap , EXTR_NAME_FLIP , 1 ))
407
409
goto reply ;
@@ -721,7 +723,6 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
721
723
unsigned int rcode = RCODE (header );
722
724
size_t plen ;
723
725
/******** Pi-hole modification ********/
724
- unsigned char * pheader_copy = NULL ;
725
726
unsigned char ede_data [MAX_EDE_DATA ] = { 0 };
726
727
size_t ede_len = 0 ;
727
728
/**************************************/
@@ -874,16 +875,6 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
874
875
if (rc == 99 )
875
876
{
876
877
cache_secure = 0 ;
877
- // Make a private copy of the pheader to ensure
878
- // we are not accidentially rewriting what is in
879
- // the pheader when we're creating a crafted reply
880
- // further below (when a query is to be blocked)
881
- if (pheader )
882
- {
883
- pheader_copy = calloc (1 , plen );
884
- memcpy (pheader_copy , pheader , plen );
885
- }
886
-
887
878
// Generate DNS packet for reply, a possibly existing pseudo header
888
879
// will be restored later inside resize_packet()
889
880
n = FTL_make_answer (header , ((char * ) header ) + 65536 , n , ede_data , & ede_len );
@@ -919,22 +910,17 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
919
910
920
911
/* the code above can elide sections of the packet. Find the new length here
921
912
and put back pseudoheader if it was removed. */
922
- n = resize_packet (header , n , pheader_copy ? pheader_copy : pheader , plen );
913
+ n = resize_packet (header , n , pheader , plen );
923
914
/******** Pi-hole modification ********/
924
- // The line above was modified to use
925
- // pheader_copy instead of pheader
926
- if (pheader_copy )
927
- free (pheader_copy );
928
-
929
915
if (pheader && (ede != EDE_UNSET || ede_len > 0 ))
930
916
{
931
917
if (ede_len > 0 )
932
- n = add_pseudoheader (header , n , limit , EDNS0_OPTION_EDE , ede_data , ede_len , do_bit , 1 );
933
- else
934
- {
935
- u16 swap = htons ((u16 )ede );
936
- n = add_pseudoheader (header , n , limit , EDNS0_OPTION_EDE , (unsigned char * )& swap , 2 , do_bit , 1 );
937
- }
918
+ n = add_pseudoheader (header , n , limit , EDNS0_OPTION_EDE , ede_data , ede_len , do_bit , 1 );
919
+ else
920
+ {
921
+ u16 swap = htons ((u16 )ede );
922
+ n = add_pseudoheader (header , n , limit , EDNS0_OPTION_EDE , (unsigned char * )& swap , 2 , do_bit , 1 );
923
+ }
938
924
}
939
925
/**************************************/
940
926
@@ -1100,6 +1086,7 @@ static void dnssec_validate(struct frec *forward, struct dns_header *header,
1100
1086
new -> flags |= flags ;
1101
1087
new -> forwardall = 0 ;
1102
1088
new -> frec_src .encode_bitmap = 0 ;
1089
+ new -> frec_src .encode_bigmap = NULL ;
1103
1090
1104
1091
forward -> next_dependent = NULL ;
1105
1092
new -> dependent = forward ; /* to find query awaiting new one. */
@@ -1555,13 +1542,13 @@ void return_reply(time_t now, struct frec *forward, struct dns_header *header, s
1555
1542
int first_ID = -1 ;
1556
1543
1557
1544
/* This gets the name back to the state it was in when we started. */
1558
- flip_queryname (header , nn , prev , & forward -> frec_src );
1545
+ flip_queryname (header , new , prev , & forward -> frec_src );
1559
1546
1560
1547
for (src = & forward -> frec_src , prev = NULL ; src ; prev = src , src = src -> next )
1561
1548
{
1562
1549
/* If you didn't undertand this above, you won't understand it here either. */
1563
1550
if (prev )
1564
- flip_queryname (header , nn , prev , src );
1551
+ flip_queryname (header , new , prev , src );
1565
1552
1566
1553
if (src -> fd != -1 && nn > src -> udp_pkt_size )
1567
1554
{
@@ -3200,7 +3187,7 @@ static void free_frec(struct frec *f)
3200
3187
struct frec_src * last ;
3201
3188
3202
3189
/* add back to freelist if not the record builtin to every frec,
3203
- also free any bigmaps they's been decorated with. */
3190
+ also free any bigmaps they've been decorated with. */
3204
3191
for (last = f -> frec_src .next ; last && last -> next ; last = last -> next )
3205
3192
if (last -> encode_bigmap )
3206
3193
{
@@ -3210,6 +3197,12 @@ static void free_frec(struct frec *f)
3210
3197
3211
3198
if (last )
3212
3199
{
3200
+ /* final link in the chain loses bigmap too. */
3201
+ if (last -> encode_bigmap )
3202
+ {
3203
+ free (last -> encode_bigmap );
3204
+ last -> encode_bigmap = NULL ;
3205
+ }
3213
3206
last -> next = daemon -> free_frec_src ;
3214
3207
daemon -> free_frec_src = f -> frec_src .next ;
3215
3208
}
0 commit comments