From patchwork Fri Apr 10 08:43:02 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Praveen Paneri X-Patchwork-Id: 6193021 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id CFEBE9F349 for ; Fri, 10 Apr 2015 08:39:35 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id ABFFD203DA for ; Fri, 10 Apr 2015 08:39:34 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id C5BD620353 for ; Fri, 10 Apr 2015 08:39:33 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 15A416E8ED; Fri, 10 Apr 2015 01:39:33 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTP id BC2F56E8E7 for ; Fri, 10 Apr 2015 01:39:31 -0700 (PDT) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 10 Apr 2015 01:39:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,555,1422950400"; d="scan'208";a="706745243" Received: from intel-desktop.iind.intel.com ([10.223.82.37]) by fmsmga002.fm.intel.com with ESMTP; 10 Apr 2015 01:39:30 -0700 From: Praveen Paneri To: intel-gfx@lists.freedesktop.org Date: Fri, 10 Apr 2015 14:13:02 +0530 Message-Id: <1428655383-26087-11-git-send-email-praveen.paneri@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1428655383-26087-1-git-send-email-praveen.paneri@intel.com> References: <1428655383-26087-1-git-send-email-praveen.paneri@intel.com> Cc: Praveen Paneri Subject: [Intel-gfx] [PATCH 10/11] xf86drmHash: Check memory allocation in HashHash() X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP drmRandomCreate() can fail to allocate memory. In such case return an invalid hash value (0xffffffff) from HashHash() function. Caller functions check the hash value and act accordingly. v2: Rebased to the latest. Signed-off-by: Praveen Paneri --- xf86drmHash.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/xf86drmHash.c b/xf86drmHash.c index f287e61..0610838 100644 --- a/xf86drmHash.c +++ b/xf86drmHash.c @@ -75,6 +75,8 @@ #include "xf86drmHash.h" #define HASH_MAGIC 0xdeadbeef +#define HASH_INVALID 0xffffffff /* A value that is out of bound */ + static unsigned long HashHash(unsigned long key) { @@ -87,6 +89,8 @@ static unsigned long HashHash(unsigned long key) if (!init) { void *state; state = drmRandomCreate(37); + if (!state) + return HASH_INVALID; for (i = 0; i < 256; i++) scatter[i] = drmRandom(state); drmRandomDestroy(state); ++init; @@ -153,6 +157,9 @@ static HashBucketPtr HashFind(HashTablePtr table, if (h) *h = hash; + if (hash == HASH_INVALID) + return NULL; + for (bucket = table->buckets[hash]; bucket; bucket = bucket->next) { if (bucket->key == key) { if (prev) { @@ -194,6 +201,7 @@ int drmHashInsert(void *t, unsigned long key, void *value) if (table->magic != HASH_MAGIC) return -1; /* Bad magic */ if (HashFind(table, key, &hash)) return 1; /* Already in table */ + if (hash == HASH_INVALID) return -1; bucket = drmMalloc(sizeof(*bucket)); if (!bucket) return -1; /* Error */ @@ -217,6 +225,7 @@ int drmHashDelete(void *t, unsigned long key) bucket = HashFind(table, key, &hash); + if (hash == HASH_INVALID) return -1; if (!bucket) return 1; /* Not found */ table->buckets[hash] = bucket->next;