fptr_wlist.c revision 368693
189857Sobrien/*
2218822Sdim * util/fptr_wlist.c - function pointer whitelists.
3218822Sdim *
489857Sobrien * Copyright (c) 2007, NLnet Labs. All rights reserved.
589857Sobrien *
6104834Sobrien * This software is open source.
789857Sobrien *
8104834Sobrien * Redistribution and use in source and binary forms, with or without
9104834Sobrien * modification, are permitted provided that the following conditions
10104834Sobrien * are met:
11104834Sobrien *
1289857Sobrien * Redistributions of source code must retain the above copyright notice,
13104834Sobrien * this list of conditions and the following disclaimer.
14104834Sobrien *
15104834Sobrien * Redistributions in binary form must reproduce the above copyright notice,
16104834Sobrien * this list of conditions and the following disclaimer in the documentation
1789857Sobrien * and/or other materials provided with the distribution.
18104834Sobrien *
19104834Sobrien * Neither the name of the NLNET LABS nor the names of its contributors may
20218822Sdim * be used to endorse or promote products derived from this software without
2189857Sobrien * specific prior written permission.
22218822Sdim *
2389857Sobrien * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2489857Sobrien * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2589857Sobrien * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2689857Sobrien * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27104834Sobrien * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2889857Sobrien * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2989857Sobrien * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3089857Sobrien * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3189857Sobrien * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3289857Sobrien * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3389857Sobrien * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34130561Sobrien */
35130561Sobrien
3689857Sobrien/**
3789857Sobrien * \file
3889857Sobrien *
3989857Sobrien * This file contains functions that check function pointers.
40130561Sobrien * The functions contain a whitelist of known good callback values.
4189857Sobrien * Any other values lead to an error.
4289857Sobrien *
4389857Sobrien * Due to the listing nature, this file violates all the modularization
4489857Sobrien * boundaries in the program.
4589857Sobrien */
4689857Sobrien#include "config.h"
4789857Sobrien#include "util/fptr_wlist.h"
4889857Sobrien#include "util/mini_event.h"
4989857Sobrien#include "services/outside_network.h"
5089857Sobrien#include "services/mesh.h"
5189857Sobrien#include "services/localzone.h"
5289857Sobrien#include "services/authzone.h"
5389857Sobrien#include "services/cache/infra.h"
5489857Sobrien#include "services/cache/rrset.h"
5589857Sobrien#include "services/view.h"
5689857Sobrien#include "dns64/dns64.h"
5789857Sobrien#include "iterator/iterator.h"
5889857Sobrien#include "iterator/iter_fwd.h"
5989857Sobrien#include "validator/validator.h"
6089857Sobrien#include "validator/val_anchor.h"
6189857Sobrien#include "validator/val_nsec3.h"
6289857Sobrien#include "validator/val_sigcrypt.h"
63130561Sobrien#include "validator/val_kentry.h"
64130561Sobrien#include "validator/val_neg.h"
65130561Sobrien#include "validator/autotrust.h"
6689857Sobrien#include "util/data/msgreply.h"
6789857Sobrien#include "util/data/packed_rrset.h"
6889857Sobrien#include "util/storage/slabhash.h"
69130561Sobrien#include "util/storage/dnstree.h"
70130561Sobrien#include "util/locks.h"
71130561Sobrien#include "libunbound/libworker.h"
7289857Sobrien#include "libunbound/context.h"
7389857Sobrien#include "libunbound/worker.h"
7489857Sobrien#include "util/tube.h"
75130561Sobrien#include "util/config_file.h"
7689857Sobrien#ifdef UB_ON_WINDOWS
77130561Sobrien#include "winrc/win_svc.h"
7889857Sobrien#endif
7989857Sobrien#include "respip/respip.h"
80130561Sobrien
81130561Sobrien#ifdef WITH_PYTHONMODULE
82130561Sobrien#include "pythonmod/pythonmod.h"
8389857Sobrien#endif
8489857Sobrien#ifdef WITH_DYNLIBMODULE
8589857Sobrien#include "dynlibmod/dynlibmod.h"
8689857Sobrien#endif
8789857Sobrien#ifdef USE_CACHEDB
88130561Sobrien#include "cachedb/cachedb.h"
8989857Sobrien#endif
9089857Sobrien#ifdef USE_IPSECMOD
9189857Sobrien#include "ipsecmod/ipsecmod.h"
9289857Sobrien#endif
9389857Sobrien#ifdef CLIENT_SUBNET
94130561Sobrien#include "edns-subnet/subnetmod.h"
9589857Sobrien#endif
9689857Sobrien#ifdef USE_IPSET
9789857Sobrien#include "ipset/ipset.h"
9889857Sobrien#endif
99130561Sobrien#ifdef USE_DNSTAP
10089857Sobrien#include "dnstap/dtstream.h"
10189857Sobrien#endif
10289857Sobrien
103218822Sdimint
104218822Sdimfptr_whitelist_comm_point(comm_point_callback_type *fptr)
10589857Sobrien{
10689857Sobrien	if(fptr == &worker_handle_request) return 1;
10789857Sobrien	else if(fptr == &outnet_udp_cb) return 1;
10889857Sobrien	else if(fptr == &outnet_tcp_cb) return 1;
10989857Sobrien	else if(fptr == &tube_handle_listen) return 1;
11089857Sobrien	else if(fptr == &auth_xfer_probe_udp_callback) return 1;
11189857Sobrien	else if(fptr == &auth_xfer_transfer_tcp_callback) return 1;
11289857Sobrien	else if(fptr == &auth_xfer_transfer_http_callback) return 1;
11389857Sobrien	return 0;
114130561Sobrien}
11589857Sobrien
11689857Sobrienint
11789857Sobrienfptr_whitelist_comm_point_raw(comm_point_callback_type *fptr)
11889857Sobrien{
11989857Sobrien	if(fptr == &tube_handle_listen) return 1;
12089857Sobrien	else if(fptr == &tube_handle_write) return 1;
12189857Sobrien	else if(fptr == &remote_accept_callback) return 1;
12289857Sobrien	else if(fptr == &remote_control_callback) return 1;
12389857Sobrien	return 0;
12489857Sobrien}
12589857Sobrien
12689857Sobrienint
12789857Sobrienfptr_whitelist_comm_timer(void (*fptr)(void*))
12889857Sobrien{
129130561Sobrien	if(fptr == &pending_udp_timer_cb) return 1;
13089857Sobrien	else if(fptr == &outnet_tcptimer) return 1;
13189857Sobrien	else if(fptr == &pending_udp_timer_delay_cb) return 1;
13289857Sobrien	else if(fptr == &worker_stat_timer_cb) return 1;
13389857Sobrien	else if(fptr == &worker_probe_timer_cb) return 1;
13489857Sobrien#ifdef UB_ON_WINDOWS
13589857Sobrien	else if(fptr == &wsvc_cron_cb) return 1;
13689857Sobrien#endif
13789857Sobrien	else if(fptr == &auth_xfer_timer) return 1;
13889857Sobrien	else if(fptr == &auth_xfer_probe_timer_callback) return 1;
13989857Sobrien	else if(fptr == &auth_xfer_transfer_timer_callback) return 1;
140130561Sobrien	else if(fptr == &mesh_serve_expired_callback) return 1;
141130561Sobrien#ifdef USE_DNSTAP
142130561Sobrien	else if(fptr == &mq_wakeup_cb) return 1;
14389857Sobrien#endif
14489857Sobrien	return 0;
14589857Sobrien}
14689857Sobrien
14789857Sobrienint
14889857Sobrienfptr_whitelist_comm_signal(void (*fptr)(int, void*))
14989857Sobrien{
15089857Sobrien	if(fptr == &worker_sighandler) return 1;
15189857Sobrien	return 0;
15289857Sobrien}
153130561Sobrien
15489857Sobrienint fptr_whitelist_start_accept(void (*fptr)(void*))
15589857Sobrien{
15689857Sobrien	if(fptr == &worker_start_accept) return 1;
15789857Sobrien	return 0;
15889857Sobrien}
15989857Sobrien
16089857Sobrienint fptr_whitelist_stop_accept(void (*fptr)(void*))
16189857Sobrien{
162130561Sobrien	if(fptr == &worker_stop_accept) return 1;
163130561Sobrien	return 0;
16489857Sobrien}
16589857Sobrien
16689857Sobrienint
16789857Sobrienfptr_whitelist_event(void (*fptr)(int, short, void *))
168130561Sobrien{
16989857Sobrien	if(fptr == &comm_point_udp_callback) return 1;
17089857Sobrien	else if(fptr == &comm_point_udp_ancil_callback) return 1;
17189857Sobrien	else if(fptr == &comm_point_tcp_accept_callback) return 1;
17289857Sobrien	else if(fptr == &comm_point_tcp_handle_callback) return 1;
17389857Sobrien	else if(fptr == &comm_timer_callback) return 1;
17489857Sobrien	else if(fptr == &comm_signal_callback) return 1;
17589857Sobrien	else if(fptr == &comm_point_local_handle_callback) return 1;
17689857Sobrien	else if(fptr == &comm_point_raw_handle_callback) return 1;
17789857Sobrien	else if(fptr == &tube_handle_signal) return 1;
17889857Sobrien	else if(fptr == &comm_base_handle_slow_accept) return 1;
17989857Sobrien	else if(fptr == &comm_point_http_handle_callback) return 1;
180130561Sobrien#ifdef USE_DNSTAP
18189857Sobrien	else if(fptr == &dtio_output_cb) return 1;
18289857Sobrien	else if(fptr == &dtio_cmd_cb) return 1;
18389857Sobrien	else if(fptr == &dtio_reconnect_timeout_cb) return 1;
18489857Sobrien	else if(fptr == &dtio_stop_timer_cb) return 1;
18589857Sobrien	else if(fptr == &dtio_stop_ev_cb) return 1;
18689857Sobrien	else if(fptr == &dtio_tap_callback) return 1;
18789857Sobrien	else if(fptr == &dtio_mainfdcallback) return 1;
18889857Sobrien#endif
18989857Sobrien#ifdef UB_ON_WINDOWS
190130561Sobrien	else if(fptr == &worker_win_stop_cb) return 1;
19189857Sobrien#endif
19289857Sobrien	return 0;
19389857Sobrien}
19489857Sobrien
19589857Sobrienint
19689857Sobrienfptr_whitelist_pending_udp(comm_point_callback_type *fptr)
19789857Sobrien{
19889857Sobrien	if(fptr == &serviced_udp_callback) return 1;
19989857Sobrien	else if(fptr == &worker_handle_reply) return 1;
20089857Sobrien	else if(fptr == &libworker_handle_reply) return 1;
201130561Sobrien	return 0;
20289857Sobrien}
20389857Sobrien
20489857Sobrienint
20589857Sobrienfptr_whitelist_pending_tcp(comm_point_callback_type *fptr)
20689857Sobrien{
20789857Sobrien	if(fptr == &serviced_tcp_callback) return 1;
20889857Sobrien	else if(fptr == &worker_handle_reply) return 1;
20989857Sobrien	else if(fptr == &libworker_handle_reply) return 1;
210130561Sobrien	return 0;
21189857Sobrien}
21289857Sobrien
21389857Sobrienint
21489857Sobrienfptr_whitelist_serviced_query(comm_point_callback_type *fptr)
21589857Sobrien{
216130561Sobrien	if(fptr == &worker_handle_service_reply) return 1;
21789857Sobrien	else if(fptr == &libworker_handle_service_reply) return 1;
21889857Sobrien	return 0;
21989857Sobrien}
22089857Sobrien
22189857Sobrienint
22289857Sobrienfptr_whitelist_rbtree_cmp(int (*fptr) (const void *, const void *))
22389857Sobrien{
22489857Sobrien	if(fptr == &mesh_state_compare) return 1;
22589857Sobrien	else if(fptr == &mesh_state_ref_compare) return 1;
22689857Sobrien	else if(fptr == &addr_tree_compare) return 1;
22789857Sobrien	else if(fptr == &local_zone_cmp) return 1;
22889857Sobrien	else if(fptr == &local_data_cmp) return 1;
22989857Sobrien	else if(fptr == &fwd_cmp) return 1;
230130561Sobrien	else if(fptr == &pending_cmp) return 1;
231130561Sobrien	else if(fptr == &serviced_cmp) return 1;
23289857Sobrien	else if(fptr == &reuse_cmp) return 1;
23389857Sobrien	else if(fptr == &reuse_id_cmp) return 1;
23489857Sobrien	else if(fptr == &name_tree_compare) return 1;
23589857Sobrien	else if(fptr == &order_lock_cmp) return 1;
236130561Sobrien	else if(fptr == &codeline_cmp) return 1;
23789857Sobrien	else if(fptr == &nsec3_hash_cmp) return 1;
23889857Sobrien	else if(fptr == &mini_ev_cmp) return 1;
23989857Sobrien	else if(fptr == &anchor_cmp) return 1;
24089857Sobrien	else if(fptr == &canonical_tree_compare) return 1;
241130561Sobrien	else if(fptr == &context_query_cmp) return 1;
24289857Sobrien	else if(fptr == &val_neg_data_compare) return 1;
243130561Sobrien	else if(fptr == &val_neg_zone_compare) return 1;
24489857Sobrien	else if(fptr == &probetree_cmp) return 1;
245130561Sobrien	else if(fptr == &replay_var_compare) return 1;
24689857Sobrien	else if(fptr == &view_cmp) return 1;
24789857Sobrien	else if(fptr == &auth_zone_cmp) return 1;
248130561Sobrien	else if(fptr == &auth_data_cmp) return 1;
249130561Sobrien	else if(fptr == &auth_xfer_cmp) return 1;
250130561Sobrien	return 0;
25189857Sobrien}
25289857Sobrien
25389857Sobrienint
25489857Sobrienfptr_whitelist_hash_sizefunc(lruhash_sizefunc_type fptr)
25589857Sobrien{
256130561Sobrien	if(fptr == &msgreply_sizefunc) return 1;
25789857Sobrien	else if(fptr == &ub_rrset_sizefunc) return 1;
25889857Sobrien	else if(fptr == &infra_sizefunc) return 1;
259130561Sobrien	else if(fptr == &key_entry_sizefunc) return 1;
26089857Sobrien	else if(fptr == &rate_sizefunc) return 1;
26189857Sobrien	else if(fptr == &ip_rate_sizefunc) return 1;
262130561Sobrien	else if(fptr == &test_slabhash_sizefunc) return 1;
26389857Sobrien#ifdef CLIENT_SUBNET
264130561Sobrien	else if(fptr == &msg_cache_sizefunc) return 1;
265130561Sobrien#endif
266130561Sobrien#ifdef USE_DNSCRYPT
267130561Sobrien	else if(fptr == &dnsc_shared_secrets_sizefunc) return 1;
268218822Sdim	else if(fptr == &dnsc_nonces_sizefunc) return 1;
269218822Sdim#endif
270130561Sobrien	return 0;
27189857Sobrien}
272130561Sobrien
273130561Sobrienint
274130561Sobrienfptr_whitelist_hash_compfunc(lruhash_compfunc_type fptr)
275130561Sobrien{
276130561Sobrien	if(fptr == &query_info_compare) return 1;
277130561Sobrien	else if(fptr == &ub_rrset_compare) return 1;
278130561Sobrien	else if(fptr == &infra_compfunc) return 1;
279130561Sobrien	else if(fptr == &key_entry_compfunc) return 1;
280130561Sobrien	else if(fptr == &rate_compfunc) return 1;
28189857Sobrien	else if(fptr == &ip_rate_compfunc) return 1;
28289857Sobrien	else if(fptr == &test_slabhash_compfunc) return 1;
283130561Sobrien#ifdef USE_DNSCRYPT
284130561Sobrien	else if(fptr == &dnsc_shared_secrets_compfunc) return 1;
285130561Sobrien	else if(fptr == &dnsc_nonces_compfunc) return 1;
28689857Sobrien#endif
28789857Sobrien	return 0;
28889857Sobrien}
28989857Sobrien
29089857Sobrienint
29189857Sobrienfptr_whitelist_hash_delkeyfunc(lruhash_delkeyfunc_type fptr)
29289857Sobrien{
293130561Sobrien	if(fptr == &query_entry_delete) return 1;
29489857Sobrien	else if(fptr == &ub_rrset_key_delete) return 1;
29589857Sobrien	else if(fptr == &infra_delkeyfunc) return 1;
29689857Sobrien	else if(fptr == &key_entry_delkeyfunc) return 1;
29789857Sobrien	else if(fptr == &rate_delkeyfunc) return 1;
29889857Sobrien	else if(fptr == &ip_rate_delkeyfunc) return 1;
29989857Sobrien	else if(fptr == &test_slabhash_delkey) return 1;
300130561Sobrien#ifdef USE_DNSCRYPT
30189857Sobrien	else if(fptr == &dnsc_shared_secrets_delkeyfunc) return 1;
302130561Sobrien	else if(fptr == &dnsc_nonces_delkeyfunc) return 1;
30389857Sobrien#endif
30489857Sobrien	return 0;
30589857Sobrien}
30689857Sobrien
30789857Sobrienint
30889857Sobrienfptr_whitelist_hash_deldatafunc(lruhash_deldatafunc_type fptr)
30989857Sobrien{
31089857Sobrien	if(fptr == &reply_info_delete) return 1;
311130561Sobrien	else if(fptr == &rrset_data_delete) return 1;
31289857Sobrien	else if(fptr == &infra_deldatafunc) return 1;
313130561Sobrien	else if(fptr == &key_entry_deldatafunc) return 1;
31489857Sobrien	else if(fptr == &rate_deldatafunc) return 1;
31589857Sobrien	else if(fptr == &test_slabhash_deldata) return 1;
31689857Sobrien#ifdef CLIENT_SUBNET
31789857Sobrien	else if(fptr == &subnet_data_delete) return 1;
318130561Sobrien#endif
319130561Sobrien#ifdef USE_DNSCRYPT
320130561Sobrien	else if(fptr == &dnsc_shared_secrets_deldatafunc) return 1;
321130561Sobrien	else if(fptr == &dnsc_nonces_deldatafunc) return 1;
322130561Sobrien#endif
323130561Sobrien	return 0;
324130561Sobrien}
325130561Sobrien
326130561Sobrienint
327130561Sobrienfptr_whitelist_hash_markdelfunc(lruhash_markdelfunc_type fptr)
328130561Sobrien{
32989857Sobrien	if(fptr == NULL) return 1;
33089857Sobrien	else if(fptr == &rrset_markdel) return 1;
331130561Sobrien#ifdef CLIENT_SUBNET
332130561Sobrien	else if(fptr == &subnet_markdel) return 1;
333130561Sobrien#endif
33489857Sobrien	return 0;
335130561Sobrien}
336130561Sobrien
33789857Sobrien/** whitelist env->send_query callbacks */
338130561Sobrienint
339130561Sobrienfptr_whitelist_modenv_send_query(struct outbound_entry* (*fptr)(
340130561Sobrien	struct query_info* qinfo, uint16_t flags, int dnssec, int want_dnssec,
34189857Sobrien	int nocaps, struct sockaddr_storage* addr, socklen_t addrlen,
342130561Sobrien	uint8_t* zone, size_t zonelen, int ssl_upstream, char* tls_auth_name,
34389857Sobrien	struct module_qstate* q))
344130561Sobrien{
345130561Sobrien	if(fptr == &worker_send_query) return 1;
346130561Sobrien	else if(fptr == &libworker_send_query) return 1;
34789857Sobrien	return 0;
348130561Sobrien}
349130561Sobrien
350130561Sobrienint
351130561Sobrienfptr_whitelist_modenv_detach_subs(void (*fptr)(
35289857Sobrien        struct module_qstate* qstate))
353130561Sobrien{
35489857Sobrien	if(fptr == &mesh_detach_subs) return 1;
355130561Sobrien	return 0;
356130561Sobrien}
35789857Sobrien
358130561Sobrienint
359130561Sobrienfptr_whitelist_modenv_attach_sub(int (*fptr)(
36089857Sobrien        struct module_qstate* qstate, struct query_info* qinfo,
361130561Sobrien        uint16_t qflags, int prime, int valrec, struct module_qstate** newq))
362130561Sobrien{
36389857Sobrien	if(fptr == &mesh_attach_sub) return 1;
36489857Sobrien	return 0;
36589857Sobrien}
36689857Sobrien
36789857Sobrienint
36889857Sobrienfptr_whitelist_modenv_add_sub(int (*fptr)(
36989857Sobrien        struct module_qstate* qstate, struct query_info* qinfo,
370130561Sobrien        uint16_t qflags, int prime, int valrec, struct module_qstate** newq,
37189857Sobrien	struct mesh_state** sub))
37289857Sobrien{
37389857Sobrien	if(fptr == &mesh_add_sub) return 1;
37489857Sobrien	return 0;
375130561Sobrien}
37689857Sobrien
37789857Sobrienint
37889857Sobrienfptr_whitelist_modenv_kill_sub(void (*fptr)(struct module_qstate* newq))
37989857Sobrien{
38089857Sobrien	if(fptr == &mesh_state_delete) return 1;
38189857Sobrien	return 0;
38289857Sobrien}
38389857Sobrien
384130561Sobrienint
38589857Sobrienfptr_whitelist_modenv_detect_cycle(int (*fptr)(
38689857Sobrien	struct module_qstate* qstate, struct query_info* qinfo,
38789857Sobrien	uint16_t flags, int prime, int valrec))
388130561Sobrien{
389130561Sobrien	if(fptr == &mesh_detect_cycle) return 1;
39089857Sobrien	return 0;
39189857Sobrien}
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