150479Speter/*
2327Sjkh * util/fptr_wlist.c - function pointer whitelists.
3327Sjkh *
4228990Suqs * Copyright (c) 2007, NLnet Labs. All rights reserved.
5327Sjkh *
6327Sjkh * This software is open source.
7327Sjkh *
8327Sjkh * Redistribution and use in source and binary forms, with or without
9327Sjkh * modification, are permitted provided that the following conditions
10327Sjkh * are met:
11327Sjkh *
12327Sjkh * Redistributions of source code must retain the above copyright notice,
13327Sjkh * this list of conditions and the following disclaimer.
14327Sjkh *
15327Sjkh * Redistributions in binary form must reproduce the above copyright notice,
16327Sjkh * this list of conditions and the following disclaimer in the documentation
17327Sjkh * and/or other materials provided with the distribution.
18327Sjkh *
19327Sjkh * Neither the name of the NLNET LABS nor the names of its contributors may
20327Sjkh * be used to endorse or promote products derived from this software without
21327Sjkh * specific prior written permission.
22327Sjkh *
23327Sjkh * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24327Sjkh * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25327Sjkh * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26327Sjkh * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2773134Ssobomax * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2873134Ssobomax * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
29327Sjkh * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3083663Ssobomax * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31327Sjkh * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32327Sjkh * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3373134Ssobomax * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34327Sjkh */
35327Sjkh
36/**
37 * \file
38 *
39 * This file contains functions that check function pointers.
40 * The functions contain a whitelist of known good callback values.
41 * Any other values lead to an error.
42 *
43 * Due to the listing nature, this file violates all the modularization
44 * boundaries in the program.
45 */
46#include "config.h"
47#include "util/fptr_wlist.h"
48#include "util/mini_event.h"
49#include "services/outside_network.h"
50#include "services/mesh.h"
51#include "services/localzone.h"
52#include "services/authzone.h"
53#include "services/cache/infra.h"
54#include "services/cache/rrset.h"
55#include "services/view.h"
56#include "dns64/dns64.h"
57#include "iterator/iterator.h"
58#include "iterator/iter_fwd.h"
59#include "validator/validator.h"
60#include "validator/val_anchor.h"
61#include "validator/val_nsec3.h"
62#include "validator/val_sigcrypt.h"
63#include "validator/val_kentry.h"
64#include "validator/val_neg.h"
65#include "validator/autotrust.h"
66#include "util/data/msgreply.h"
67#include "util/data/packed_rrset.h"
68#include "util/storage/slabhash.h"
69#include "util/storage/dnstree.h"
70#include "util/locks.h"
71#include "libunbound/libworker.h"
72#include "libunbound/context.h"
73#include "libunbound/worker.h"
74#include "util/tube.h"
75#include "util/config_file.h"
76#ifdef UB_ON_WINDOWS
77#include "winrc/win_svc.h"
78#endif
79#include "respip/respip.h"
80
81#ifdef WITH_PYTHONMODULE
82#include "pythonmod/pythonmod.h"
83#endif
84#ifdef WITH_DYNLIBMODULE
85#include "dynlibmod/dynlibmod.h"
86#endif
87#ifdef USE_CACHEDB
88#include "cachedb/cachedb.h"
89#endif
90#ifdef USE_IPSECMOD
91#include "ipsecmod/ipsecmod.h"
92#endif
93#ifdef CLIENT_SUBNET
94#include "edns-subnet/subnetmod.h"
95#endif
96#ifdef USE_IPSET
97#include "ipset/ipset.h"
98#endif
99#ifdef USE_DNSTAP
100#include "dnstap/dtstream.h"
101#endif
102
103int
104fptr_whitelist_comm_point(comm_point_callback_type *fptr)
105{
106	if(fptr == &worker_handle_request) return 1;
107	else if(fptr == &outnet_udp_cb) return 1;
108	else if(fptr == &outnet_tcp_cb) return 1;
109	else if(fptr == &tube_handle_listen) return 1;
110	else if(fptr == &auth_xfer_probe_udp_callback) return 1;
111	else if(fptr == &auth_xfer_transfer_tcp_callback) return 1;
112	else if(fptr == &auth_xfer_transfer_http_callback) return 1;
113	return 0;
114}
115
116int
117fptr_whitelist_comm_point_raw(comm_point_callback_type *fptr)
118{
119	if(fptr == &tube_handle_listen) return 1;
120	else if(fptr == &tube_handle_write) return 1;
121	else if(fptr == &remote_accept_callback) return 1;
122	else if(fptr == &remote_control_callback) return 1;
123	return 0;
124}
125
126int
127fptr_whitelist_comm_timer(void (*fptr)(void*))
128{
129	if(fptr == &pending_udp_timer_cb) return 1;
130	else if(fptr == &outnet_tcptimer) return 1;
131	else if(fptr == &pending_udp_timer_delay_cb) return 1;
132	else if(fptr == &worker_stat_timer_cb) return 1;
133	else if(fptr == &worker_probe_timer_cb) return 1;
134#ifdef UB_ON_WINDOWS
135	else if(fptr == &wsvc_cron_cb) return 1;
136#endif
137	else if(fptr == &auth_xfer_timer) return 1;
138	else if(fptr == &auth_xfer_probe_timer_callback) return 1;
139	else if(fptr == &auth_xfer_transfer_timer_callback) return 1;
140	else if(fptr == &mesh_serve_expired_callback) return 1;
141#ifdef USE_DNSTAP
142	else if(fptr == &mq_wakeup_cb) return 1;
143#endif
144	return 0;
145}
146
147int
148fptr_whitelist_comm_signal(void (*fptr)(int, void*))
149{
150	if(fptr == &worker_sighandler) return 1;
151	return 0;
152}
153
154int fptr_whitelist_start_accept(void (*fptr)(void*))
155{
156	if(fptr == &worker_start_accept) return 1;
157	return 0;
158}
159
160int fptr_whitelist_stop_accept(void (*fptr)(void*))
161{
162	if(fptr == &worker_stop_accept) return 1;
163	return 0;
164}
165
166int
167fptr_whitelist_event(void (*fptr)(int, short, void *))
168{
169	if(fptr == &comm_point_udp_callback) return 1;
170	else if(fptr == &comm_point_udp_ancil_callback) return 1;
171	else if(fptr == &comm_point_tcp_accept_callback) return 1;
172	else if(fptr == &comm_point_tcp_handle_callback) return 1;
173	else if(fptr == &comm_timer_callback) return 1;
174	else if(fptr == &comm_signal_callback) return 1;
175	else if(fptr == &comm_point_local_handle_callback) return 1;
176	else if(fptr == &comm_point_raw_handle_callback) return 1;
177	else if(fptr == &tube_handle_signal) return 1;
178	else if(fptr == &comm_base_handle_slow_accept) return 1;
179	else if(fptr == &comm_point_http_handle_callback) return 1;
180#ifdef USE_DNSTAP
181	else if(fptr == &dtio_output_cb) return 1;
182	else if(fptr == &dtio_cmd_cb) return 1;
183	else if(fptr == &dtio_reconnect_timeout_cb) return 1;
184	else if(fptr == &dtio_stop_timer_cb) return 1;
185	else if(fptr == &dtio_stop_ev_cb) return 1;
186	else if(fptr == &dtio_tap_callback) return 1;
187	else if(fptr == &dtio_mainfdcallback) return 1;
188#endif
189#ifdef UB_ON_WINDOWS
190	else if(fptr == &worker_win_stop_cb) return 1;
191#endif
192	return 0;
193}
194
195int
196fptr_whitelist_pending_udp(comm_point_callback_type *fptr)
197{
198	if(fptr == &serviced_udp_callback) return 1;
199	else if(fptr == &worker_handle_reply) return 1;
200	else if(fptr == &libworker_handle_reply) return 1;
201	return 0;
202}
203
204int
205fptr_whitelist_pending_tcp(comm_point_callback_type *fptr)
206{
207	if(fptr == &serviced_tcp_callback) return 1;
208	else if(fptr == &worker_handle_reply) return 1;
209	else if(fptr == &libworker_handle_reply) return 1;
210	return 0;
211}
212
213int
214fptr_whitelist_serviced_query(comm_point_callback_type *fptr)
215{
216	if(fptr == &worker_handle_service_reply) return 1;
217	else if(fptr == &libworker_handle_service_reply) return 1;
218	return 0;
219}
220
221int
222fptr_whitelist_rbtree_cmp(int (*fptr) (const void *, const void *))
223{
224	if(fptr == &mesh_state_compare) return 1;
225	else if(fptr == &mesh_state_ref_compare) return 1;
226	else if(fptr == &addr_tree_compare) return 1;
227	else if(fptr == &local_zone_cmp) return 1;
228	else if(fptr == &local_data_cmp) return 1;
229	else if(fptr == &fwd_cmp) return 1;
230	else if(fptr == &pending_cmp) return 1;
231	else if(fptr == &serviced_cmp) return 1;
232	else if(fptr == &reuse_cmp) return 1;
233	else if(fptr == &reuse_id_cmp) return 1;
234	else if(fptr == &name_tree_compare) return 1;
235	else if(fptr == &order_lock_cmp) return 1;
236	else if(fptr == &codeline_cmp) return 1;
237	else if(fptr == &nsec3_hash_cmp) return 1;
238	else if(fptr == &mini_ev_cmp) return 1;
239	else if(fptr == &anchor_cmp) return 1;
240	else if(fptr == &canonical_tree_compare) return 1;
241	else if(fptr == &context_query_cmp) return 1;
242	else if(fptr == &val_neg_data_compare) return 1;
243	else if(fptr == &val_neg_zone_compare) return 1;
244	else if(fptr == &probetree_cmp) return 1;
245	else if(fptr == &replay_var_compare) return 1;
246	else if(fptr == &view_cmp) return 1;
247	else if(fptr == &auth_zone_cmp) return 1;
248	else if(fptr == &auth_data_cmp) return 1;
249	else if(fptr == &auth_xfer_cmp) return 1;
250	return 0;
251}
252
253int
254fptr_whitelist_hash_sizefunc(lruhash_sizefunc_type fptr)
255{
256	if(fptr == &msgreply_sizefunc) return 1;
257	else if(fptr == &ub_rrset_sizefunc) return 1;
258	else if(fptr == &infra_sizefunc) return 1;
259	else if(fptr == &key_entry_sizefunc) return 1;
260	else if(fptr == &rate_sizefunc) return 1;
261	else if(fptr == &ip_rate_sizefunc) return 1;
262	else if(fptr == &test_slabhash_sizefunc) return 1;
263#ifdef CLIENT_SUBNET
264	else if(fptr == &msg_cache_sizefunc) return 1;
265#endif
266#ifdef USE_DNSCRYPT
267	else if(fptr == &dnsc_shared_secrets_sizefunc) return 1;
268	else if(fptr == &dnsc_nonces_sizefunc) return 1;
269#endif
270	return 0;
271}
272
273int
274fptr_whitelist_hash_compfunc(lruhash_compfunc_type fptr)
275{
276	if(fptr == &query_info_compare) return 1;
277	else if(fptr == &ub_rrset_compare) return 1;
278	else if(fptr == &infra_compfunc) return 1;
279	else if(fptr == &key_entry_compfunc) return 1;
280	else if(fptr == &rate_compfunc) return 1;
281	else if(fptr == &ip_rate_compfunc) return 1;
282	else if(fptr == &test_slabhash_compfunc) return 1;
283#ifdef USE_DNSCRYPT
284	else if(fptr == &dnsc_shared_secrets_compfunc) return 1;
285	else if(fptr == &dnsc_nonces_compfunc) return 1;
286#endif
287	return 0;
288}
289
290int
291fptr_whitelist_hash_delkeyfunc(lruhash_delkeyfunc_type fptr)
292{
293	if(fptr == &query_entry_delete) return 1;
294	else if(fptr == &ub_rrset_key_delete) return 1;
295	else if(fptr == &infra_delkeyfunc) return 1;
296	else if(fptr == &key_entry_delkeyfunc) return 1;
297	else if(fptr == &rate_delkeyfunc) return 1;
298	else if(fptr == &ip_rate_delkeyfunc) return 1;
299	else if(fptr == &test_slabhash_delkey) return 1;
300#ifdef USE_DNSCRYPT
301	else if(fptr == &dnsc_shared_secrets_delkeyfunc) return 1;
302	else if(fptr == &dnsc_nonces_delkeyfunc) return 1;
303#endif
304	return 0;
305}
306
307int
308fptr_whitelist_hash_deldatafunc(lruhash_deldatafunc_type fptr)
309{
310	if(fptr == &reply_info_delete) return 1;
311	else if(fptr == &rrset_data_delete) return 1;
312	else if(fptr == &infra_deldatafunc) return 1;
313	else if(fptr == &key_entry_deldatafunc) return 1;
314	else if(fptr == &rate_deldatafunc) return 1;
315	else if(fptr == &test_slabhash_deldata) return 1;
316#ifdef CLIENT_SUBNET
317	else if(fptr == &subnet_data_delete) return 1;
318#endif
319#ifdef USE_DNSCRYPT
320	else if(fptr == &dnsc_shared_secrets_deldatafunc) return 1;
321	else if(fptr == &dnsc_nonces_deldatafunc) return 1;
322#endif
323	return 0;
324}
325
326int
327fptr_whitelist_hash_markdelfunc(lruhash_markdelfunc_type fptr)
328{
329	if(fptr == NULL) return 1;
330	else if(fptr == &rrset_markdel) return 1;
331#ifdef CLIENT_SUBNET
332	else if(fptr == &subnet_markdel) return 1;
333#endif
334	return 0;
335}
336
337/** whitelist env->send_query callbacks */
338int
339fptr_whitelist_modenv_send_query(struct outbound_entry* (*fptr)(
340	struct query_info* qinfo, uint16_t flags, int dnssec, int want_dnssec,
341	int nocaps, struct sockaddr_storage* addr, socklen_t addrlen,
342	uint8_t* zone, size_t zonelen, int ssl_upstream, char* tls_auth_name,
343	struct module_qstate* q))
344{
345	if(fptr == &worker_send_query) return 1;
346	else if(fptr == &libworker_send_query) return 1;
347	return 0;
348}
349
350int
351fptr_whitelist_modenv_detach_subs(void (*fptr)(
352        struct module_qstate* qstate))
353{
354	if(fptr == &mesh_detach_subs) return 1;
355	return 0;
356}
357
358int
359fptr_whitelist_modenv_attach_sub(int (*fptr)(
360        struct module_qstate* qstate, struct query_info* qinfo,
361        uint16_t qflags, int prime, int valrec, struct module_qstate** newq))
362{
363	if(fptr == &mesh_attach_sub) return 1;
364	return 0;
365}
366
367int
368fptr_whitelist_modenv_add_sub(int (*fptr)(
369        struct module_qstate* qstate, struct query_info* qinfo,
370        uint16_t qflags, int prime, int valrec, struct module_qstate** newq,
371	struct mesh_state** sub))
372{
373	if(fptr == &mesh_add_sub) return 1;
374	return 0;
375}
376
377int
378fptr_whitelist_modenv_kill_sub(void (*fptr)(struct module_qstate* newq))
379{
380	if(fptr == &mesh_state_delete) return 1;
381	return 0;
382}
383
384int
385fptr_whitelist_modenv_detect_cycle(int (*fptr)(
386	struct module_qstate* qstate, struct query_info* qinfo,
387	uint16_t flags, int prime, int valrec))
388{
389	if(fptr == &mesh_detect_cycle) return 1;
390	return 0;
391}
392
393int
394fptr_whitelist_mod_init(int (*fptr)(struct module_env* env, int id))
395{
396	if(fptr == &iter_init) return 1;
397	else if(fptr == &val_init) return 1;
398	else if(fptr == &dns64_init) return 1;
399	else if(fptr == &respip_init) return 1;
400#ifdef WITH_PYTHONMODULE
401	else if(fptr == &pythonmod_init) return 1;
402#endif
403#ifdef WITH_DYNLIBMODULE
404	else if(fptr == &dynlibmod_init) return 1;
405#endif
406#ifdef USE_CACHEDB
407	else if(fptr == &cachedb_init) return 1;
408#endif
409#ifdef USE_IPSECMOD
410	else if(fptr == &ipsecmod_init) return 1;
411#endif
412#ifdef CLIENT_SUBNET
413	else if(fptr == &subnetmod_init) return 1;
414#endif
415#ifdef USE_IPSET
416	else if(fptr == &ipset_init) return 1;
417#endif
418	return 0;
419}
420
421int
422fptr_whitelist_mod_deinit(void (*fptr)(struct module_env* env, int id))
423{
424	if(fptr == &iter_deinit) return 1;
425	else if(fptr == &val_deinit) return 1;
426	else if(fptr == &dns64_deinit) return 1;
427	else if(fptr == &respip_deinit) return 1;
428#ifdef WITH_PYTHONMODULE
429	else if(fptr == &pythonmod_deinit) return 1;
430#endif
431#ifdef WITH_DYNLIBMODULE
432	else if(fptr == &dynlibmod_deinit) return 1;
433#endif
434#ifdef USE_CACHEDB
435	else if(fptr == &cachedb_deinit) return 1;
436#endif
437#ifdef USE_IPSECMOD
438	else if(fptr == &ipsecmod_deinit) return 1;
439#endif
440#ifdef CLIENT_SUBNET
441	else if(fptr == &subnetmod_deinit) return 1;
442#endif
443#ifdef USE_IPSET
444	else if(fptr == &ipset_deinit) return 1;
445#endif
446	return 0;
447}
448
449int
450fptr_whitelist_mod_operate(void (*fptr)(struct module_qstate* qstate,
451        enum module_ev event, int id, struct outbound_entry* outbound))
452{
453	if(fptr == &iter_operate) return 1;
454	else if(fptr == &val_operate) return 1;
455	else if(fptr == &dns64_operate) return 1;
456	else if(fptr == &respip_operate) return 1;
457#ifdef WITH_PYTHONMODULE
458	else if(fptr == &pythonmod_operate) return 1;
459#endif
460#ifdef WITH_DYNLIBMODULE
461	else if(fptr == &dynlibmod_operate) return 1;
462#endif
463#ifdef USE_CACHEDB
464	else if(fptr == &cachedb_operate) return 1;
465#endif
466#ifdef USE_IPSECMOD
467	else if(fptr == &ipsecmod_operate) return 1;
468#endif
469#ifdef CLIENT_SUBNET
470	else if(fptr == &subnetmod_operate) return 1;
471#endif
472#ifdef USE_IPSET
473	else if(fptr == &ipset_operate) return 1;
474#endif
475	return 0;
476}
477
478int
479fptr_whitelist_mod_inform_super(void (*fptr)(
480        struct module_qstate* qstate, int id, struct module_qstate* super))
481{
482	if(fptr == &iter_inform_super) return 1;
483	else if(fptr == &val_inform_super) return 1;
484	else if(fptr == &dns64_inform_super) return 1;
485	else if(fptr == &respip_inform_super) return 1;
486#ifdef WITH_PYTHONMODULE
487	else if(fptr == &pythonmod_inform_super) return 1;
488#endif
489#ifdef WITH_DYNLIBMODULE
490	else if(fptr == &dynlibmod_inform_super) return 1;
491#endif
492#ifdef USE_CACHEDB
493	else if(fptr == &cachedb_inform_super) return 1;
494#endif
495#ifdef USE_IPSECMOD
496	else if(fptr == &ipsecmod_inform_super) return 1;
497#endif
498#ifdef CLIENT_SUBNET
499	else if(fptr == &subnetmod_inform_super) return 1;
500#endif
501#ifdef USE_IPSET
502	else if(fptr == &ipset_inform_super) return 1;
503#endif
504	return 0;
505}
506
507int
508fptr_whitelist_mod_clear(void (*fptr)(struct module_qstate* qstate,
509        int id))
510{
511	if(fptr == &iter_clear) return 1;
512	else if(fptr == &val_clear) return 1;
513	else if(fptr == &dns64_clear) return 1;
514	else if(fptr == &respip_clear) return 1;
515#ifdef WITH_PYTHONMODULE
516	else if(fptr == &pythonmod_clear) return 1;
517#endif
518#ifdef WITH_DYNLIBMODULE
519	else if(fptr == &dynlibmod_clear) return 1;
520#endif
521#ifdef USE_CACHEDB
522	else if(fptr == &cachedb_clear) return 1;
523#endif
524#ifdef USE_IPSECMOD
525	else if(fptr == &ipsecmod_clear) return 1;
526#endif
527#ifdef CLIENT_SUBNET
528	else if(fptr == &subnetmod_clear) return 1;
529#endif
530#ifdef USE_IPSET
531	else if(fptr == &ipset_clear) return 1;
532#endif
533	return 0;
534}
535
536int
537fptr_whitelist_mod_get_mem(size_t (*fptr)(struct module_env* env, int id))
538{
539	if(fptr == &iter_get_mem) return 1;
540	else if(fptr == &val_get_mem) return 1;
541	else if(fptr == &dns64_get_mem) return 1;
542	else if(fptr == &respip_get_mem) return 1;
543#ifdef WITH_PYTHONMODULE
544	else if(fptr == &pythonmod_get_mem) return 1;
545#endif
546#ifdef WITH_DYNLIBMODULE
547	else if(fptr == &dynlibmod_get_mem) return 1;
548#endif
549#ifdef USE_CACHEDB
550	else if(fptr == &cachedb_get_mem) return 1;
551#endif
552#ifdef USE_IPSECMOD
553	else if(fptr == &ipsecmod_get_mem) return 1;
554#endif
555#ifdef CLIENT_SUBNET
556	else if(fptr == &subnetmod_get_mem) return 1;
557#endif
558#ifdef USE_IPSET
559	else if(fptr == &ipset_get_mem) return 1;
560#endif
561	return 0;
562}
563
564int
565fptr_whitelist_alloc_cleanup(void (*fptr)(void*))
566{
567	if(fptr == &worker_alloc_cleanup) return 1;
568	return 0;
569}
570
571int fptr_whitelist_tube_listen(tube_callback_type* fptr)
572{
573	if(fptr == &worker_handle_control_cmd) return 1;
574	else if(fptr == &libworker_handle_control_cmd) return 1;
575	return 0;
576}
577
578int fptr_whitelist_mesh_cb(mesh_cb_func_type fptr)
579{
580	if(fptr == &libworker_fg_done_cb) return 1;
581	else if(fptr == &libworker_bg_done_cb) return 1;
582	else if(fptr == &libworker_event_done_cb) return 1;
583	else if(fptr == &probe_answer_cb) return 1;
584	else if(fptr == &auth_xfer_probe_lookup_callback) return 1;
585	else if(fptr == &auth_xfer_transfer_lookup_callback) return 1;
586	return 0;
587}
588
589int fptr_whitelist_print_func(void (*fptr)(char*,void*))
590{
591	if(fptr == &config_print_func) return 1;
592	else if(fptr == &config_collate_func) return 1;
593	else if(fptr == &remote_get_opt_ssl) return 1;
594	return 0;
595}
596
597int fptr_whitelist_inplace_cb_reply_generic(inplace_cb_reply_func_type* fptr,
598	enum inplace_cb_list_type type)
599{
600#ifndef WITH_PYTHONMODULE
601	(void)fptr;
602#endif
603	if(type == inplace_cb_reply) {
604#ifdef WITH_PYTHONMODULE
605		if(fptr == &python_inplace_cb_reply_generic) return 1;
606#endif
607#ifdef WITH_DYNLIBMODULE
608		if(fptr == &dynlib_inplace_cb_reply_generic) return 1;
609#endif
610	} else if(type == inplace_cb_reply_cache) {
611#ifdef WITH_PYTHONMODULE
612		if(fptr == &python_inplace_cb_reply_generic) return 1;
613#endif
614#ifdef WITH_DYNLIBMODULE
615		if(fptr == &dynlib_inplace_cb_reply_generic) return 1;
616#endif
617	} else if(type == inplace_cb_reply_local) {
618#ifdef WITH_PYTHONMODULE
619		if(fptr == &python_inplace_cb_reply_generic) return 1;
620#endif
621#ifdef WITH_DYNLIBMODULE
622		if(fptr == &dynlib_inplace_cb_reply_generic) return 1;
623#endif
624	} else if(type == inplace_cb_reply_servfail) {
625#ifdef WITH_PYTHONMODULE
626		if(fptr == &python_inplace_cb_reply_generic) return 1;
627#endif
628#ifdef WITH_DYNLIBMODULE
629		if(fptr == &dynlib_inplace_cb_reply_generic) return 1;
630#endif
631	}
632	return 0;
633}
634
635int fptr_whitelist_inplace_cb_query(inplace_cb_query_func_type* fptr)
636{
637#ifdef CLIENT_SUBNET
638	if(fptr == &ecs_whitelist_check)
639		return 1;
640#endif
641#ifdef WITH_PYTHONMODULE
642        if(fptr == &python_inplace_cb_query_generic)
643                return 1;
644#endif
645#ifdef WITH_DYNLIBMODULE
646        if(fptr == &dynlib_inplace_cb_query_generic)
647                return 1;
648#endif
649	(void)fptr;
650	return 0;
651}
652
653int fptr_whitelist_inplace_cb_edns_back_parsed(
654	inplace_cb_edns_back_parsed_func_type* fptr)
655{
656#ifdef CLIENT_SUBNET
657	if(fptr == &ecs_edns_back_parsed)
658		return 1;
659#else
660	(void)fptr;
661#endif
662#ifdef WITH_DYNLIBMODULE
663    if(fptr == &dynlib_inplace_cb_edns_back_parsed)
664            return 1;
665#endif
666	return 0;
667}
668
669int fptr_whitelist_inplace_cb_query_response(
670	inplace_cb_query_response_func_type* fptr)
671{
672#ifdef CLIENT_SUBNET
673	if(fptr == &ecs_query_response)
674		return 1;
675#else
676	(void)fptr;
677#endif
678#ifdef WITH_DYNLIBMODULE
679    if(fptr == &dynlib_inplace_cb_query_response)
680            return 1;
681#endif
682	return 0;
683}
684
685int fptr_whitelist_serve_expired_lookup(serve_expired_lookup_func_type* fptr)
686{
687	if(fptr == &mesh_serve_expired_lookup)
688		return 1;
689	return 0;
690}
691