From 50b889e4ceeefb2438d1d012003039e8bb091ad3 Mon Sep 17 00:00:00 2001 From: Michael Blizek Date: Sat, 11 Jun 2022 17:39:53 +0200 Subject: [PATCH] free cor_conn_src_sock_extradata --- net/cor/conn.c | 8 +++++++- net/cor/cor.h | 53 +++++++++++++++++++++++++++-------------------------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/net/cor/conn.c b/net/cor/conn.c index 4ccd622e8a13..ba5f28b8046c 100644 --- a/net/cor/conn.c +++ b/net/cor/conn.c @@ -281,6 +281,12 @@ static void _cor_free_conn(struct cor_conn *cn) "cor_free_conn(): cn->src.in.conn_id is not 0"); cor_nb_kref_put(cn->src.in.nb, "conn"); cn->src.in.nb = 0; + } else if (cn->sourcetype == SOURCE_SOCK) { + BUG_ON(cn->src.sock.ed == 0); + memset(cn->src.sock.ed, 9*16 + 10, + sizeof(struct cor_conn_src_sock_extradata)); + kmem_cache_free(cor_conn_ed_slab, cn->src.sock.ed); + cn->src.sock.ed = 0; } if (cn->targettype == TARGET_OUT) { @@ -446,13 +452,13 @@ int cor_conn_init_sock_source(struct cor_conn *cn) struct cor_conn_src_sock_extradata *ed; BUG_ON(cn == 0); + BUG_ON(cn->sourcetype != SOURCE_UNCONNECTED); ed = kmem_cache_alloc(cor_conn_ed_slab, GFP_ATOMIC); if (unlikely(ed == 0)) return 1; memset(ed, 0, sizeof(struct cor_conn_src_sock_extradata)); - #warning todo free cn->sourcetype = SOURCE_SOCK; memset(&(cn->src.sock), 0, sizeof(cn->src.sock)); cn->src.sock.ed = ed; diff --git a/net/cor/cor.h b/net/cor/cor.h index cce67fc03f1d..00f6b93a21ed 100644 --- a/net/cor/cor.h +++ b/net/cor/cor.h @@ -1861,6 +1861,32 @@ extern int __init cor_forward_init(void); extern void __exit cor_forward_exit2(void); +/* sock.c */ +extern void cor_free_sock(struct kref *ref); + +extern int cor_socket_setsockopt_tos(struct socket *sock, + char __user *optval, unsigned int optlen); + +extern int cor_socket_setsockopt_priority(struct socket *sock, + char __user *optval, unsigned int optlen); + +extern int cor_socket_socketpair(struct socket *sock1, struct socket *sock2); + +extern int cor_socket_getname(struct socket *sock, struct sockaddr *addr, + int peer); + +extern int cor_socket_mmap(struct file *file, struct socket *sock, + struct vm_area_struct *vma); + +extern int _cor_createsock(struct net *net, struct socket *sock, int protocol, + int kern, __u8 is_client); + +extern int __init cor_sock_init1(void); + +extern int __init cor_sock_init2(void); + +extern void __exit cor_sock_exit1(void); + /* sock_rdaemon.c */ extern int cor_is_device_configurated(struct net_device *dev); @@ -1898,6 +1924,7 @@ static inline void cor_set_sock_connecterror(__be64 cookie, int errorno) { struct cor_sock *cs = cor_get_sock_by_cookie(cookie); _cor_set_sock_connecterror(cs, errorno); + kref_put(&(cs->ref), cor_free_sock); } extern void cor_mngdsocket_readfromconn_fromatomic(struct cor_sock *cs); @@ -1909,32 +1936,6 @@ extern int cor_create_managed_sock(struct net *net, struct socket *sock, extern int __init cor_sock_managed_init1(void); -/* sock.c */ -extern void cor_free_sock(struct kref *ref); - -extern int cor_socket_setsockopt_tos(struct socket *sock, - char __user *optval, unsigned int optlen); - -extern int cor_socket_setsockopt_priority(struct socket *sock, - char __user *optval, unsigned int optlen); - -extern int cor_socket_socketpair(struct socket *sock1, struct socket *sock2); - -extern int cor_socket_getname(struct socket *sock, struct sockaddr *addr, - int peer); - -extern int cor_socket_mmap(struct file *file, struct socket *sock, - struct vm_area_struct *vma); - -extern int _cor_createsock(struct net *net, struct socket *sock, int protocol, - int kern, __u8 is_client); - -extern int __init cor_sock_init1(void); - -extern int __init cor_sock_init2(void); - -extern void __exit cor_sock_exit1(void); - static inline struct cor_skb_procstate *cor_skb_pstate(struct sk_buff *skb) { -- 2.11.4.GIT