.. | .. |
---|
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 | |
---|