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