| .. | .. |
|---|
| 711 | 711 | ns->shm_tot + numpages > ns->shm_ctlall) |
|---|
| 712 | 712 | return -ENOSPC; |
|---|
| 713 | 713 | |
|---|
| 714 | | - shp = kvmalloc(sizeof(*shp), GFP_KERNEL); |
|---|
| 714 | + shp = kvmalloc(sizeof(*shp), GFP_KERNEL_ACCOUNT); |
|---|
| 715 | 715 | if (unlikely(!shp)) |
|---|
| 716 | 716 | return -ENOMEM; |
|---|
| 717 | 717 | |
|---|
| .. | .. |
|---|
| 807 | 807 | /* |
|---|
| 808 | 808 | * Called with shm_ids.rwsem and ipcp locked. |
|---|
| 809 | 809 | */ |
|---|
| 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) |
|---|
| 812 | 811 | { |
|---|
| 813 | 812 | struct shmid_kernel *shp; |
|---|
| 814 | 813 | |
|---|
| .. | .. |
|---|
| 1233 | 1232 | return err; |
|---|
| 1234 | 1233 | } |
|---|
| 1235 | 1234 | |
|---|
| 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) |
|---|
| 1237 | 1236 | { |
|---|
| 1238 | | - int err, version; |
|---|
| 1237 | + int err; |
|---|
| 1239 | 1238 | struct ipc_namespace *ns; |
|---|
| 1240 | 1239 | struct shmid64_ds sem64; |
|---|
| 1241 | 1240 | |
|---|
| 1242 | 1241 | if (cmd < 0 || shmid < 0) |
|---|
| 1243 | 1242 | return -EINVAL; |
|---|
| 1244 | 1243 | |
|---|
| 1245 | | - version = ipc_parse_version(&cmd); |
|---|
| 1246 | 1244 | ns = current->nsproxy->ipc_ns; |
|---|
| 1247 | 1245 | |
|---|
| 1248 | 1246 | switch (cmd) { |
|---|
| .. | .. |
|---|
| 1277 | 1275 | case IPC_SET: |
|---|
| 1278 | 1276 | if (copy_shmid_from_user(&sem64, buf, version)) |
|---|
| 1279 | 1277 | return -EFAULT; |
|---|
| 1280 | | - /* fallthru */ |
|---|
| 1278 | + fallthrough; |
|---|
| 1281 | 1279 | case IPC_RMID: |
|---|
| 1282 | 1280 | return shmctl_down(ns, shmid, cmd, &sem64); |
|---|
| 1283 | 1281 | case SHM_LOCK: |
|---|
| .. | .. |
|---|
| 1290 | 1288 | |
|---|
| 1291 | 1289 | SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf) |
|---|
| 1292 | 1290 | { |
|---|
| 1293 | | - return ksys_shmctl(shmid, cmd, buf); |
|---|
| 1291 | + return ksys_shmctl(shmid, cmd, buf, IPC_64); |
|---|
| 1294 | 1292 | } |
|---|
| 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 |
|---|
| 1295 | 1307 | |
|---|
| 1296 | 1308 | #ifdef CONFIG_COMPAT |
|---|
| 1297 | 1309 | |
|---|
| 1298 | 1310 | struct compat_shmid_ds { |
|---|
| 1299 | 1311 | struct compat_ipc_perm shm_perm; |
|---|
| 1300 | 1312 | 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; |
|---|
| 1304 | 1316 | compat_ipc_pid_t shm_cpid; |
|---|
| 1305 | 1317 | compat_ipc_pid_t shm_lpid; |
|---|
| 1306 | 1318 | unsigned short shm_nattch; |
|---|
| .. | .. |
|---|
| 1415 | 1427 | } |
|---|
| 1416 | 1428 | } |
|---|
| 1417 | 1429 | |
|---|
| 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) |
|---|
| 1419 | 1431 | { |
|---|
| 1420 | 1432 | struct ipc_namespace *ns; |
|---|
| 1421 | 1433 | struct shmid64_ds sem64; |
|---|
| 1422 | | - int version = compat_ipc_parse_version(&cmd); |
|---|
| 1423 | 1434 | int err; |
|---|
| 1424 | 1435 | |
|---|
| 1425 | 1436 | ns = current->nsproxy->ipc_ns; |
|---|
| .. | .. |
|---|
| 1459 | 1470 | case IPC_SET: |
|---|
| 1460 | 1471 | if (copy_compat_shmid_from_user(&sem64, uptr, version)) |
|---|
| 1461 | 1472 | return -EFAULT; |
|---|
| 1462 | | - /* fallthru */ |
|---|
| 1473 | + fallthrough; |
|---|
| 1463 | 1474 | case IPC_RMID: |
|---|
| 1464 | 1475 | return shmctl_down(ns, shmid, cmd, &sem64); |
|---|
| 1465 | 1476 | case SHM_LOCK: |
|---|
| 1466 | 1477 | case SHM_UNLOCK: |
|---|
| 1467 | 1478 | return shmctl_do_lock(ns, shmid, cmd); |
|---|
| 1468 | | - break; |
|---|
| 1469 | 1479 | default: |
|---|
| 1470 | 1480 | return -EINVAL; |
|---|
| 1471 | 1481 | } |
|---|
| .. | .. |
|---|
| 1474 | 1484 | |
|---|
| 1475 | 1485 | COMPAT_SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, void __user *, uptr) |
|---|
| 1476 | 1486 | { |
|---|
| 1477 | | - return compat_ksys_shmctl(shmid, cmd, uptr); |
|---|
| 1487 | + return compat_ksys_shmctl(shmid, cmd, uptr, IPC_64); |
|---|
| 1478 | 1488 | } |
|---|
| 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 |
|---|
| 1479 | 1503 | #endif |
|---|
| 1480 | 1504 | |
|---|
| 1481 | 1505 | /* |
|---|
| .. | .. |
|---|
| 1614 | 1638 | if (err) |
|---|
| 1615 | 1639 | goto out_fput; |
|---|
| 1616 | 1640 | |
|---|
| 1617 | | - if (down_write_killable(¤t->mm->mmap_sem)) { |
|---|
| 1641 | + if (mmap_write_lock_killable(current->mm)) { |
|---|
| 1618 | 1642 | err = -EINTR; |
|---|
| 1619 | 1643 | goto out_fput; |
|---|
| 1620 | 1644 | } |
|---|
| .. | .. |
|---|
| 1628 | 1652 | goto invalid; |
|---|
| 1629 | 1653 | } |
|---|
| 1630 | 1654 | |
|---|
| 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); |
|---|
| 1632 | 1656 | *raddr = addr; |
|---|
| 1633 | 1657 | err = 0; |
|---|
| 1634 | 1658 | if (IS_ERR_VALUE(addr)) |
|---|
| 1635 | 1659 | err = (long)addr; |
|---|
| 1636 | 1660 | invalid: |
|---|
| 1637 | | - up_write(¤t->mm->mmap_sem); |
|---|
| 1661 | + mmap_write_unlock(current->mm); |
|---|
| 1638 | 1662 | if (populate) |
|---|
| 1639 | 1663 | mm_populate(addr, populate); |
|---|
| 1640 | 1664 | |
|---|
| .. | .. |
|---|
| 1709 | 1733 | if (addr & ~PAGE_MASK) |
|---|
| 1710 | 1734 | return retval; |
|---|
| 1711 | 1735 | |
|---|
| 1712 | | - if (down_write_killable(&mm->mmap_sem)) |
|---|
| 1736 | + if (mmap_write_lock_killable(mm)) |
|---|
| 1713 | 1737 | return -EINTR; |
|---|
| 1714 | 1738 | |
|---|
| 1715 | 1739 | /* |
|---|
| .. | .. |
|---|
| 1797 | 1821 | |
|---|
| 1798 | 1822 | #endif |
|---|
| 1799 | 1823 | |
|---|
| 1800 | | - up_write(&mm->mmap_sem); |
|---|
| 1824 | + mmap_write_unlock(mm); |
|---|
| 1801 | 1825 | return retval; |
|---|
| 1802 | 1826 | } |
|---|
| 1803 | 1827 | |
|---|