From patchwork Sun Mar 21 02:56:48 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yong Wang X-Patchwork-Id: 87212 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o2L35sYt016723 for ; Sun, 21 Mar 2010 03:05:54 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753125Ab0CUDFt (ORCPT ); Sat, 20 Mar 2010 23:05:49 -0400 Received: from mga07.intel.com ([143.182.124.22]:20939 "EHLO azsmga101.ch.intel.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752998Ab0CUDFs (ORCPT ); Sat, 20 Mar 2010 23:05:48 -0400 Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga101.ch.intel.com with ESMTP; 20 Mar 2010 20:05:48 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.51,281,1267430400"; d="scan'208";a="256939763" Received: from ywang-moblin2.bj.intel.com (HELO localhost) ([172.16.180.96]) by azsmga001.ch.intel.com with ESMTP; 20 Mar 2010 20:05:47 -0700 Date: Sun, 21 Mar 2010 10:56:48 +0800 From: Yong Wang To: Dmitry Torokhov Cc: linux-input@vger.kernel.org Subject: [PATCH] Check whether getkeycode and setkeycode are still valide Message-ID: <20100321025648.GA24497@ywang-moblin2.bj.intel.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Sun, 21 Mar 2010 03:05:54 +0000 (UTC) diff --git a/drivers/input/input.c b/drivers/input/input.c index e2aad0a..bfe4bdc 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -659,6 +659,9 @@ static int input_default_setkeycode(struct input_dev *dev, int input_get_keycode(struct input_dev *dev, unsigned int scancode, unsigned int *keycode) { + if (!dev->getkeycode) + return -ENODEV; + return dev->getkeycode(dev, scancode, keycode); } EXPORT_SYMBOL(input_get_keycode); @@ -682,6 +685,9 @@ int input_set_keycode(struct input_dev *dev, if (keycode > KEY_MAX) return -EINVAL; + if (!dev->getkeycode || !dev->setkeycode) + return -ENODEV; + spin_lock_irqsave(&dev->event_lock, flags); retval = dev->getkeycode(dev, scancode, &old_keycode); diff --git a/drivers/input/sparse-keymap.c b/drivers/input/sparse-keymap.c index f64e004..25b8d7d 100644 --- a/drivers/input/sparse-keymap.c +++ b/drivers/input/sparse-keymap.c @@ -34,6 +34,9 @@ struct key_entry *sparse_keymap_entry_from_scancode(struct input_dev *dev, { struct key_entry *key; + if (!dev->keycode) + return NULL; + for (key = dev->keycode; key->type != KE_END; key++) if (code == key->code) return key; @@ -55,6 +58,9 @@ struct key_entry *sparse_keymap_entry_from_keycode(struct input_dev *dev, { struct key_entry *key; + if (!dev->keycode) + return NULL; + for (key = dev->keycode; key->type != KE_END; key++) if (key->type == KE_KEY && keycode == key->keycode) return key;