/* * Join a (named) session keyring. * * Create and join an anonymous session keyring or join a named session * keyring, creating it if necessary. A named session keyring must have Search * permission for it to be joined. Session keyrings without this permit will * be skipped over. * * If successful, the ID of the joined session keyring will be returned. */ long keyctl_join_session_keyring(const char __user *_name) { char *name; long ret; /* fetch the name from userspace */ name = NULL; if (_name) { name = strndup_user(_name, PAGE_SIZE); if (IS_ERR(name)) { ret = PTR_ERR(name); goto error; } } /* join the session */ ret = join_session_keyring(name); kfree(name); error: return ret; }
/* * join the session keyring * - implements keyctl(KEYCTL_JOIN_SESSION_KEYRING) */ long keyctl_join_session_keyring(const char __user *_name) { char *name; long nlen, ret; /* fetch the name from userspace */ name = NULL; if (_name) { ret = -EFAULT; nlen = strnlen_user(_name, PAGE_SIZE - 1); if (nlen <= 0) goto error; ret = -EINVAL; if (nlen > PAGE_SIZE - 1) goto error; ret = -ENOMEM; name = kmalloc(nlen + 1, GFP_KERNEL); if (!name) goto error; ret = -EFAULT; if (copy_from_user(name, _name, nlen + 1) != 0) goto error2; } /* join the session */ ret = join_session_keyring(name); error2: kfree(name); error: return ret; } /* end keyctl_join_session_keyring() */