Commit 98818189ea9a8e7abd4d8699289da6b14d8190ee

Authored by Ulrich Hecht
Committed by Riku Voipio
1 parent 784ccfdb

64-bit clean socketcall syscall

makes socketcall 64-bit clean so it works on 64-bit big-endian systems

Signed-off-by: Ulrich Hecht <uli@suse.de>
Signed-off-by: Riku Voipio <riku.voipio@iki.fi>
Showing 1 changed file with 65 additions and 65 deletions
linux-user/syscall.c
@@ -1777,11 +1777,11 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1777,11 +1777,11 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1777 switch(num) { 1777 switch(num) {
1778 case SOCKOP_socket: 1778 case SOCKOP_socket:
1779 { 1779 {
1780 - int domain, type, protocol; 1780 + abi_ulong domain, type, protocol;
1781 1781
1782 - if (get_user_s32(domain, vptr)  
1783 - || get_user_s32(type, vptr + n)  
1784 - || get_user_s32(protocol, vptr + 2 * n)) 1782 + if (get_user_ual(domain, vptr)
  1783 + || get_user_ual(type, vptr + n)
  1784 + || get_user_ual(protocol, vptr + 2 * n))
1785 return -TARGET_EFAULT; 1785 return -TARGET_EFAULT;
1786 1786
1787 ret = do_socket(domain, type, protocol); 1787 ret = do_socket(domain, type, protocol);
@@ -1789,13 +1789,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1789,13 +1789,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1789 break; 1789 break;
1790 case SOCKOP_bind: 1790 case SOCKOP_bind:
1791 { 1791 {
1792 - int sockfd; 1792 + abi_ulong sockfd;
1793 abi_ulong target_addr; 1793 abi_ulong target_addr;
1794 socklen_t addrlen; 1794 socklen_t addrlen;
1795 1795
1796 - if (get_user_s32(sockfd, vptr) 1796 + if (get_user_ual(sockfd, vptr)
1797 || get_user_ual(target_addr, vptr + n) 1797 || get_user_ual(target_addr, vptr + n)
1798 - || get_user_u32(addrlen, vptr + 2 * n)) 1798 + || get_user_ual(addrlen, vptr + 2 * n))
1799 return -TARGET_EFAULT; 1799 return -TARGET_EFAULT;
1800 1800
1801 ret = do_bind(sockfd, target_addr, addrlen); 1801 ret = do_bind(sockfd, target_addr, addrlen);
@@ -1803,13 +1803,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1803,13 +1803,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1803 break; 1803 break;
1804 case SOCKOP_connect: 1804 case SOCKOP_connect:
1805 { 1805 {
1806 - int sockfd; 1806 + abi_ulong sockfd;
1807 abi_ulong target_addr; 1807 abi_ulong target_addr;
1808 socklen_t addrlen; 1808 socklen_t addrlen;
1809 1809
1810 - if (get_user_s32(sockfd, vptr) 1810 + if (get_user_ual(sockfd, vptr)
1811 || get_user_ual(target_addr, vptr + n) 1811 || get_user_ual(target_addr, vptr + n)
1812 - || get_user_u32(addrlen, vptr + 2 * n)) 1812 + || get_user_ual(addrlen, vptr + 2 * n))
1813 return -TARGET_EFAULT; 1813 return -TARGET_EFAULT;
1814 1814
1815 ret = do_connect(sockfd, target_addr, addrlen); 1815 ret = do_connect(sockfd, target_addr, addrlen);
@@ -1817,10 +1817,10 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1817,10 +1817,10 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1817 break; 1817 break;
1818 case SOCKOP_listen: 1818 case SOCKOP_listen:
1819 { 1819 {
1820 - int sockfd, backlog; 1820 + abi_ulong sockfd, backlog;
1821 1821
1822 - if (get_user_s32(sockfd, vptr)  
1823 - || get_user_s32(backlog, vptr + n)) 1822 + if (get_user_ual(sockfd, vptr)
  1823 + || get_user_ual(backlog, vptr + n))
1824 return -TARGET_EFAULT; 1824 return -TARGET_EFAULT;
1825 1825
1826 ret = get_errno(listen(sockfd, backlog)); 1826 ret = get_errno(listen(sockfd, backlog));
@@ -1828,12 +1828,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1828,12 +1828,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1828 break; 1828 break;
1829 case SOCKOP_accept: 1829 case SOCKOP_accept:
1830 { 1830 {
1831 - int sockfd; 1831 + abi_ulong sockfd;
1832 abi_ulong target_addr, target_addrlen; 1832 abi_ulong target_addr, target_addrlen;
1833 1833
1834 - if (get_user_s32(sockfd, vptr) 1834 + if (get_user_ual(sockfd, vptr)
1835 || get_user_ual(target_addr, vptr + n) 1835 || get_user_ual(target_addr, vptr + n)
1836 - || get_user_u32(target_addrlen, vptr + 2 * n)) 1836 + || get_user_ual(target_addrlen, vptr + 2 * n))
1837 return -TARGET_EFAULT; 1837 return -TARGET_EFAULT;
1838 1838
1839 ret = do_accept(sockfd, target_addr, target_addrlen); 1839 ret = do_accept(sockfd, target_addr, target_addrlen);
@@ -1841,12 +1841,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1841,12 +1841,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1841 break; 1841 break;
1842 case SOCKOP_getsockname: 1842 case SOCKOP_getsockname:
1843 { 1843 {
1844 - int sockfd; 1844 + abi_ulong sockfd;
1845 abi_ulong target_addr, target_addrlen; 1845 abi_ulong target_addr, target_addrlen;
1846 1846
1847 - if (get_user_s32(sockfd, vptr) 1847 + if (get_user_ual(sockfd, vptr)
1848 || get_user_ual(target_addr, vptr + n) 1848 || get_user_ual(target_addr, vptr + n)
1849 - || get_user_u32(target_addrlen, vptr + 2 * n)) 1849 + || get_user_ual(target_addrlen, vptr + 2 * n))
1850 return -TARGET_EFAULT; 1850 return -TARGET_EFAULT;
1851 1851
1852 ret = do_getsockname(sockfd, target_addr, target_addrlen); 1852 ret = do_getsockname(sockfd, target_addr, target_addrlen);
@@ -1854,12 +1854,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1854,12 +1854,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1854 break; 1854 break;
1855 case SOCKOP_getpeername: 1855 case SOCKOP_getpeername:
1856 { 1856 {
1857 - int sockfd; 1857 + abi_ulong sockfd;
1858 abi_ulong target_addr, target_addrlen; 1858 abi_ulong target_addr, target_addrlen;
1859 1859
1860 - if (get_user_s32(sockfd, vptr) 1860 + if (get_user_ual(sockfd, vptr)
1861 || get_user_ual(target_addr, vptr + n) 1861 || get_user_ual(target_addr, vptr + n)
1862 - || get_user_u32(target_addrlen, vptr + 2 * n)) 1862 + || get_user_ual(target_addrlen, vptr + 2 * n))
1863 return -TARGET_EFAULT; 1863 return -TARGET_EFAULT;
1864 1864
1865 ret = do_getpeername(sockfd, target_addr, target_addrlen); 1865 ret = do_getpeername(sockfd, target_addr, target_addrlen);
@@ -1867,12 +1867,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1867,12 +1867,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1867 break; 1867 break;
1868 case SOCKOP_socketpair: 1868 case SOCKOP_socketpair:
1869 { 1869 {
1870 - int domain, type, protocol; 1870 + abi_ulong domain, type, protocol;
1871 abi_ulong tab; 1871 abi_ulong tab;
1872 1872
1873 - if (get_user_s32(domain, vptr)  
1874 - || get_user_s32(type, vptr + n)  
1875 - || get_user_s32(protocol, vptr + 2 * n) 1873 + if (get_user_ual(domain, vptr)
  1874 + || get_user_ual(type, vptr + n)
  1875 + || get_user_ual(protocol, vptr + 2 * n)
1876 || get_user_ual(tab, vptr + 3 * n)) 1876 || get_user_ual(tab, vptr + 3 * n))
1877 return -TARGET_EFAULT; 1877 return -TARGET_EFAULT;
1878 1878
@@ -1881,15 +1881,15 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1881,15 +1881,15 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1881 break; 1881 break;
1882 case SOCKOP_send: 1882 case SOCKOP_send:
1883 { 1883 {
1884 - int sockfd; 1884 + abi_ulong sockfd;
1885 abi_ulong msg; 1885 abi_ulong msg;
1886 size_t len; 1886 size_t len;
1887 - int flags; 1887 + abi_ulong flags;
1888 1888
1889 - if (get_user_s32(sockfd, vptr) 1889 + if (get_user_ual(sockfd, vptr)
1890 || get_user_ual(msg, vptr + n) 1890 || get_user_ual(msg, vptr + n)
1891 || get_user_ual(len, vptr + 2 * n) 1891 || get_user_ual(len, vptr + 2 * n)
1892 - || get_user_s32(flags, vptr + 3 * n)) 1892 + || get_user_ual(flags, vptr + 3 * n))
1893 return -TARGET_EFAULT; 1893 return -TARGET_EFAULT;
1894 1894
1895 ret = do_sendto(sockfd, msg, len, flags, 0, 0); 1895 ret = do_sendto(sockfd, msg, len, flags, 0, 0);
@@ -1897,15 +1897,15 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1897,15 +1897,15 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1897 break; 1897 break;
1898 case SOCKOP_recv: 1898 case SOCKOP_recv:
1899 { 1899 {
1900 - int sockfd; 1900 + abi_ulong sockfd;
1901 abi_ulong msg; 1901 abi_ulong msg;
1902 size_t len; 1902 size_t len;
1903 - int flags; 1903 + abi_ulong flags;
1904 1904
1905 - if (get_user_s32(sockfd, vptr) 1905 + if (get_user_ual(sockfd, vptr)
1906 || get_user_ual(msg, vptr + n) 1906 || get_user_ual(msg, vptr + n)
1907 || get_user_ual(len, vptr + 2 * n) 1907 || get_user_ual(len, vptr + 2 * n)
1908 - || get_user_s32(flags, vptr + 3 * n)) 1908 + || get_user_ual(flags, vptr + 3 * n))
1909 return -TARGET_EFAULT; 1909 return -TARGET_EFAULT;
1910 1910
1911 ret = do_recvfrom(sockfd, msg, len, flags, 0, 0); 1911 ret = do_recvfrom(sockfd, msg, len, flags, 0, 0);
@@ -1913,19 +1913,19 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1913,19 +1913,19 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1913 break; 1913 break;
1914 case SOCKOP_sendto: 1914 case SOCKOP_sendto:
1915 { 1915 {
1916 - int sockfd; 1916 + abi_ulong sockfd;
1917 abi_ulong msg; 1917 abi_ulong msg;
1918 size_t len; 1918 size_t len;
1919 - int flags; 1919 + abi_ulong flags;
1920 abi_ulong addr; 1920 abi_ulong addr;
1921 socklen_t addrlen; 1921 socklen_t addrlen;
1922 1922
1923 - if (get_user_s32(sockfd, vptr) 1923 + if (get_user_ual(sockfd, vptr)
1924 || get_user_ual(msg, vptr + n) 1924 || get_user_ual(msg, vptr + n)
1925 || get_user_ual(len, vptr + 2 * n) 1925 || get_user_ual(len, vptr + 2 * n)
1926 - || get_user_s32(flags, vptr + 3 * n) 1926 + || get_user_ual(flags, vptr + 3 * n)
1927 || get_user_ual(addr, vptr + 4 * n) 1927 || get_user_ual(addr, vptr + 4 * n)
1928 - || get_user_u32(addrlen, vptr + 5 * n)) 1928 + || get_user_ual(addrlen, vptr + 5 * n))
1929 return -TARGET_EFAULT; 1929 return -TARGET_EFAULT;
1930 1930
1931 ret = do_sendto(sockfd, msg, len, flags, addr, addrlen); 1931 ret = do_sendto(sockfd, msg, len, flags, addr, addrlen);
@@ -1933,19 +1933,19 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1933,19 +1933,19 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1933 break; 1933 break;
1934 case SOCKOP_recvfrom: 1934 case SOCKOP_recvfrom:
1935 { 1935 {
1936 - int sockfd; 1936 + abi_ulong sockfd;
1937 abi_ulong msg; 1937 abi_ulong msg;
1938 size_t len; 1938 size_t len;
1939 - int flags; 1939 + abi_ulong flags;
1940 abi_ulong addr; 1940 abi_ulong addr;
1941 socklen_t addrlen; 1941 socklen_t addrlen;
1942 1942
1943 - if (get_user_s32(sockfd, vptr) 1943 + if (get_user_ual(sockfd, vptr)
1944 || get_user_ual(msg, vptr + n) 1944 || get_user_ual(msg, vptr + n)
1945 || get_user_ual(len, vptr + 2 * n) 1945 || get_user_ual(len, vptr + 2 * n)
1946 - || get_user_s32(flags, vptr + 3 * n) 1946 + || get_user_ual(flags, vptr + 3 * n)
1947 || get_user_ual(addr, vptr + 4 * n) 1947 || get_user_ual(addr, vptr + 4 * n)
1948 - || get_user_u32(addrlen, vptr + 5 * n)) 1948 + || get_user_ual(addrlen, vptr + 5 * n))
1949 return -TARGET_EFAULT; 1949 return -TARGET_EFAULT;
1950 1950
1951 ret = do_recvfrom(sockfd, msg, len, flags, addr, addrlen); 1951 ret = do_recvfrom(sockfd, msg, len, flags, addr, addrlen);
@@ -1953,10 +1953,10 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1953,10 +1953,10 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1953 break; 1953 break;
1954 case SOCKOP_shutdown: 1954 case SOCKOP_shutdown:
1955 { 1955 {
1956 - int sockfd, how; 1956 + abi_ulong sockfd, how;
1957 1957
1958 - if (get_user_s32(sockfd, vptr)  
1959 - || get_user_s32(how, vptr + n)) 1958 + if (get_user_ual(sockfd, vptr)
  1959 + || get_user_ual(how, vptr + n))
1960 return -TARGET_EFAULT; 1960 return -TARGET_EFAULT;
1961 1961
1962 ret = get_errno(shutdown(sockfd, how)); 1962 ret = get_errno(shutdown(sockfd, how));
@@ -1965,13 +1965,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1965,13 +1965,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1965 case SOCKOP_sendmsg: 1965 case SOCKOP_sendmsg:
1966 case SOCKOP_recvmsg: 1966 case SOCKOP_recvmsg:
1967 { 1967 {
1968 - int fd; 1968 + abi_ulong fd;
1969 abi_ulong target_msg; 1969 abi_ulong target_msg;
1970 - int flags; 1970 + abi_ulong flags;
1971 1971
1972 - if (get_user_s32(fd, vptr) 1972 + if (get_user_ual(fd, vptr)
1973 || get_user_ual(target_msg, vptr + n) 1973 || get_user_ual(target_msg, vptr + n)
1974 - || get_user_s32(flags, vptr + 2 * n)) 1974 + || get_user_ual(flags, vptr + 2 * n))
1975 return -TARGET_EFAULT; 1975 return -TARGET_EFAULT;
1976 1976
1977 ret = do_sendrecvmsg(fd, target_msg, flags, 1977 ret = do_sendrecvmsg(fd, target_msg, flags,
@@ -1980,17 +1980,17 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1980,17 +1980,17 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1980 break; 1980 break;
1981 case SOCKOP_setsockopt: 1981 case SOCKOP_setsockopt:
1982 { 1982 {
1983 - int sockfd;  
1984 - int level;  
1985 - int optname; 1983 + abi_ulong sockfd;
  1984 + abi_ulong level;
  1985 + abi_ulong optname;
1986 abi_ulong optval; 1986 abi_ulong optval;
1987 socklen_t optlen; 1987 socklen_t optlen;
1988 1988
1989 - if (get_user_s32(sockfd, vptr)  
1990 - || get_user_s32(level, vptr + n)  
1991 - || get_user_s32(optname, vptr + 2 * n) 1989 + if (get_user_ual(sockfd, vptr)
  1990 + || get_user_ual(level, vptr + n)
  1991 + || get_user_ual(optname, vptr + 2 * n)
1992 || get_user_ual(optval, vptr + 3 * n) 1992 || get_user_ual(optval, vptr + 3 * n)
1993 - || get_user_u32(optlen, vptr + 4 * n)) 1993 + || get_user_ual(optlen, vptr + 4 * n))
1994 return -TARGET_EFAULT; 1994 return -TARGET_EFAULT;
1995 1995
1996 ret = do_setsockopt(sockfd, level, optname, optval, optlen); 1996 ret = do_setsockopt(sockfd, level, optname, optval, optlen);
@@ -1998,17 +1998,17 @@ static abi_long do_socketcall(int num, abi_ulong vptr) @@ -1998,17 +1998,17 @@ static abi_long do_socketcall(int num, abi_ulong vptr)
1998 break; 1998 break;
1999 case SOCKOP_getsockopt: 1999 case SOCKOP_getsockopt:
2000 { 2000 {
2001 - int sockfd;  
2002 - int level;  
2003 - int optname; 2001 + abi_ulong sockfd;
  2002 + abi_ulong level;
  2003 + abi_ulong optname;
2004 abi_ulong optval; 2004 abi_ulong optval;
2005 socklen_t optlen; 2005 socklen_t optlen;
2006 2006
2007 - if (get_user_s32(sockfd, vptr)  
2008 - || get_user_s32(level, vptr + n)  
2009 - || get_user_s32(optname, vptr + 2 * n) 2007 + if (get_user_ual(sockfd, vptr)
  2008 + || get_user_ual(level, vptr + n)
  2009 + || get_user_ual(optname, vptr + 2 * n)
2010 || get_user_ual(optval, vptr + 3 * n) 2010 || get_user_ual(optval, vptr + 3 * n)
2011 - || get_user_u32(optlen, vptr + 4 * n)) 2011 + || get_user_ual(optlen, vptr + 4 * n))
2012 return -TARGET_EFAULT; 2012 return -TARGET_EFAULT;
2013 2013
2014 ret = do_getsockopt(sockfd, level, optname, optval, optlen); 2014 ret = do_getsockopt(sockfd, level, optname, optval, optlen);