fork.c (1651e14e28a2d9f446018ef522882e0709a2ce4f) fork.c (071df104f808b8195c40643dcb4d060681742e29)
1/*
2 * linux/kernel/fork.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7/*
8 * 'fork.c' contains the help-routines for the 'fork' system call

--- 1593 unchanged lines hidden (view full) ---

1602 int err = 0;
1603 struct fs_struct *fs, *new_fs = NULL;
1604 struct namespace *ns, *new_ns = NULL;
1605 struct sighand_struct *sigh, *new_sigh = NULL;
1606 struct mm_struct *mm, *new_mm = NULL, *active_mm = NULL;
1607 struct files_struct *fd, *new_fd = NULL;
1608 struct sem_undo_list *new_ulist = NULL;
1609 struct nsproxy *new_nsproxy, *old_nsproxy;
1/*
2 * linux/kernel/fork.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7/*
8 * 'fork.c' contains the help-routines for the 'fork' system call

--- 1593 unchanged lines hidden (view full) ---

1602 int err = 0;
1603 struct fs_struct *fs, *new_fs = NULL;
1604 struct namespace *ns, *new_ns = NULL;
1605 struct sighand_struct *sigh, *new_sigh = NULL;
1606 struct mm_struct *mm, *new_mm = NULL, *active_mm = NULL;
1607 struct files_struct *fd, *new_fd = NULL;
1608 struct sem_undo_list *new_ulist = NULL;
1609 struct nsproxy *new_nsproxy, *old_nsproxy;
1610 struct uts_namespace *uts, *new_uts = NULL;
1610
1611 check_unshare_flags(&unshare_flags);
1612
1613 /* Return -EINVAL for all unsupported flags */
1614 err = -EINVAL;
1615 if (unshare_flags & ~(CLONE_THREAD|CLONE_FS|CLONE_NEWNS|CLONE_SIGHAND|
1611
1612 check_unshare_flags(&unshare_flags);
1613
1614 /* Return -EINVAL for all unsupported flags */
1615 err = -EINVAL;
1616 if (unshare_flags & ~(CLONE_THREAD|CLONE_FS|CLONE_NEWNS|CLONE_SIGHAND|
1616 CLONE_VM|CLONE_FILES|CLONE_SYSVSEM))
1617 CLONE_VM|CLONE_FILES|CLONE_SYSVSEM|CLONE_NEWUTS))
1617 goto bad_unshare_out;
1618
1619 if ((err = unshare_thread(unshare_flags)))
1620 goto bad_unshare_out;
1621 if ((err = unshare_fs(unshare_flags, &new_fs)))
1622 goto bad_unshare_cleanup_thread;
1623 if ((err = unshare_namespace(unshare_flags, &new_ns, new_fs)))
1624 goto bad_unshare_cleanup_fs;
1625 if ((err = unshare_sighand(unshare_flags, &new_sigh)))
1626 goto bad_unshare_cleanup_ns;
1627 if ((err = unshare_vm(unshare_flags, &new_mm)))
1628 goto bad_unshare_cleanup_sigh;
1629 if ((err = unshare_fd(unshare_flags, &new_fd)))
1630 goto bad_unshare_cleanup_vm;
1631 if ((err = unshare_semundo(unshare_flags, &new_ulist)))
1632 goto bad_unshare_cleanup_fd;
1618 goto bad_unshare_out;
1619
1620 if ((err = unshare_thread(unshare_flags)))
1621 goto bad_unshare_out;
1622 if ((err = unshare_fs(unshare_flags, &new_fs)))
1623 goto bad_unshare_cleanup_thread;
1624 if ((err = unshare_namespace(unshare_flags, &new_ns, new_fs)))
1625 goto bad_unshare_cleanup_fs;
1626 if ((err = unshare_sighand(unshare_flags, &new_sigh)))
1627 goto bad_unshare_cleanup_ns;
1628 if ((err = unshare_vm(unshare_flags, &new_mm)))
1629 goto bad_unshare_cleanup_sigh;
1630 if ((err = unshare_fd(unshare_flags, &new_fd)))
1631 goto bad_unshare_cleanup_vm;
1632 if ((err = unshare_semundo(unshare_flags, &new_ulist)))
1633 goto bad_unshare_cleanup_fd;
1634 if ((err = unshare_utsname(unshare_flags, &new_uts)))
1635 goto bad_unshare_cleanup_semundo;
1633
1636
1634 if (new_fs || new_ns || new_sigh || new_mm || new_fd || new_ulist) {
1637 if (new_fs || new_ns || new_sigh || new_mm || new_fd || new_ulist ||
1638 new_uts) {
1635
1636 old_nsproxy = current->nsproxy;
1637 new_nsproxy = dup_namespaces(old_nsproxy);
1638 if (!new_nsproxy) {
1639 err = -ENOMEM;
1639
1640 old_nsproxy = current->nsproxy;
1641 new_nsproxy = dup_namespaces(old_nsproxy);
1642 if (!new_nsproxy) {
1643 err = -ENOMEM;
1640 goto bad_unshare_cleanup_semundo;
1644 goto bad_unshare_cleanup_uts;
1641 }
1642
1643 task_lock(current);
1644 current->nsproxy = new_nsproxy;
1645
1646 if (new_fs) {
1647 fs = current->fs;
1648 current->fs = new_fs;

--- 22 unchanged lines hidden (view full) ---

1671 }
1672
1673 if (new_fd) {
1674 fd = current->files;
1675 current->files = new_fd;
1676 new_fd = fd;
1677 }
1678
1645 }
1646
1647 task_lock(current);
1648 current->nsproxy = new_nsproxy;
1649
1650 if (new_fs) {
1651 fs = current->fs;
1652 current->fs = new_fs;

--- 22 unchanged lines hidden (view full) ---

1675 }
1676
1677 if (new_fd) {
1678 fd = current->files;
1679 current->files = new_fd;
1680 new_fd = fd;
1681 }
1682
1683 if (new_uts) {
1684 uts = current->nsproxy->uts_ns;
1685 current->nsproxy->uts_ns = new_uts;
1686 new_uts = uts;
1687 }
1688
1679 task_unlock(current);
1680 put_nsproxy(old_nsproxy);
1681 }
1682
1689 task_unlock(current);
1690 put_nsproxy(old_nsproxy);
1691 }
1692
1693bad_unshare_cleanup_uts:
1694 if (new_uts)
1695 put_uts_ns(new_uts);
1696
1683bad_unshare_cleanup_semundo:
1684bad_unshare_cleanup_fd:
1685 if (new_fd)
1686 put_files_struct(new_fd);
1687
1688bad_unshare_cleanup_vm:
1689 if (new_mm)
1690 mmput(new_mm);

--- 18 unchanged lines hidden ---
1697bad_unshare_cleanup_semundo:
1698bad_unshare_cleanup_fd:
1699 if (new_fd)
1700 put_files_struct(new_fd);
1701
1702bad_unshare_cleanup_vm:
1703 if (new_mm)
1704 mmput(new_mm);

--- 18 unchanged lines hidden ---