mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 10:07:04 +00:00 
			
		
		
		
	Configure hash table cleanup with specific free functions for `zrouter.filter_hash`, `zrouter.qdisc_hash`, and `zrouter.class_hash`.
This ensures proper memory cleanup, addressing memory leaks.
The ASan leak log for reference:
```
***********************************************************************************
Address Sanitizer Error detected in tc_basic.test_tc_basic/r1.asan.zebra.15495
=================================================================
==15495==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 176 byte(s) in 1 object(s) allocated from:
    #0 0x7fd5660ffd28 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xded28)
    #1 0x7fd565afe238 in qcalloc lib/memory.c:105
    #2 0x5564521c6c9e in tc_filter_alloc_intern zebra/zebra_tc.c:389
    #3 0x7fd565ac49e8 in hash_get lib/hash.c:147
    #4 0x5564521c7c74 in zebra_tc_filter_add zebra/zebra_tc.c:409
    #5 0x55645210755a in zread_tc_filter zebra/zapi_msg.c:3428
    #6 0x5564521127c1 in zserv_handle_commands zebra/zapi_msg.c:4004
    #7 0x5564522208b2 in zserv_process_messages zebra/zserv.c:520
    #8 0x7fd565b9e034 in event_call lib/event.c:1974
    #9 0x7fd565ae142b in frr_run lib/libfrr.c:1214
    #10 0x5564520c14b1 in main zebra/main.c:492
    #11 0x7fd564ec2c86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21c86)
Direct leak of 40 byte(s) in 1 object(s) allocated from:
    #0 0x7fd5660ffd28 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xded28)
    #1 0x7fd565afe238 in qcalloc lib/memory.c:105
    #2 0x5564521c6c6e in tc_class_alloc_intern zebra/zebra_tc.c:239
    #3 0x7fd565ac49e8 in hash_get lib/hash.c:147
    #4 0x5564521c784f in zebra_tc_class_add zebra/zebra_tc.c:293
    #5 0x556452107ce5 in zread_tc_class zebra/zapi_msg.c:3315
    #6 0x5564521127c1 in zserv_handle_commands zebra/zapi_msg.c:4004
    #7 0x5564522208b2 in zserv_process_messages zebra/zserv.c:520
    #8 0x7fd565b9e034 in event_call lib/event.c:1974
    #9 0x7fd565ae142b in frr_run lib/libfrr.c:1214
    #10 0x5564520c14b1 in main zebra/main.c:492
    #11 0x7fd564ec2c86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21c86)
Direct leak of 12 byte(s) in 1 object(s) allocated from:
    #0 0x7fd5660ffd28 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xded28)
    #1 0x7fd565afe238 in qcalloc lib/memory.c:105
    #2 0x5564521c6c3e in tc_qdisc_alloc_intern zebra/zebra_tc.c:128
    #3 0x7fd565ac49e8 in hash_get lib/hash.c:147
    #4 0x5564521c753b in zebra_tc_qdisc_install zebra/zebra_tc.c:184
    #5 0x556452108203 in zread_tc_qdisc zebra/zapi_msg.c:3286
    #6 0x5564521127c1 in zserv_handle_commands zebra/zapi_msg.c:4004
    #7 0x5564522208b2 in zserv_process_messages zebra/zserv.c:520
    #8 0x7fd565b9e034 in event_call lib/event.c:1974
    #9 0x7fd565ae142b in frr_run lib/libfrr.c:1214
    #10 0x5564520c14b1 in main zebra/main.c:492
    #11 0x7fd564ec2c86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21c86)
SUMMARY: AddressSanitizer: 228 byte(s) leaked in 3 allocation(s).
***********************************************************************************
```
Signed-off-by: Keelan Cannoo <keelan.cannoo@icloud.com>
		
	
			
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
						|
/*
 | 
						|
 * Zebra Traffic Control (TC) Data structures and definitions
 | 
						|
 * These are public definitions referenced by multiple files.
 | 
						|
 *
 | 
						|
 * Copyright (C) 2022 Shichu Yang
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _ZEBRA_TC_H
 | 
						|
#define _ZEBRA_TC_H
 | 
						|
 | 
						|
#include <zebra.h>
 | 
						|
#include "rt.h"
 | 
						|
#include "tc.h"
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
struct zebra_tc_qdisc {
 | 
						|
	int sock;
 | 
						|
 | 
						|
	struct tc_qdisc qdisc;
 | 
						|
};
 | 
						|
 | 
						|
struct zebra_tc_class {
 | 
						|
	int sock;
 | 
						|
 | 
						|
	struct tc_class class;
 | 
						|
};
 | 
						|
 | 
						|
struct zebra_tc_filter {
 | 
						|
	int sock;
 | 
						|
 | 
						|
	struct tc_filter filter;
 | 
						|
};
 | 
						|
 | 
						|
const char *tc_qdisc_kind2str(uint32_t type);
 | 
						|
enum tc_qdisc_kind tc_qdisc_str2kind(const char *type);
 | 
						|
 | 
						|
uint32_t zebra_tc_qdisc_hash_key(const void *arg);
 | 
						|
bool zebra_tc_qdisc_hash_equal(const void *arg1, const void *arg2);
 | 
						|
void zebra_tc_qdisc_install(struct zebra_tc_qdisc *qdisc);
 | 
						|
void zebra_tc_qdisc_uninstall(struct zebra_tc_qdisc *qdisc);
 | 
						|
void zebra_tc_qdisc_free(struct zebra_tc_qdisc *qdisc);
 | 
						|
 | 
						|
uint32_t zebra_tc_class_hash_key(const void *arg);
 | 
						|
bool zebra_tc_class_hash_equal(const void *arg1, const void *arg2);
 | 
						|
void zebra_tc_class_add(struct zebra_tc_class *class);
 | 
						|
void zebra_tc_class_delete(struct zebra_tc_class *class);
 | 
						|
void zebra_tc_class_free(struct zebra_tc_class *class);
 | 
						|
 | 
						|
const char *tc_filter_kind2str(uint32_t type);
 | 
						|
enum tc_qdisc_kind tc_filter_str2kind(const char *type);
 | 
						|
void zebra_tc_filter_add(struct zebra_tc_filter *filter);
 | 
						|
void zebra_tc_filter_delete(struct zebra_tc_filter *filter);
 | 
						|
void zebra_tc_filter_free(struct zebra_tc_filter *filter);
 | 
						|
 | 
						|
void zebra_tc_filters_free(void *arg);
 | 
						|
uint32_t zebra_tc_filter_hash_key(const void *arg);
 | 
						|
bool zebra_tc_filter_hash_equal(const void *arg1, const void *arg2);
 | 
						|
 | 
						|
void kernel_read_tc_qdisc(struct zebra_ns *zns);
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* _ZEBRA_TC_H */
 |