Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750869AbWBOUXi (ORCPT ); Wed, 15 Feb 2006 15:23:38 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751297AbWBOUXh (ORCPT ); Wed, 15 Feb 2006 15:23:37 -0500 Received: from xproxy.gmail.com ([66.249.82.197]:476 "EHLO xproxy.gmail.com") by vger.kernel.org with ESMTP id S1751299AbWBOUX2 (ORCPT ); Wed, 15 Feb 2006 15:23:28 -0500 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:date:from:to:cc:subject:message-id:x-mailer:mime-version:content-type:content-transfer-encoding; b=E+OWkniJ8iGiEwC01FU3uacHFNO6tEwO1S9WYdXEZo6XKEjQhmzH5Yaom0+hNuuvIkTvWyuklUyup9rfF7GC8VPWUzaMsR431MsDS87g2LamaQzlUzo4xYkwtj0sFwIajiftEYE790OHFtanJ1Cc2jdYE7/hlTQkUjiMxrQEVhk= Date: Wed, 15 Feb 2006 18:23:16 -0300 From: Davi Arnaut To: torvalds@osdl.org Cc: davi.arnaut@gmail.com, akpm@osdl.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/2] strndup_user, convert (keyctl) Message-Id: <20060215182316.fadf8e71.davi.arnaut@gmail.com> X-Mailer: Sylpheed Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4987 Lines: 205 Convert security/keys/keyctl.c string duplication to strdup_user() Signed-off-by: Davi Arnaut -- diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c index 0c62798..ff1417e 100644 --- a/security/keys/keyctl.c +++ b/security/keys/keyctl.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include "internal.h" @@ -38,7 +39,7 @@ asmlinkage long sys_add_key(const char _ key_ref_t keyring_ref, key_ref; char type[32], *description; void *payload; - long dlen, ret; + long ret; ret = -EINVAL; if (plen > 32767) @@ -54,24 +55,11 @@ asmlinkage long sys_add_key(const char _ if (type[0] == '.') goto error; - ret = -EFAULT; - dlen = strnlen_user(_description, PAGE_SIZE - 1); - if (dlen <= 0) - goto error; - - ret = -EINVAL; - if (dlen > PAGE_SIZE - 1) - goto error; - - ret = -ENOMEM; - description = kmalloc(dlen + 1, GFP_KERNEL); - if (!description) + description = strdup_user(_description); + if (IS_ERR(description)) { + ret = PTR_ERR(description); goto error; - description[dlen] = '\0'; - - ret = -EFAULT; - if (copy_from_user(description, _description, dlen) != 0) - goto error2; + } /* pull the payload in if one was supplied */ payload = NULL; @@ -136,7 +124,7 @@ asmlinkage long sys_request_key(const ch struct key *key; key_ref_t dest_ref; char type[32], *description, *callout_info; - long dlen, ret; + long ret; /* pull the type into kernel space */ ret = strncpy_from_user(type, _type, sizeof(type) - 1); @@ -149,46 +137,20 @@ asmlinkage long sys_request_key(const ch goto error; /* pull the description into kernel space */ - ret = -EFAULT; - dlen = strnlen_user(_description, PAGE_SIZE - 1); - if (dlen <= 0) - goto error; - - ret = -EINVAL; - if (dlen > PAGE_SIZE - 1) - goto error; - - ret = -ENOMEM; - description = kmalloc(dlen + 1, GFP_KERNEL); - if (!description) + description = strdup_user(_description); + if (IS_ERR(description)) { + ret = PTR_ERR(description); goto error; - description[dlen] = '\0'; - - ret = -EFAULT; - if (copy_from_user(description, _description, dlen) != 0) - goto error2; + } /* pull the callout info into kernel space */ callout_info = NULL; if (_callout_info) { - ret = -EFAULT; - dlen = strnlen_user(_callout_info, PAGE_SIZE - 1); - if (dlen <= 0) - goto error2; - - ret = -EINVAL; - if (dlen > PAGE_SIZE - 1) - goto error2; - - ret = -ENOMEM; - callout_info = kmalloc(dlen + 1, GFP_KERNEL); - if (!callout_info) + callout_info = strdup_user(_callout_info); + if (IS_ERR(callout_info)) { + ret = PTR_ERR(callout_info); goto error2; - callout_info[dlen] = '\0'; - - ret = -EFAULT; - if (copy_from_user(callout_info, _callout_info, dlen) != 0) - goto error3; + } } /* get the destination keyring if specified */ @@ -264,36 +226,21 @@ long keyctl_get_keyring_ID(key_serial_t long keyctl_join_session_keyring(const char __user *_name) { char *name; - long nlen, ret; + long ret; /* fetch the name from userspace */ name = NULL; if (_name) { - ret = -EFAULT; - nlen = strnlen_user(_name, PAGE_SIZE - 1); - if (nlen <= 0) + name = strdup_user(_name); + if (IS_ERR(name)) { + ret = PTR_ERR(name); goto error; - - ret = -EINVAL; - if (nlen > PAGE_SIZE - 1) - goto error; - - ret = -ENOMEM; - name = kmalloc(nlen + 1, GFP_KERNEL); - if (!name) - goto error; - name[nlen] = '\0'; - - ret = -EFAULT; - if (copy_from_user(name, _name, nlen) != 0) - goto error2; + } } /* join the session */ ret = join_session_keyring(name); - error2: - kfree(name); error: return ret; @@ -566,7 +513,7 @@ long keyctl_keyring_search(key_serial_t struct key_type *ktype; key_ref_t keyring_ref, key_ref, dest_ref; char type[32], *description; - long dlen, ret; + long ret; /* pull the type and description into kernel space */ ret = strncpy_from_user(type, _type, sizeof(type) - 1); @@ -574,24 +521,11 @@ long keyctl_keyring_search(key_serial_t goto error; type[31] = '\0'; - ret = -EFAULT; - dlen = strnlen_user(_description, PAGE_SIZE - 1); - if (dlen <= 0) - goto error; - - ret = -EINVAL; - if (dlen > PAGE_SIZE - 1) + description = strdup_user(_description); + if (IS_ERR(description)) { + ret = PTR_ERR(description); goto error; - - ret = -ENOMEM; - description = kmalloc(dlen + 1, GFP_KERNEL); - if (!description) - goto error; - description[dlen] = '\0'; - - ret = -EFAULT; - if (copy_from_user(description, _description, dlen) != 0) - goto error2; + } /* get the keyring at which to begin the search */ keyring_ref = lookup_user_key(NULL, ringid, 0, 0, KEY_SEARCH); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/