--- /dev/null
+From drosen@google.com Wed Aug 22 11:00:12 2018
+From: Daniel Rosenberg <drosen@google.com>
+Date: Tue, 21 Aug 2018 13:31:50 -0700
+Subject: staging: android: ion: check for kref overflow
+To: stable@vger.kernel.org, Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: linux-kernel@vger.kernel.org, kernel-team@android.com, Daniel Rosenberg <drosen@google.com>
+Message-ID: <20180821203150.231997-1-drosen@google.com>
+
+From: Daniel Rosenberg <drosen@google.com>
+
+This patch is against 4.4. It does not apply to master due to a large
+rework of ion in 4.12 which removed the affected functions altogther.
+4c23cbff073f3b9b ("staging: android: ion: Remove import interface")
+
+Userspace can cause the kref to handles to increment
+arbitrarily high. Ensure it does not overflow.
+
+Signed-off-by: Daniel Rosenberg <drosen@google.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+v2: Fixed patch corruption :(
+
+
+It applies from 3.18 to 4.11, although with a trivial conflict resolution
+for the later branches.
+ drivers/staging/android/ion/ion.c | 17 ++++++++++++++---
+ 1 file changed, 14 insertions(+), 3 deletions(-)
+
+--- a/drivers/staging/android/ion/ion.c
++++ b/drivers/staging/android/ion/ion.c
+@@ -15,6 +15,7 @@
+ *
+ */
+
++#include <linux/atomic.h>
+ #include <linux/device.h>
+ #include <linux/err.h>
+ #include <linux/file.h>
+@@ -389,6 +390,16 @@ static void ion_handle_get(struct ion_ha
+ kref_get(&handle->ref);
+ }
+
++/* Must hold the client lock */
++static struct ion_handle *ion_handle_get_check_overflow(
++ struct ion_handle *handle)
++{
++ if (atomic_read(&handle->ref.refcount) + 1 == 0)
++ return ERR_PTR(-EOVERFLOW);
++ ion_handle_get(handle);
++ return handle;
++}
++
+ static int ion_handle_put_nolock(struct ion_handle *handle)
+ {
+ int ret;
+@@ -435,9 +446,9 @@ static struct ion_handle *ion_handle_get
+
+ handle = idr_find(&client->idr, id);
+ if (handle)
+- ion_handle_get(handle);
++ return ion_handle_get_check_overflow(handle);
+
+- return handle ? handle : ERR_PTR(-EINVAL);
++ return ERR_PTR(-EINVAL);
+ }
+
+ struct ion_handle *ion_handle_get_by_id(struct ion_client *client,
+@@ -1197,7 +1208,7 @@ struct ion_handle *ion_import_dma_buf(st
+ /* if a handle exists for this buffer just take a reference to it */
+ handle = ion_handle_lookup(client, buffer);
+ if (!IS_ERR(handle)) {
+- ion_handle_get(handle);
++ handle = ion_handle_get_check_overflow(handle);
+ mutex_unlock(&client->lock);
+ goto end;
+ }