hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/ipc/shm.c
....@@ -711,7 +711,7 @@
711711 ns->shm_tot + numpages > ns->shm_ctlall)
712712 return -ENOSPC;
713713
714
- shp = kvmalloc(sizeof(*shp), GFP_KERNEL);
714
+ shp = kvmalloc(sizeof(*shp), GFP_KERNEL_ACCOUNT);
715715 if (unlikely(!shp))
716716 return -ENOMEM;
717717
....@@ -807,8 +807,7 @@
807807 /*
808808 * Called with shm_ids.rwsem and ipcp locked.
809809 */
810
-static inline int shm_more_checks(struct kern_ipc_perm *ipcp,
811
- struct ipc_params *params)
810
+static int shm_more_checks(struct kern_ipc_perm *ipcp, struct ipc_params *params)
812811 {
813812 struct shmid_kernel *shp;
814813
....@@ -1233,16 +1232,15 @@
12331232 return err;
12341233 }
12351234
1236
-long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf)
1235
+static long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf, int version)
12371236 {
1238
- int err, version;
1237
+ int err;
12391238 struct ipc_namespace *ns;
12401239 struct shmid64_ds sem64;
12411240
12421241 if (cmd < 0 || shmid < 0)
12431242 return -EINVAL;
12441243
1245
- version = ipc_parse_version(&cmd);
12461244 ns = current->nsproxy->ipc_ns;
12471245
12481246 switch (cmd) {
....@@ -1277,7 +1275,7 @@
12771275 case IPC_SET:
12781276 if (copy_shmid_from_user(&sem64, buf, version))
12791277 return -EFAULT;
1280
- /* fallthru */
1278
+ fallthrough;
12811279 case IPC_RMID:
12821280 return shmctl_down(ns, shmid, cmd, &sem64);
12831281 case SHM_LOCK:
....@@ -1290,17 +1288,31 @@
12901288
12911289 SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
12921290 {
1293
- return ksys_shmctl(shmid, cmd, buf);
1291
+ return ksys_shmctl(shmid, cmd, buf, IPC_64);
12941292 }
1293
+
1294
+#ifdef CONFIG_ARCH_WANT_IPC_PARSE_VERSION
1295
+long ksys_old_shmctl(int shmid, int cmd, struct shmid_ds __user *buf)
1296
+{
1297
+ int version = ipc_parse_version(&cmd);
1298
+
1299
+ return ksys_shmctl(shmid, cmd, buf, version);
1300
+}
1301
+
1302
+SYSCALL_DEFINE3(old_shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
1303
+{
1304
+ return ksys_old_shmctl(shmid, cmd, buf);
1305
+}
1306
+#endif
12951307
12961308 #ifdef CONFIG_COMPAT
12971309
12981310 struct compat_shmid_ds {
12991311 struct compat_ipc_perm shm_perm;
13001312 int shm_segsz;
1301
- compat_time_t shm_atime;
1302
- compat_time_t shm_dtime;
1303
- compat_time_t shm_ctime;
1313
+ old_time32_t shm_atime;
1314
+ old_time32_t shm_dtime;
1315
+ old_time32_t shm_ctime;
13041316 compat_ipc_pid_t shm_cpid;
13051317 compat_ipc_pid_t shm_lpid;
13061318 unsigned short shm_nattch;
....@@ -1415,11 +1427,10 @@
14151427 }
14161428 }
14171429
1418
-long compat_ksys_shmctl(int shmid, int cmd, void __user *uptr)
1430
+static long compat_ksys_shmctl(int shmid, int cmd, void __user *uptr, int version)
14191431 {
14201432 struct ipc_namespace *ns;
14211433 struct shmid64_ds sem64;
1422
- int version = compat_ipc_parse_version(&cmd);
14231434 int err;
14241435
14251436 ns = current->nsproxy->ipc_ns;
....@@ -1459,13 +1470,12 @@
14591470 case IPC_SET:
14601471 if (copy_compat_shmid_from_user(&sem64, uptr, version))
14611472 return -EFAULT;
1462
- /* fallthru */
1473
+ fallthrough;
14631474 case IPC_RMID:
14641475 return shmctl_down(ns, shmid, cmd, &sem64);
14651476 case SHM_LOCK:
14661477 case SHM_UNLOCK:
14671478 return shmctl_do_lock(ns, shmid, cmd);
1468
- break;
14691479 default:
14701480 return -EINVAL;
14711481 }
....@@ -1474,8 +1484,22 @@
14741484
14751485 COMPAT_SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, void __user *, uptr)
14761486 {
1477
- return compat_ksys_shmctl(shmid, cmd, uptr);
1487
+ return compat_ksys_shmctl(shmid, cmd, uptr, IPC_64);
14781488 }
1489
+
1490
+#ifdef CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION
1491
+long compat_ksys_old_shmctl(int shmid, int cmd, void __user *uptr)
1492
+{
1493
+ int version = compat_ipc_parse_version(&cmd);
1494
+
1495
+ return compat_ksys_shmctl(shmid, cmd, uptr, version);
1496
+}
1497
+
1498
+COMPAT_SYSCALL_DEFINE3(old_shmctl, int, shmid, int, cmd, void __user *, uptr)
1499
+{
1500
+ return compat_ksys_old_shmctl(shmid, cmd, uptr);
1501
+}
1502
+#endif
14791503 #endif
14801504
14811505 /*
....@@ -1614,7 +1638,7 @@
16141638 if (err)
16151639 goto out_fput;
16161640
1617
- if (down_write_killable(&current->mm->mmap_sem)) {
1641
+ if (mmap_write_lock_killable(current->mm)) {
16181642 err = -EINTR;
16191643 goto out_fput;
16201644 }
....@@ -1628,13 +1652,13 @@
16281652 goto invalid;
16291653 }
16301654
1631
- addr = do_mmap_pgoff(file, addr, size, prot, flags, 0, &populate, NULL);
1655
+ addr = do_mmap(file, addr, size, prot, flags, 0, &populate, NULL);
16321656 *raddr = addr;
16331657 err = 0;
16341658 if (IS_ERR_VALUE(addr))
16351659 err = (long)addr;
16361660 invalid:
1637
- up_write(&current->mm->mmap_sem);
1661
+ mmap_write_unlock(current->mm);
16381662 if (populate)
16391663 mm_populate(addr, populate);
16401664
....@@ -1709,7 +1733,7 @@
17091733 if (addr & ~PAGE_MASK)
17101734 return retval;
17111735
1712
- if (down_write_killable(&mm->mmap_sem))
1736
+ if (mmap_write_lock_killable(mm))
17131737 return -EINTR;
17141738
17151739 /*
....@@ -1797,7 +1821,7 @@
17971821
17981822 #endif
17991823
1800
- up_write(&mm->mmap_sem);
1824
+ mmap_write_unlock(mm);
18011825 return retval;
18021826 }
18031827