|
@@ -565,21 +565,23 @@ static struct inet_protosw rawv6_protosw = {
|
|
|
.flags = INET_PROTOSW_REUSE,
|
|
|
};
|
|
|
|
|
|
-void
|
|
|
-inet6_register_protosw(struct inet_protosw *p)
|
|
|
+int inet6_register_protosw(struct inet_protosw *p)
|
|
|
{
|
|
|
struct list_head *lh;
|
|
|
struct inet_protosw *answer;
|
|
|
- int protocol = p->protocol;
|
|
|
struct list_head *last_perm;
|
|
|
+ int protocol = p->protocol;
|
|
|
+ int ret;
|
|
|
|
|
|
spin_lock_bh(&inetsw6_lock);
|
|
|
|
|
|
+ ret = -EINVAL;
|
|
|
if (p->type >= SOCK_MAX)
|
|
|
goto out_illegal;
|
|
|
|
|
|
/* If we are trying to override a permanent protocol, bail. */
|
|
|
answer = NULL;
|
|
|
+ ret = -EPERM;
|
|
|
last_perm = &inetsw6[p->type];
|
|
|
list_for_each(lh, &inetsw6[p->type]) {
|
|
|
answer = list_entry(lh, struct inet_protosw, list);
|
|
@@ -603,9 +605,10 @@ inet6_register_protosw(struct inet_protosw *p)
|
|
|
* system automatically returns to the old behavior.
|
|
|
*/
|
|
|
list_add_rcu(&p->list, last_perm);
|
|
|
+ ret = 0;
|
|
|
out:
|
|
|
spin_unlock_bh(&inetsw6_lock);
|
|
|
- return;
|
|
|
+ return ret;
|
|
|
|
|
|
out_permanent:
|
|
|
printk(KERN_ERR "Attempt to override permanent protocol %d.\n",
|