Commit 64df6d52 authored by linzhang's avatar linzhang Committed by David S. Miller
Browse files

net: x25: fix one potential use-after-free issue



The function x25_init is not properly unregister related resources
on error handler.It is will result in kernel oops if x25_init init
failed, so add properly unregister call on error handler.

Also, i adjust the coding style and make x25_register_sysctl properly
return failure.

Signed-off-by: default avatarlinzhang <xiaolou4617@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3c2ce60b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -298,10 +298,10 @@ void x25_check_rbuf(struct sock *);

/* sysctl_net_x25.c */
#ifdef CONFIG_SYSCTL
void x25_register_sysctl(void);
int x25_register_sysctl(void);
void x25_unregister_sysctl(void);
#else
static inline void x25_register_sysctl(void) {};
static inline int x25_register_sysctl(void) { return 0; };
static inline void x25_unregister_sysctl(void) {};
#endif /* CONFIG_SYSCTL */

+16 −8
Original line number Diff line number Diff line
@@ -1791,32 +1791,40 @@ void x25_kill_by_neigh(struct x25_neigh *nb)

static int __init x25_init(void)
{
	int rc = proto_register(&x25_proto, 0);
	int rc;

	if (rc != 0)
	rc = proto_register(&x25_proto, 0);
	if (rc)
		goto out;

	rc = sock_register(&x25_family_ops);
	if (rc != 0)
	if (rc)
		goto out_proto;

	dev_add_pack(&x25_packet_type);

	rc = register_netdevice_notifier(&x25_dev_notifier);
	if (rc != 0)
	if (rc)
		goto out_sock;

	pr_info("Linux Version 0.2\n");
	rc = x25_register_sysctl();
	if (rc)
		goto out_dev;

	x25_register_sysctl();
	rc = x25_proc_init();
	if (rc != 0)
		goto out_dev;
	if (rc)
		goto out_sysctl;

	pr_info("Linux Version 0.2\n");

out:
	return rc;
out_sysctl:
	x25_unregister_sysctl();
out_dev:
	unregister_netdevice_notifier(&x25_dev_notifier);
out_sock:
	dev_remove_pack(&x25_packet_type);
	sock_unregister(AF_X25);
out_proto:
	proto_unregister(&x25_proto);
+4 −1
Original line number Diff line number Diff line
@@ -73,9 +73,12 @@ static struct ctl_table x25_table[] = {
	{ },
};

void __init x25_register_sysctl(void)
int __init x25_register_sysctl(void)
{
	x25_table_header = register_net_sysctl(&init_net, "net/x25", x25_table);
	if (!x25_table_header)
		return -ENOMEM;
	return 0;
}

void x25_unregister_sysctl(void)