Skip to contentSkip to conversation

staging: android: ashmem: fix a race condition in ASHMEM_SET_SIZE ioctl

PATCH New Greg Hackmann 1 participant 1 message Jan 8, 2018

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 staging: android: ashmem: fix a race condition in ASHMEM_SET_SIZE ioctl

From: Viktor Slavkovic <[email protected]>

A lock-unlock is missing in ASHMEM_SET_SIZE ioctl which can result in a race condition when mmap is called. After the !asma->file check, before setting asma->size, asma->file can be set in mmap. That would result in having different asma->size than the mapped memory size. Combined with ASHMEM_UNPIN ioctl and shrinker invocation, this can result in memory corruption.

---
 drivers/staging/android/ashmem.c | 2 ++
 1 file changed, 2 insertions(+)
drivers/staging/android/ashmem.c +2 -0
index 0f695df14c9d..372ce9913e6d 100644
@@ -765,10 +765,12 @@ static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 		break;
 	case ASHMEM_SET_SIZE:
 		ret = -EINVAL;
+		mutex_lock(&ashmem_mutex);
 		if (!asma->file) {
 			ret = 0;
 			asma->size = (size_t)arg;
 		}
+		mutex_unlock(&ashmem_mutex);
 		break;
 	case ASHMEM_GET_SIZE:
 		ret = asma->size;
Signature · 1 line
2.16.0.rc0.223.g4a4ac83678-goog