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