1238106Sdes/* 2238106Sdes * util/fptr_wlist.c - function pointer whitelists. 3238106Sdes * 4238106Sdes * Copyright (c) 2007, NLnet Labs. All rights reserved. 5238106Sdes * 6238106Sdes * This software is open source. 7238106Sdes * 8238106Sdes * Redistribution and use in source and binary forms, with or without 9238106Sdes * modification, are permitted provided that the following conditions 10238106Sdes * are met: 11238106Sdes * 12238106Sdes * Redistributions of source code must retain the above copyright notice, 13238106Sdes * this list of conditions and the following disclaimer. 14238106Sdes * 15238106Sdes * Redistributions in binary form must reproduce the above copyright notice, 16238106Sdes * this list of conditions and the following disclaimer in the documentation 17238106Sdes * and/or other materials provided with the distribution. 18238106Sdes * 19238106Sdes * Neither the name of the NLNET LABS nor the names of its contributors may 20238106Sdes * be used to endorse or promote products derived from this software without 21238106Sdes * specific prior written permission. 22238106Sdes * 23238106Sdes * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24269257Sdes * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25269257Sdes * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 26269257Sdes * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 27269257Sdes * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 28269257Sdes * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 29269257Sdes * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 30269257Sdes * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 31269257Sdes * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32269257Sdes * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33269257Sdes * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34238106Sdes */ 35238106Sdes 36238106Sdes/** 37238106Sdes * \file 38238106Sdes * 39238106Sdes * This file contains functions that check function pointers. 40238106Sdes * The functions contain a whitelist of known good callback values. 41238106Sdes * Any other values lead to an error. 42238106Sdes * 43238106Sdes * Due to the listing nature, this file violates all the modularization 44238106Sdes * boundaries in the program. 45238106Sdes */ 46238106Sdes#include "config.h" 47238106Sdes#include "util/fptr_wlist.h" 48238106Sdes#include "util/mini_event.h" 49238106Sdes#include "services/outside_network.h" 50238106Sdes#include "services/mesh.h" 51238106Sdes#include "services/localzone.h" 52238106Sdes#include "services/cache/infra.h" 53238106Sdes#include "services/cache/rrset.h" 54285206Sdes#include "dns64/dns64.h" 55238106Sdes#include "iterator/iterator.h" 56238106Sdes#include "iterator/iter_fwd.h" 57238106Sdes#include "validator/validator.h" 58238106Sdes#include "validator/val_anchor.h" 59238106Sdes#include "validator/val_nsec3.h" 60238106Sdes#include "validator/val_sigcrypt.h" 61238106Sdes#include "validator/val_kentry.h" 62238106Sdes#include "validator/val_neg.h" 63238106Sdes#include "validator/autotrust.h" 64238106Sdes#include "util/data/msgreply.h" 65238106Sdes#include "util/data/packed_rrset.h" 66238106Sdes#include "util/storage/slabhash.h" 67238106Sdes#include "util/storage/dnstree.h" 68238106Sdes#include "util/locks.h" 69238106Sdes#include "libunbound/libworker.h" 70238106Sdes#include "libunbound/context.h" 71255580Sdes#include "libunbound/worker.h" 72238106Sdes#include "util/tube.h" 73238106Sdes#include "util/config_file.h" 74238106Sdes#ifdef UB_ON_WINDOWS 75238106Sdes#include "winrc/win_svc.h" 76238106Sdes#endif 77238106Sdes 78238106Sdes#ifdef WITH_PYTHONMODULE 79238106Sdes#include "pythonmod/pythonmod.h" 80238106Sdes#endif 81238106Sdes 82238106Sdesint 83238106Sdesfptr_whitelist_comm_point(comm_point_callback_t *fptr) 84238106Sdes{ 85238106Sdes if(fptr == &worker_handle_request) return 1; 86238106Sdes else if(fptr == &outnet_udp_cb) return 1; 87238106Sdes else if(fptr == &outnet_tcp_cb) return 1; 88238106Sdes else if(fptr == &tube_handle_listen) return 1; 89238106Sdes return 0; 90238106Sdes} 91238106Sdes 92238106Sdesint 93238106Sdesfptr_whitelist_comm_point_raw(comm_point_callback_t *fptr) 94238106Sdes{ 95238106Sdes if(fptr == &tube_handle_listen) return 1; 96238106Sdes else if(fptr == &tube_handle_write) return 1; 97238106Sdes else if(fptr == &remote_accept_callback) return 1; 98238106Sdes else if(fptr == &remote_control_callback) return 1; 99238106Sdes return 0; 100238106Sdes} 101238106Sdes 102238106Sdesint 103238106Sdesfptr_whitelist_comm_timer(void (*fptr)(void*)) 104238106Sdes{ 105238106Sdes if(fptr == &pending_udp_timer_cb) return 1; 106238106Sdes else if(fptr == &outnet_tcptimer) return 1; 107269257Sdes else if(fptr == &pending_udp_timer_delay_cb) return 1; 108238106Sdes else if(fptr == &worker_stat_timer_cb) return 1; 109238106Sdes else if(fptr == &worker_probe_timer_cb) return 1; 110238106Sdes#ifdef UB_ON_WINDOWS 111238106Sdes else if(fptr == &wsvc_cron_cb) return 1; 112238106Sdes#endif 113238106Sdes return 0; 114238106Sdes} 115238106Sdes 116238106Sdesint 117238106Sdesfptr_whitelist_comm_signal(void (*fptr)(int, void*)) 118238106Sdes{ 119238106Sdes if(fptr == &worker_sighandler) return 1; 120238106Sdes return 0; 121238106Sdes} 122238106Sdes 123238106Sdesint fptr_whitelist_start_accept(void (*fptr)(void*)) 124238106Sdes{ 125238106Sdes if(fptr == &worker_start_accept) return 1; 126238106Sdes return 0; 127238106Sdes} 128238106Sdes 129238106Sdesint fptr_whitelist_stop_accept(void (*fptr)(void*)) 130238106Sdes{ 131238106Sdes if(fptr == &worker_stop_accept) return 1; 132238106Sdes return 0; 133238106Sdes} 134238106Sdes 135238106Sdesint 136238106Sdesfptr_whitelist_event(void (*fptr)(int, short, void *)) 137238106Sdes{ 138238106Sdes if(fptr == &comm_point_udp_callback) return 1; 139238106Sdes else if(fptr == &comm_point_udp_ancil_callback) return 1; 140238106Sdes else if(fptr == &comm_point_tcp_accept_callback) return 1; 141238106Sdes else if(fptr == &comm_point_tcp_handle_callback) return 1; 142238106Sdes else if(fptr == &comm_timer_callback) return 1; 143238106Sdes else if(fptr == &comm_signal_callback) return 1; 144238106Sdes else if(fptr == &comm_point_local_handle_callback) return 1; 145238106Sdes else if(fptr == &comm_point_raw_handle_callback) return 1; 146238106Sdes else if(fptr == &tube_handle_signal) return 1; 147238106Sdes else if(fptr == &comm_base_handle_slow_accept) return 1; 148238106Sdes#ifdef UB_ON_WINDOWS 149238106Sdes else if(fptr == &worker_win_stop_cb) return 1; 150238106Sdes#endif 151238106Sdes return 0; 152238106Sdes} 153238106Sdes 154238106Sdesint 155238106Sdesfptr_whitelist_pending_udp(comm_point_callback_t *fptr) 156238106Sdes{ 157238106Sdes if(fptr == &serviced_udp_callback) return 1; 158238106Sdes else if(fptr == &worker_handle_reply) return 1; 159238106Sdes else if(fptr == &libworker_handle_reply) return 1; 160238106Sdes return 0; 161238106Sdes} 162238106Sdes 163238106Sdesint 164238106Sdesfptr_whitelist_pending_tcp(comm_point_callback_t *fptr) 165238106Sdes{ 166238106Sdes if(fptr == &serviced_tcp_callback) return 1; 167238106Sdes else if(fptr == &worker_handle_reply) return 1; 168238106Sdes else if(fptr == &libworker_handle_reply) return 1; 169238106Sdes return 0; 170238106Sdes} 171238106Sdes 172238106Sdesint 173238106Sdesfptr_whitelist_serviced_query(comm_point_callback_t *fptr) 174238106Sdes{ 175238106Sdes if(fptr == &worker_handle_service_reply) return 1; 176238106Sdes else if(fptr == &libworker_handle_service_reply) return 1; 177238106Sdes return 0; 178238106Sdes} 179238106Sdes 180238106Sdesint 181238106Sdesfptr_whitelist_rbtree_cmp(int (*fptr) (const void *, const void *)) 182238106Sdes{ 183238106Sdes if(fptr == &mesh_state_compare) return 1; 184238106Sdes else if(fptr == &mesh_state_ref_compare) return 1; 185238106Sdes else if(fptr == &addr_tree_compare) return 1; 186238106Sdes else if(fptr == &local_zone_cmp) return 1; 187238106Sdes else if(fptr == &local_data_cmp) return 1; 188238106Sdes else if(fptr == &fwd_cmp) return 1; 189238106Sdes else if(fptr == &pending_cmp) return 1; 190238106Sdes else if(fptr == &serviced_cmp) return 1; 191238106Sdes else if(fptr == &name_tree_compare) return 1; 192238106Sdes else if(fptr == &order_lock_cmp) return 1; 193238106Sdes else if(fptr == &codeline_cmp) return 1; 194238106Sdes else if(fptr == &nsec3_hash_cmp) return 1; 195238106Sdes else if(fptr == &mini_ev_cmp) return 1; 196238106Sdes else if(fptr == &anchor_cmp) return 1; 197238106Sdes else if(fptr == &canonical_tree_compare) return 1; 198238106Sdes else if(fptr == &context_query_cmp) return 1; 199238106Sdes else if(fptr == &val_neg_data_compare) return 1; 200238106Sdes else if(fptr == &val_neg_zone_compare) return 1; 201238106Sdes else if(fptr == &probetree_cmp) return 1; 202238106Sdes else if(fptr == &replay_var_compare) return 1; 203238106Sdes return 0; 204238106Sdes} 205238106Sdes 206238106Sdesint 207238106Sdesfptr_whitelist_hash_sizefunc(lruhash_sizefunc_t fptr) 208238106Sdes{ 209238106Sdes if(fptr == &msgreply_sizefunc) return 1; 210238106Sdes else if(fptr == &ub_rrset_sizefunc) return 1; 211238106Sdes else if(fptr == &infra_sizefunc) return 1; 212238106Sdes else if(fptr == &key_entry_sizefunc) return 1; 213291767Sdes else if(fptr == &rate_sizefunc) return 1; 214238106Sdes else if(fptr == &test_slabhash_sizefunc) return 1; 215238106Sdes return 0; 216238106Sdes} 217238106Sdes 218238106Sdesint 219238106Sdesfptr_whitelist_hash_compfunc(lruhash_compfunc_t fptr) 220238106Sdes{ 221238106Sdes if(fptr == &query_info_compare) return 1; 222238106Sdes else if(fptr == &ub_rrset_compare) return 1; 223238106Sdes else if(fptr == &infra_compfunc) return 1; 224238106Sdes else if(fptr == &key_entry_compfunc) return 1; 225291767Sdes else if(fptr == &rate_compfunc) return 1; 226238106Sdes else if(fptr == &test_slabhash_compfunc) return 1; 227238106Sdes return 0; 228238106Sdes} 229238106Sdes 230238106Sdesint 231238106Sdesfptr_whitelist_hash_delkeyfunc(lruhash_delkeyfunc_t fptr) 232238106Sdes{ 233238106Sdes if(fptr == &query_entry_delete) return 1; 234238106Sdes else if(fptr == &ub_rrset_key_delete) return 1; 235238106Sdes else if(fptr == &infra_delkeyfunc) return 1; 236238106Sdes else if(fptr == &key_entry_delkeyfunc) return 1; 237291767Sdes else if(fptr == &rate_delkeyfunc) return 1; 238238106Sdes else if(fptr == &test_slabhash_delkey) return 1; 239238106Sdes return 0; 240238106Sdes} 241238106Sdes 242238106Sdesint 243238106Sdesfptr_whitelist_hash_deldatafunc(lruhash_deldatafunc_t fptr) 244238106Sdes{ 245238106Sdes if(fptr == &reply_info_delete) return 1; 246238106Sdes else if(fptr == &rrset_data_delete) return 1; 247238106Sdes else if(fptr == &infra_deldatafunc) return 1; 248238106Sdes else if(fptr == &key_entry_deldatafunc) return 1; 249291767Sdes else if(fptr == &rate_deldatafunc) return 1; 250238106Sdes else if(fptr == &test_slabhash_deldata) return 1; 251238106Sdes return 0; 252238106Sdes} 253238106Sdes 254238106Sdesint 255238106Sdesfptr_whitelist_hash_markdelfunc(lruhash_markdelfunc_t fptr) 256238106Sdes{ 257238106Sdes if(fptr == NULL) return 1; 258238106Sdes else if(fptr == &rrset_markdel) return 1; 259238106Sdes return 0; 260238106Sdes} 261238106Sdes 262238106Sdes/** whitelist env->send_query callbacks */ 263238106Sdesint 264238106Sdesfptr_whitelist_modenv_send_query(struct outbound_entry* (*fptr)( 265238106Sdes uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, 266285206Sdes uint16_t flags, int dnssec, int want_dnssec, int nocaps, 267238106Sdes struct sockaddr_storage* addr, socklen_t addrlen, 268238106Sdes uint8_t* zone, size_t zonelen, 269238106Sdes struct module_qstate* q)) 270238106Sdes{ 271238106Sdes if(fptr == &worker_send_query) return 1; 272238106Sdes else if(fptr == &libworker_send_query) return 1; 273238106Sdes return 0; 274238106Sdes} 275238106Sdes 276238106Sdesint 277238106Sdesfptr_whitelist_modenv_detach_subs(void (*fptr)( 278238106Sdes struct module_qstate* qstate)) 279238106Sdes{ 280238106Sdes if(fptr == &mesh_detach_subs) return 1; 281238106Sdes return 0; 282238106Sdes} 283238106Sdes 284238106Sdesint 285238106Sdesfptr_whitelist_modenv_attach_sub(int (*fptr)( 286238106Sdes struct module_qstate* qstate, struct query_info* qinfo, 287285206Sdes uint16_t qflags, int prime, int valrec, struct module_qstate** newq)) 288238106Sdes{ 289238106Sdes if(fptr == &mesh_attach_sub) return 1; 290238106Sdes return 0; 291238106Sdes} 292238106Sdes 293238106Sdesint 294238106Sdesfptr_whitelist_modenv_kill_sub(void (*fptr)(struct module_qstate* newq)) 295238106Sdes{ 296238106Sdes if(fptr == &mesh_state_delete) return 1; 297238106Sdes return 0; 298238106Sdes} 299238106Sdes 300238106Sdesint 301238106Sdesfptr_whitelist_modenv_detect_cycle(int (*fptr)( 302238106Sdes struct module_qstate* qstate, struct query_info* qinfo, 303285206Sdes uint16_t flags, int prime, int valrec)) 304238106Sdes{ 305238106Sdes if(fptr == &mesh_detect_cycle) return 1; 306238106Sdes return 0; 307238106Sdes} 308238106Sdes 309238106Sdesint 310238106Sdesfptr_whitelist_mod_init(int (*fptr)(struct module_env* env, int id)) 311238106Sdes{ 312238106Sdes if(fptr == &iter_init) return 1; 313238106Sdes else if(fptr == &val_init) return 1; 314285206Sdes else if(fptr == &dns64_init) return 1; 315238106Sdes#ifdef WITH_PYTHONMODULE 316238106Sdes else if(fptr == &pythonmod_init) return 1; 317238106Sdes#endif 318238106Sdes return 0; 319238106Sdes} 320238106Sdes 321238106Sdesint 322238106Sdesfptr_whitelist_mod_deinit(void (*fptr)(struct module_env* env, int id)) 323238106Sdes{ 324238106Sdes if(fptr == &iter_deinit) return 1; 325238106Sdes else if(fptr == &val_deinit) return 1; 326285206Sdes else if(fptr == &dns64_deinit) return 1; 327238106Sdes#ifdef WITH_PYTHONMODULE 328238106Sdes else if(fptr == &pythonmod_deinit) return 1; 329238106Sdes#endif 330238106Sdes return 0; 331238106Sdes} 332238106Sdes 333238106Sdesint 334238106Sdesfptr_whitelist_mod_operate(void (*fptr)(struct module_qstate* qstate, 335238106Sdes enum module_ev event, int id, struct outbound_entry* outbound)) 336238106Sdes{ 337238106Sdes if(fptr == &iter_operate) return 1; 338238106Sdes else if(fptr == &val_operate) return 1; 339285206Sdes else if(fptr == &dns64_operate) return 1; 340238106Sdes#ifdef WITH_PYTHONMODULE 341238106Sdes else if(fptr == &pythonmod_operate) return 1; 342238106Sdes#endif 343238106Sdes return 0; 344238106Sdes} 345238106Sdes 346238106Sdesint 347238106Sdesfptr_whitelist_mod_inform_super(void (*fptr)( 348238106Sdes struct module_qstate* qstate, int id, struct module_qstate* super)) 349238106Sdes{ 350238106Sdes if(fptr == &iter_inform_super) return 1; 351238106Sdes else if(fptr == &val_inform_super) return 1; 352285206Sdes else if(fptr == &dns64_inform_super) return 1; 353238106Sdes#ifdef WITH_PYTHONMODULE 354238106Sdes else if(fptr == &pythonmod_inform_super) return 1; 355238106Sdes#endif 356238106Sdes return 0; 357238106Sdes} 358238106Sdes 359238106Sdesint 360238106Sdesfptr_whitelist_mod_clear(void (*fptr)(struct module_qstate* qstate, 361238106Sdes int id)) 362238106Sdes{ 363238106Sdes if(fptr == &iter_clear) return 1; 364238106Sdes else if(fptr == &val_clear) return 1; 365285206Sdes else if(fptr == &dns64_clear) return 1; 366238106Sdes#ifdef WITH_PYTHONMODULE 367238106Sdes else if(fptr == &pythonmod_clear) return 1; 368238106Sdes#endif 369238106Sdes return 0; 370238106Sdes} 371238106Sdes 372238106Sdesint 373238106Sdesfptr_whitelist_mod_get_mem(size_t (*fptr)(struct module_env* env, int id)) 374238106Sdes{ 375238106Sdes if(fptr == &iter_get_mem) return 1; 376238106Sdes else if(fptr == &val_get_mem) return 1; 377285206Sdes else if(fptr == &dns64_get_mem) return 1; 378238106Sdes#ifdef WITH_PYTHONMODULE 379238106Sdes else if(fptr == &pythonmod_get_mem) return 1; 380238106Sdes#endif 381238106Sdes return 0; 382238106Sdes} 383238106Sdes 384238106Sdesint 385238106Sdesfptr_whitelist_alloc_cleanup(void (*fptr)(void*)) 386238106Sdes{ 387238106Sdes if(fptr == &worker_alloc_cleanup) return 1; 388238106Sdes return 0; 389238106Sdes} 390238106Sdes 391238106Sdesint fptr_whitelist_tube_listen(tube_callback_t* fptr) 392238106Sdes{ 393238106Sdes if(fptr == &worker_handle_control_cmd) return 1; 394238106Sdes else if(fptr == &libworker_handle_control_cmd) return 1; 395238106Sdes return 0; 396238106Sdes} 397238106Sdes 398238106Sdesint fptr_whitelist_mesh_cb(mesh_cb_func_t fptr) 399238106Sdes{ 400238106Sdes if(fptr == &libworker_fg_done_cb) return 1; 401238106Sdes else if(fptr == &libworker_bg_done_cb) return 1; 402269257Sdes else if(fptr == &libworker_event_done_cb) return 1; 403238106Sdes else if(fptr == &probe_answer_cb) return 1; 404238106Sdes return 0; 405238106Sdes} 406238106Sdes 407238106Sdesint fptr_whitelist_print_func(void (*fptr)(char*,void*)) 408238106Sdes{ 409238106Sdes if(fptr == &config_print_func) return 1; 410238106Sdes else if(fptr == &config_collate_func) return 1; 411238106Sdes else if(fptr == &remote_get_opt_ssl) return 1; 412238106Sdes return 0; 413238106Sdes} 414