Revision b03c60f3 linux-user/syscall.c
b/linux-user/syscall.c | ||
---|---|---|
103 | 103 |
extern int flock(int, int); |
104 | 104 |
extern int setfsuid(int); |
105 | 105 |
extern int setfsgid(int); |
106 |
extern int setresuid(int,int,int); |
|
107 |
extern int getresuid(int *,int *,int *); |
|
108 |
extern int setresgid(int,int,int); |
|
109 |
extern int getresgid(int *,int *,int *); |
|
106 | 110 |
|
107 | 111 |
static inline long get_errno(long ret) |
108 | 112 |
{ |
... | ... | |
809 | 813 |
|
810 | 814 |
#endif |
811 | 815 |
|
816 |
#define high2lowuid(x) (x) |
|
817 |
#define high2lowgid(x) (x) |
|
818 |
#define low2highuid(x) (x) |
|
819 |
#define low2highgid(x) (x) |
|
812 | 820 |
|
813 | 821 |
void syscall_init(void) |
814 | 822 |
{ |
... | ... | |
913 | 921 |
ret = get_errno(umount((const char *)arg1)); |
914 | 922 |
break; |
915 | 923 |
case TARGET_NR_setuid: |
916 |
ret = get_errno(setuid(arg1));
|
|
924 |
ret = get_errno(setuid(low2highuid(arg1)));
|
|
917 | 925 |
break; |
918 | 926 |
case TARGET_NR_getuid: |
919 | 927 |
ret = get_errno(getuid()); |
... | ... | |
984 | 992 |
case TARGET_NR_prof: |
985 | 993 |
goto unimplemented; |
986 | 994 |
case TARGET_NR_setgid: |
987 |
ret = get_errno(setgid(arg1));
|
|
995 |
ret = get_errno(setgid(low2highgid(arg1)));
|
|
988 | 996 |
break; |
989 | 997 |
case TARGET_NR_getgid: |
990 | 998 |
ret = get_errno(getgid()); |
... | ... | |
1727 | 1735 |
} |
1728 | 1736 |
} |
1729 | 1737 |
break; |
1730 |
|
|
1731 | 1738 |
case TARGET_NR_setresuid: |
1739 |
ret = get_errno(setresuid(low2highuid(arg1), |
|
1740 |
low2highuid(arg2), |
|
1741 |
low2highuid(arg3))); |
|
1742 |
break; |
|
1732 | 1743 |
case TARGET_NR_getresuid: |
1744 |
{ |
|
1745 |
int ruid, euid, suid; |
|
1746 |
ret = get_errno(getresuid(&ruid, &euid, &suid)); |
|
1747 |
if (!is_error(ret)) { |
|
1748 |
*(uint16_t *)arg1 = tswap16(high2lowuid(ruid)); |
|
1749 |
*(uint16_t *)arg2 = tswap16(high2lowuid(euid)); |
|
1750 |
*(uint16_t *)arg3 = tswap16(high2lowuid(suid)); |
|
1751 |
} |
|
1752 |
} |
|
1753 |
break; |
|
1754 |
case TARGET_NR_setresgid: |
|
1755 |
ret = get_errno(setresgid(low2highgid(arg1), |
|
1756 |
low2highgid(arg2), |
|
1757 |
low2highgid(arg3))); |
|
1758 |
break; |
|
1759 |
case TARGET_NR_getresgid: |
|
1760 |
{ |
|
1761 |
int rgid, egid, sgid; |
|
1762 |
ret = get_errno(getresgid(&rgid, &egid, &sgid)); |
|
1763 |
if (!is_error(ret)) { |
|
1764 |
*(uint16_t *)arg1 = high2lowgid(tswap16(rgid)); |
|
1765 |
*(uint16_t *)arg2 = high2lowgid(tswap16(egid)); |
|
1766 |
*(uint16_t *)arg3 = high2lowgid(tswap16(sgid)); |
|
1767 |
} |
|
1768 |
} |
|
1769 |
break; |
|
1733 | 1770 |
case TARGET_NR_vm86: |
1734 | 1771 |
case TARGET_NR_query_module: |
1735 | 1772 |
case TARGET_NR_nfsservctl: |
1736 |
case TARGET_NR_setresgid: |
|
1737 |
case TARGET_NR_getresgid: |
|
1738 | 1773 |
case TARGET_NR_prctl: |
1739 | 1774 |
case TARGET_NR_pread: |
1740 | 1775 |
case TARGET_NR_pwrite: |
... | ... | |
1789 | 1824 |
break; |
1790 | 1825 |
|
1791 | 1826 |
case TARGET_NR_lchown32: |
1827 |
ret = get_errno(lchown((const char *)arg1, arg2, arg3)); |
|
1828 |
break; |
|
1792 | 1829 |
case TARGET_NR_getuid32: |
1830 |
ret = get_errno(getuid()); |
|
1831 |
break; |
|
1793 | 1832 |
case TARGET_NR_getgid32: |
1833 |
ret = get_errno(getgid()); |
|
1834 |
break; |
|
1794 | 1835 |
case TARGET_NR_geteuid32: |
1836 |
ret = get_errno(geteuid()); |
|
1837 |
break; |
|
1795 | 1838 |
case TARGET_NR_getegid32: |
1839 |
ret = get_errno(getegid()); |
|
1840 |
break; |
|
1796 | 1841 |
case TARGET_NR_setreuid32: |
1842 |
ret = get_errno(setreuid(arg1, arg2)); |
|
1843 |
break; |
|
1797 | 1844 |
case TARGET_NR_setregid32: |
1845 |
ret = get_errno(setregid(arg1, arg2)); |
|
1846 |
break; |
|
1798 | 1847 |
case TARGET_NR_getgroups32: |
1848 |
goto unimplemented; |
|
1799 | 1849 |
case TARGET_NR_setgroups32: |
1850 |
goto unimplemented; |
|
1800 | 1851 |
case TARGET_NR_fchown32: |
1852 |
ret = get_errno(fchown(arg1, arg2, arg3)); |
|
1853 |
break; |
|
1801 | 1854 |
case TARGET_NR_setresuid32: |
1855 |
ret = get_errno(setresuid(arg1, arg2, arg3)); |
|
1856 |
break; |
|
1802 | 1857 |
case TARGET_NR_getresuid32: |
1858 |
{ |
|
1859 |
int ruid, euid, suid; |
|
1860 |
ret = get_errno(getresuid(&ruid, &euid, &suid)); |
|
1861 |
if (!is_error(ret)) { |
|
1862 |
*(uint32_t *)arg1 = tswap32(ruid); |
|
1863 |
*(uint32_t *)arg2 = tswap32(euid); |
|
1864 |
*(uint32_t *)arg3 = tswap32(suid); |
|
1865 |
} |
|
1866 |
} |
|
1867 |
break; |
|
1803 | 1868 |
case TARGET_NR_setresgid32: |
1869 |
ret = get_errno(setresgid(arg1, arg2, arg3)); |
|
1870 |
break; |
|
1804 | 1871 |
case TARGET_NR_getresgid32: |
1872 |
{ |
|
1873 |
int rgid, egid, sgid; |
|
1874 |
ret = get_errno(getresgid(&rgid, &egid, &sgid)); |
|
1875 |
if (!is_error(ret)) { |
|
1876 |
*(uint32_t *)arg1 = tswap32(rgid); |
|
1877 |
*(uint32_t *)arg2 = tswap32(egid); |
|
1878 |
*(uint32_t *)arg3 = tswap32(sgid); |
|
1879 |
} |
|
1880 |
} |
|
1881 |
break; |
|
1805 | 1882 |
case TARGET_NR_chown32: |
1883 |
ret = get_errno(chown((const char *)arg1, arg2, arg3)); |
|
1884 |
break; |
|
1806 | 1885 |
case TARGET_NR_setuid32: |
1886 |
ret = get_errno(setuid(arg1)); |
|
1887 |
break; |
|
1807 | 1888 |
case TARGET_NR_setgid32: |
1889 |
ret = get_errno(setgid(arg1)); |
|
1890 |
break; |
|
1808 | 1891 |
case TARGET_NR_setfsuid32: |
1892 |
ret = get_errno(setfsuid(arg1)); |
|
1893 |
break; |
|
1809 | 1894 |
case TARGET_NR_setfsgid32: |
1895 |
ret = get_errno(setfsgid(arg1)); |
|
1896 |
break; |
|
1810 | 1897 |
case TARGET_NR_pivot_root: |
1898 |
goto unimplemented; |
|
1811 | 1899 |
case TARGET_NR_mincore: |
1900 |
goto unimplemented; |
|
1812 | 1901 |
case TARGET_NR_madvise: |
1813 | 1902 |
goto unimplemented; |
1814 | 1903 |
#if TARGET_LONG_BITS == 32 |
Also available in: Unified diff