Commit 2152390dca9975b1aaaa6f0518ebdd359477905b
Merge commit 'linux-user/linux-user-for-upstream' into tmp-staging
Showing
4 changed files
with
116 additions
and
92 deletions
configure
| @@ -1249,8 +1249,7 @@ fi | @@ -1249,8 +1249,7 @@ fi | ||
| 1249 | # have syscall stubs for these implemented. | 1249 | # have syscall stubs for these implemented. |
| 1250 | # | 1250 | # |
| 1251 | atfile=no | 1251 | atfile=no |
| 1252 | -if [ "$linux_user" = "yes" ] ; then | ||
| 1253 | - cat > $TMPC << EOF | 1252 | +cat > $TMPC << EOF |
| 1254 | #define _ATFILE_SOURCE | 1253 | #define _ATFILE_SOURCE |
| 1255 | #include <sys/types.h> | 1254 | #include <sys/types.h> |
| 1256 | #include <fcntl.h> | 1255 | #include <fcntl.h> |
| @@ -1263,9 +1262,8 @@ main(void) | @@ -1263,9 +1262,8 @@ main(void) | ||
| 1263 | return (unlinkat(AT_FDCWD, "nonexistent_file", 0)); | 1262 | return (unlinkat(AT_FDCWD, "nonexistent_file", 0)); |
| 1264 | } | 1263 | } |
| 1265 | EOF | 1264 | EOF |
| 1266 | - if $cc $ARCH_CFLAGS -o $TMPE $TMPC 2> /dev/null > /dev/null ; then | ||
| 1267 | - atfile=yes | ||
| 1268 | - fi | 1265 | +if $cc $ARCH_CFLAGS -o $TMPE $TMPC 2> /dev/null > /dev/null ; then |
| 1266 | + atfile=yes | ||
| 1269 | fi | 1267 | fi |
| 1270 | 1268 | ||
| 1271 | # Check for inotify functions when we are building linux-user | 1269 | # Check for inotify functions when we are building linux-user |
| @@ -1274,8 +1272,7 @@ fi | @@ -1274,8 +1272,7 @@ fi | ||
| 1274 | # don't provide them even if kernel supports them. | 1272 | # don't provide them even if kernel supports them. |
| 1275 | # | 1273 | # |
| 1276 | inotify=no | 1274 | inotify=no |
| 1277 | -if [ "$linux_user" = "yes" ] ; then | ||
| 1278 | - cat > $TMPC << EOF | 1275 | +cat > $TMPC << EOF |
| 1279 | #include <sys/inotify.h> | 1276 | #include <sys/inotify.h> |
| 1280 | 1277 | ||
| 1281 | int | 1278 | int |
| @@ -1285,9 +1282,8 @@ main(void) | @@ -1285,9 +1282,8 @@ main(void) | ||
| 1285 | return inotify_init(); | 1282 | return inotify_init(); |
| 1286 | } | 1283 | } |
| 1287 | EOF | 1284 | EOF |
| 1288 | - if $cc $ARCH_CFLAGS -o $TMPE $TMPC 2> /dev/null > /dev/null ; then | ||
| 1289 | - inotify=yes | ||
| 1290 | - fi | 1285 | +if $cc $ARCH_CFLAGS -o $TMPE $TMPC 2> /dev/null > /dev/null ; then |
| 1286 | + inotify=yes | ||
| 1291 | fi | 1287 | fi |
| 1292 | 1288 | ||
| 1293 | # check if utimensat and futimens are supported | 1289 | # check if utimensat and futimens are supported |
linux-user/main.c
| @@ -2432,6 +2432,7 @@ int main(int argc, char **argv, char **envp) | @@ -2432,6 +2432,7 @@ int main(int argc, char **argv, char **envp) | ||
| 2432 | envlist_t *envlist = NULL; | 2432 | envlist_t *envlist = NULL; |
| 2433 | const char *argv0 = NULL; | 2433 | const char *argv0 = NULL; |
| 2434 | int i; | 2434 | int i; |
| 2435 | + int ret; | ||
| 2435 | 2436 | ||
| 2436 | if (argc <= 1) | 2437 | if (argc <= 1) |
| 2437 | usage(); | 2438 | usage(); |
| @@ -2636,9 +2637,10 @@ int main(int argc, char **argv, char **envp) | @@ -2636,9 +2637,10 @@ int main(int argc, char **argv, char **envp) | ||
| 2636 | env->opaque = ts; | 2637 | env->opaque = ts; |
| 2637 | task_settid(ts); | 2638 | task_settid(ts); |
| 2638 | 2639 | ||
| 2639 | - if (loader_exec(filename, target_argv, target_environ, regs, | ||
| 2640 | - info, &bprm) != 0) { | ||
| 2641 | - printf("Error loading %s\n", filename); | 2640 | + ret = loader_exec(filename, target_argv, target_environ, regs, |
| 2641 | + info, &bprm); | ||
| 2642 | + if (ret != 0) { | ||
| 2643 | + printf("Error %d while loading %s\n", ret, filename); | ||
| 2642 | _exit(1); | 2644 | _exit(1); |
| 2643 | } | 2645 | } |
| 2644 | 2646 |
linux-user/qemu.h
| @@ -140,7 +140,7 @@ extern const char *qemu_uname_release; | @@ -140,7 +140,7 @@ extern const char *qemu_uname_release; | ||
| 140 | * and envelope for the new program. 32 should suffice, this gives | 140 | * and envelope for the new program. 32 should suffice, this gives |
| 141 | * a maximum env+arg of 128kB w/4KB pages! | 141 | * a maximum env+arg of 128kB w/4KB pages! |
| 142 | */ | 142 | */ |
| 143 | -#define MAX_ARG_PAGES 32 | 143 | +#define MAX_ARG_PAGES 33 |
| 144 | 144 | ||
| 145 | /* | 145 | /* |
| 146 | * This structure is used to hold the arguments that are | 146 | * This structure is used to hold the arguments that are |
linux-user/syscall.c
| @@ -953,7 +953,7 @@ static abi_long do_pipe2(int host_pipe[], int flags) | @@ -953,7 +953,7 @@ static abi_long do_pipe2(int host_pipe[], int flags) | ||
| 953 | #endif | 953 | #endif |
| 954 | } | 954 | } |
| 955 | 955 | ||
| 956 | -static abi_long do_pipe(void *cpu_env, int pipedes, int flags) | 956 | +static abi_long do_pipe(void *cpu_env, abi_ulong pipedes, int flags) |
| 957 | { | 957 | { |
| 958 | int host_pipe[2]; | 958 | int host_pipe[2]; |
| 959 | abi_long ret; | 959 | abi_long ret; |
| @@ -1498,13 +1498,17 @@ static abi_long do_bind(int sockfd, abi_ulong target_addr, | @@ -1498,13 +1498,17 @@ static abi_long do_bind(int sockfd, abi_ulong target_addr, | ||
| 1498 | socklen_t addrlen) | 1498 | socklen_t addrlen) |
| 1499 | { | 1499 | { |
| 1500 | void *addr; | 1500 | void *addr; |
| 1501 | + abi_long ret; | ||
| 1501 | 1502 | ||
| 1502 | if (addrlen < 0) | 1503 | if (addrlen < 0) |
| 1503 | return -TARGET_EINVAL; | 1504 | return -TARGET_EINVAL; |
| 1504 | 1505 | ||
| 1505 | addr = alloca(addrlen+1); | 1506 | addr = alloca(addrlen+1); |
| 1506 | 1507 | ||
| 1507 | - target_to_host_sockaddr(addr, target_addr, addrlen); | 1508 | + ret = target_to_host_sockaddr(addr, target_addr, addrlen); |
| 1509 | + if (ret) | ||
| 1510 | + return ret; | ||
| 1511 | + | ||
| 1508 | return get_errno(bind(sockfd, addr, addrlen)); | 1512 | return get_errno(bind(sockfd, addr, addrlen)); |
| 1509 | } | 1513 | } |
| 1510 | 1514 | ||
| @@ -1513,13 +1517,17 @@ static abi_long do_connect(int sockfd, abi_ulong target_addr, | @@ -1513,13 +1517,17 @@ static abi_long do_connect(int sockfd, abi_ulong target_addr, | ||
| 1513 | socklen_t addrlen) | 1517 | socklen_t addrlen) |
| 1514 | { | 1518 | { |
| 1515 | void *addr; | 1519 | void *addr; |
| 1520 | + abi_long ret; | ||
| 1516 | 1521 | ||
| 1517 | if (addrlen < 0) | 1522 | if (addrlen < 0) |
| 1518 | return -TARGET_EINVAL; | 1523 | return -TARGET_EINVAL; |
| 1519 | 1524 | ||
| 1520 | addr = alloca(addrlen); | 1525 | addr = alloca(addrlen); |
| 1521 | 1526 | ||
| 1522 | - target_to_host_sockaddr(addr, target_addr, addrlen); | 1527 | + ret = target_to_host_sockaddr(addr, target_addr, addrlen); |
| 1528 | + if (ret) | ||
| 1529 | + return ret; | ||
| 1530 | + | ||
| 1523 | return get_errno(connect(sockfd, addr, addrlen)); | 1531 | return get_errno(connect(sockfd, addr, addrlen)); |
| 1524 | } | 1532 | } |
| 1525 | 1533 | ||
| @@ -1543,8 +1551,12 @@ static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg, | @@ -1543,8 +1551,12 @@ static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg, | ||
| 1543 | if (msgp->msg_name) { | 1551 | if (msgp->msg_name) { |
| 1544 | msg.msg_namelen = tswap32(msgp->msg_namelen); | 1552 | msg.msg_namelen = tswap32(msgp->msg_namelen); |
| 1545 | msg.msg_name = alloca(msg.msg_namelen); | 1553 | msg.msg_name = alloca(msg.msg_namelen); |
| 1546 | - target_to_host_sockaddr(msg.msg_name, tswapl(msgp->msg_name), | 1554 | + ret = target_to_host_sockaddr(msg.msg_name, tswapl(msgp->msg_name), |
| 1547 | msg.msg_namelen); | 1555 | msg.msg_namelen); |
| 1556 | + if (ret) { | ||
| 1557 | + unlock_user_struct(msgp, target_msg, send ? 0 : 1); | ||
| 1558 | + return ret; | ||
| 1559 | + } | ||
| 1548 | } else { | 1560 | } else { |
| 1549 | msg.msg_name = NULL; | 1561 | msg.msg_name = NULL; |
| 1550 | msg.msg_namelen = 0; | 1562 | msg.msg_namelen = 0; |
| @@ -1586,12 +1598,19 @@ static abi_long do_accept(int fd, abi_ulong target_addr, | @@ -1586,12 +1598,19 @@ static abi_long do_accept(int fd, abi_ulong target_addr, | ||
| 1586 | void *addr; | 1598 | void *addr; |
| 1587 | abi_long ret; | 1599 | abi_long ret; |
| 1588 | 1600 | ||
| 1601 | + if (target_addr == 0) | ||
| 1602 | + return get_errno(accept(fd, NULL, NULL)); | ||
| 1603 | + | ||
| 1604 | + /* linux returns EINVAL if addrlen pointer is invalid */ | ||
| 1589 | if (get_user_u32(addrlen, target_addrlen_addr)) | 1605 | if (get_user_u32(addrlen, target_addrlen_addr)) |
| 1590 | - return -TARGET_EFAULT; | 1606 | + return -TARGET_EINVAL; |
| 1591 | 1607 | ||
| 1592 | if (addrlen < 0) | 1608 | if (addrlen < 0) |
| 1593 | return -TARGET_EINVAL; | 1609 | return -TARGET_EINVAL; |
| 1594 | 1610 | ||
| 1611 | + if (!access_ok(VERIFY_WRITE, target_addr, addrlen)) | ||
| 1612 | + return -TARGET_EINVAL; | ||
| 1613 | + | ||
| 1595 | addr = alloca(addrlen); | 1614 | addr = alloca(addrlen); |
| 1596 | 1615 | ||
| 1597 | ret = get_errno(accept(fd, addr, &addrlen)); | 1616 | ret = get_errno(accept(fd, addr, &addrlen)); |
| @@ -1617,6 +1636,9 @@ static abi_long do_getpeername(int fd, abi_ulong target_addr, | @@ -1617,6 +1636,9 @@ static abi_long do_getpeername(int fd, abi_ulong target_addr, | ||
| 1617 | if (addrlen < 0) | 1636 | if (addrlen < 0) |
| 1618 | return -TARGET_EINVAL; | 1637 | return -TARGET_EINVAL; |
| 1619 | 1638 | ||
| 1639 | + if (!access_ok(VERIFY_WRITE, target_addr, addrlen)) | ||
| 1640 | + return -TARGET_EFAULT; | ||
| 1641 | + | ||
| 1620 | addr = alloca(addrlen); | 1642 | addr = alloca(addrlen); |
| 1621 | 1643 | ||
| 1622 | ret = get_errno(getpeername(fd, addr, &addrlen)); | 1644 | ret = get_errno(getpeername(fd, addr, &addrlen)); |
| @@ -1636,15 +1658,15 @@ static abi_long do_getsockname(int fd, abi_ulong target_addr, | @@ -1636,15 +1658,15 @@ static abi_long do_getsockname(int fd, abi_ulong target_addr, | ||
| 1636 | void *addr; | 1658 | void *addr; |
| 1637 | abi_long ret; | 1659 | abi_long ret; |
| 1638 | 1660 | ||
| 1639 | - if (target_addr == 0) | ||
| 1640 | - return get_errno(accept(fd, NULL, NULL)); | ||
| 1641 | - | ||
| 1642 | if (get_user_u32(addrlen, target_addrlen_addr)) | 1661 | if (get_user_u32(addrlen, target_addrlen_addr)) |
| 1643 | return -TARGET_EFAULT; | 1662 | return -TARGET_EFAULT; |
| 1644 | 1663 | ||
| 1645 | if (addrlen < 0) | 1664 | if (addrlen < 0) |
| 1646 | return -TARGET_EINVAL; | 1665 | return -TARGET_EINVAL; |
| 1647 | 1666 | ||
| 1667 | + if (!access_ok(VERIFY_WRITE, target_addr, addrlen)) | ||
| 1668 | + return -TARGET_EFAULT; | ||
| 1669 | + | ||
| 1648 | addr = alloca(addrlen); | 1670 | addr = alloca(addrlen); |
| 1649 | 1671 | ||
| 1650 | ret = get_errno(getsockname(fd, addr, &addrlen)); | 1672 | ret = get_errno(getsockname(fd, addr, &addrlen)); |
| @@ -1688,7 +1710,11 @@ static abi_long do_sendto(int fd, abi_ulong msg, size_t len, int flags, | @@ -1688,7 +1710,11 @@ static abi_long do_sendto(int fd, abi_ulong msg, size_t len, int flags, | ||
| 1688 | return -TARGET_EFAULT; | 1710 | return -TARGET_EFAULT; |
| 1689 | if (target_addr) { | 1711 | if (target_addr) { |
| 1690 | addr = alloca(addrlen); | 1712 | addr = alloca(addrlen); |
| 1691 | - target_to_host_sockaddr(addr, target_addr, addrlen); | 1713 | + ret = target_to_host_sockaddr(addr, target_addr, addrlen); |
| 1714 | + if (ret) { | ||
| 1715 | + unlock_user(host_msg, msg, 0); | ||
| 1716 | + return ret; | ||
| 1717 | + } | ||
| 1692 | ret = get_errno(sendto(fd, host_msg, len, flags, addr, addrlen)); | 1718 | ret = get_errno(sendto(fd, host_msg, len, flags, addr, addrlen)); |
| 1693 | } else { | 1719 | } else { |
| 1694 | ret = get_errno(send(fd, host_msg, len, flags)); | 1720 | ret = get_errno(send(fd, host_msg, len, flags)); |
| @@ -1751,11 +1777,11 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1751,11 +1777,11 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1751 | switch(num) { | 1777 | switch(num) { |
| 1752 | case SOCKOP_socket: | 1778 | case SOCKOP_socket: |
| 1753 | { | 1779 | { |
| 1754 | - int domain, type, protocol; | 1780 | + abi_ulong domain, type, protocol; |
| 1755 | 1781 | ||
| 1756 | - if (get_user_s32(domain, vptr) | ||
| 1757 | - || get_user_s32(type, vptr + n) | ||
| 1758 | - || 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)) | ||
| 1759 | return -TARGET_EFAULT; | 1785 | return -TARGET_EFAULT; |
| 1760 | 1786 | ||
| 1761 | ret = do_socket(domain, type, protocol); | 1787 | ret = do_socket(domain, type, protocol); |
| @@ -1763,13 +1789,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1763,13 +1789,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1763 | break; | 1789 | break; |
| 1764 | case SOCKOP_bind: | 1790 | case SOCKOP_bind: |
| 1765 | { | 1791 | { |
| 1766 | - int sockfd; | 1792 | + abi_ulong sockfd; |
| 1767 | abi_ulong target_addr; | 1793 | abi_ulong target_addr; |
| 1768 | socklen_t addrlen; | 1794 | socklen_t addrlen; |
| 1769 | 1795 | ||
| 1770 | - if (get_user_s32(sockfd, vptr) | 1796 | + if (get_user_ual(sockfd, vptr) |
| 1771 | || get_user_ual(target_addr, vptr + n) | 1797 | || get_user_ual(target_addr, vptr + n) |
| 1772 | - || get_user_u32(addrlen, vptr + 2 * n)) | 1798 | + || get_user_ual(addrlen, vptr + 2 * n)) |
| 1773 | return -TARGET_EFAULT; | 1799 | return -TARGET_EFAULT; |
| 1774 | 1800 | ||
| 1775 | ret = do_bind(sockfd, target_addr, addrlen); | 1801 | ret = do_bind(sockfd, target_addr, addrlen); |
| @@ -1777,13 +1803,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1777,13 +1803,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1777 | break; | 1803 | break; |
| 1778 | case SOCKOP_connect: | 1804 | case SOCKOP_connect: |
| 1779 | { | 1805 | { |
| 1780 | - int sockfd; | 1806 | + abi_ulong sockfd; |
| 1781 | abi_ulong target_addr; | 1807 | abi_ulong target_addr; |
| 1782 | socklen_t addrlen; | 1808 | socklen_t addrlen; |
| 1783 | 1809 | ||
| 1784 | - if (get_user_s32(sockfd, vptr) | 1810 | + if (get_user_ual(sockfd, vptr) |
| 1785 | || get_user_ual(target_addr, vptr + n) | 1811 | || get_user_ual(target_addr, vptr + n) |
| 1786 | - || get_user_u32(addrlen, vptr + 2 * n)) | 1812 | + || get_user_ual(addrlen, vptr + 2 * n)) |
| 1787 | return -TARGET_EFAULT; | 1813 | return -TARGET_EFAULT; |
| 1788 | 1814 | ||
| 1789 | ret = do_connect(sockfd, target_addr, addrlen); | 1815 | ret = do_connect(sockfd, target_addr, addrlen); |
| @@ -1791,10 +1817,10 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1791,10 +1817,10 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1791 | break; | 1817 | break; |
| 1792 | case SOCKOP_listen: | 1818 | case SOCKOP_listen: |
| 1793 | { | 1819 | { |
| 1794 | - int sockfd, backlog; | 1820 | + abi_ulong sockfd, backlog; |
| 1795 | 1821 | ||
| 1796 | - if (get_user_s32(sockfd, vptr) | ||
| 1797 | - || get_user_s32(backlog, vptr + n)) | 1822 | + if (get_user_ual(sockfd, vptr) |
| 1823 | + || get_user_ual(backlog, vptr + n)) | ||
| 1798 | return -TARGET_EFAULT; | 1824 | return -TARGET_EFAULT; |
| 1799 | 1825 | ||
| 1800 | ret = get_errno(listen(sockfd, backlog)); | 1826 | ret = get_errno(listen(sockfd, backlog)); |
| @@ -1802,12 +1828,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1802,12 +1828,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1802 | break; | 1828 | break; |
| 1803 | case SOCKOP_accept: | 1829 | case SOCKOP_accept: |
| 1804 | { | 1830 | { |
| 1805 | - int sockfd; | 1831 | + abi_ulong sockfd; |
| 1806 | abi_ulong target_addr, target_addrlen; | 1832 | abi_ulong target_addr, target_addrlen; |
| 1807 | 1833 | ||
| 1808 | - if (get_user_s32(sockfd, vptr) | 1834 | + if (get_user_ual(sockfd, vptr) |
| 1809 | || get_user_ual(target_addr, vptr + n) | 1835 | || get_user_ual(target_addr, vptr + n) |
| 1810 | - || get_user_u32(target_addrlen, vptr + 2 * n)) | 1836 | + || get_user_ual(target_addrlen, vptr + 2 * n)) |
| 1811 | return -TARGET_EFAULT; | 1837 | return -TARGET_EFAULT; |
| 1812 | 1838 | ||
| 1813 | ret = do_accept(sockfd, target_addr, target_addrlen); | 1839 | ret = do_accept(sockfd, target_addr, target_addrlen); |
| @@ -1815,12 +1841,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1815,12 +1841,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1815 | break; | 1841 | break; |
| 1816 | case SOCKOP_getsockname: | 1842 | case SOCKOP_getsockname: |
| 1817 | { | 1843 | { |
| 1818 | - int sockfd; | 1844 | + abi_ulong sockfd; |
| 1819 | abi_ulong target_addr, target_addrlen; | 1845 | abi_ulong target_addr, target_addrlen; |
| 1820 | 1846 | ||
| 1821 | - if (get_user_s32(sockfd, vptr) | 1847 | + if (get_user_ual(sockfd, vptr) |
| 1822 | || get_user_ual(target_addr, vptr + n) | 1848 | || get_user_ual(target_addr, vptr + n) |
| 1823 | - || get_user_u32(target_addrlen, vptr + 2 * n)) | 1849 | + || get_user_ual(target_addrlen, vptr + 2 * n)) |
| 1824 | return -TARGET_EFAULT; | 1850 | return -TARGET_EFAULT; |
| 1825 | 1851 | ||
| 1826 | ret = do_getsockname(sockfd, target_addr, target_addrlen); | 1852 | ret = do_getsockname(sockfd, target_addr, target_addrlen); |
| @@ -1828,12 +1854,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1828,12 +1854,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1828 | break; | 1854 | break; |
| 1829 | case SOCKOP_getpeername: | 1855 | case SOCKOP_getpeername: |
| 1830 | { | 1856 | { |
| 1831 | - int sockfd; | 1857 | + abi_ulong sockfd; |
| 1832 | abi_ulong target_addr, target_addrlen; | 1858 | abi_ulong target_addr, target_addrlen; |
| 1833 | 1859 | ||
| 1834 | - if (get_user_s32(sockfd, vptr) | 1860 | + if (get_user_ual(sockfd, vptr) |
| 1835 | || get_user_ual(target_addr, vptr + n) | 1861 | || get_user_ual(target_addr, vptr + n) |
| 1836 | - || get_user_u32(target_addrlen, vptr + 2 * n)) | 1862 | + || get_user_ual(target_addrlen, vptr + 2 * n)) |
| 1837 | return -TARGET_EFAULT; | 1863 | return -TARGET_EFAULT; |
| 1838 | 1864 | ||
| 1839 | ret = do_getpeername(sockfd, target_addr, target_addrlen); | 1865 | ret = do_getpeername(sockfd, target_addr, target_addrlen); |
| @@ -1841,12 +1867,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1841,12 +1867,12 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1841 | break; | 1867 | break; |
| 1842 | case SOCKOP_socketpair: | 1868 | case SOCKOP_socketpair: |
| 1843 | { | 1869 | { |
| 1844 | - int domain, type, protocol; | 1870 | + abi_ulong domain, type, protocol; |
| 1845 | abi_ulong tab; | 1871 | abi_ulong tab; |
| 1846 | 1872 | ||
| 1847 | - if (get_user_s32(domain, vptr) | ||
| 1848 | - || get_user_s32(type, vptr + n) | ||
| 1849 | - || 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) | ||
| 1850 | || get_user_ual(tab, vptr + 3 * n)) | 1876 | || get_user_ual(tab, vptr + 3 * n)) |
| 1851 | return -TARGET_EFAULT; | 1877 | return -TARGET_EFAULT; |
| 1852 | 1878 | ||
| @@ -1855,15 +1881,15 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1855,15 +1881,15 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1855 | break; | 1881 | break; |
| 1856 | case SOCKOP_send: | 1882 | case SOCKOP_send: |
| 1857 | { | 1883 | { |
| 1858 | - int sockfd; | 1884 | + abi_ulong sockfd; |
| 1859 | abi_ulong msg; | 1885 | abi_ulong msg; |
| 1860 | size_t len; | 1886 | size_t len; |
| 1861 | - int flags; | 1887 | + abi_ulong flags; |
| 1862 | 1888 | ||
| 1863 | - if (get_user_s32(sockfd, vptr) | 1889 | + if (get_user_ual(sockfd, vptr) |
| 1864 | || get_user_ual(msg, vptr + n) | 1890 | || get_user_ual(msg, vptr + n) |
| 1865 | || get_user_ual(len, vptr + 2 * n) | 1891 | || get_user_ual(len, vptr + 2 * n) |
| 1866 | - || get_user_s32(flags, vptr + 3 * n)) | 1892 | + || get_user_ual(flags, vptr + 3 * n)) |
| 1867 | return -TARGET_EFAULT; | 1893 | return -TARGET_EFAULT; |
| 1868 | 1894 | ||
| 1869 | ret = do_sendto(sockfd, msg, len, flags, 0, 0); | 1895 | ret = do_sendto(sockfd, msg, len, flags, 0, 0); |
| @@ -1871,15 +1897,15 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1871,15 +1897,15 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1871 | break; | 1897 | break; |
| 1872 | case SOCKOP_recv: | 1898 | case SOCKOP_recv: |
| 1873 | { | 1899 | { |
| 1874 | - int sockfd; | 1900 | + abi_ulong sockfd; |
| 1875 | abi_ulong msg; | 1901 | abi_ulong msg; |
| 1876 | size_t len; | 1902 | size_t len; |
| 1877 | - int flags; | 1903 | + abi_ulong flags; |
| 1878 | 1904 | ||
| 1879 | - if (get_user_s32(sockfd, vptr) | 1905 | + if (get_user_ual(sockfd, vptr) |
| 1880 | || get_user_ual(msg, vptr + n) | 1906 | || get_user_ual(msg, vptr + n) |
| 1881 | || get_user_ual(len, vptr + 2 * n) | 1907 | || get_user_ual(len, vptr + 2 * n) |
| 1882 | - || get_user_s32(flags, vptr + 3 * n)) | 1908 | + || get_user_ual(flags, vptr + 3 * n)) |
| 1883 | return -TARGET_EFAULT; | 1909 | return -TARGET_EFAULT; |
| 1884 | 1910 | ||
| 1885 | ret = do_recvfrom(sockfd, msg, len, flags, 0, 0); | 1911 | ret = do_recvfrom(sockfd, msg, len, flags, 0, 0); |
| @@ -1887,19 +1913,19 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1887,19 +1913,19 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1887 | break; | 1913 | break; |
| 1888 | case SOCKOP_sendto: | 1914 | case SOCKOP_sendto: |
| 1889 | { | 1915 | { |
| 1890 | - int sockfd; | 1916 | + abi_ulong sockfd; |
| 1891 | abi_ulong msg; | 1917 | abi_ulong msg; |
| 1892 | size_t len; | 1918 | size_t len; |
| 1893 | - int flags; | 1919 | + abi_ulong flags; |
| 1894 | abi_ulong addr; | 1920 | abi_ulong addr; |
| 1895 | socklen_t addrlen; | 1921 | socklen_t addrlen; |
| 1896 | 1922 | ||
| 1897 | - if (get_user_s32(sockfd, vptr) | 1923 | + if (get_user_ual(sockfd, vptr) |
| 1898 | || get_user_ual(msg, vptr + n) | 1924 | || get_user_ual(msg, vptr + n) |
| 1899 | || get_user_ual(len, vptr + 2 * n) | 1925 | || get_user_ual(len, vptr + 2 * n) |
| 1900 | - || get_user_s32(flags, vptr + 3 * n) | 1926 | + || get_user_ual(flags, vptr + 3 * n) |
| 1901 | || get_user_ual(addr, vptr + 4 * n) | 1927 | || get_user_ual(addr, vptr + 4 * n) |
| 1902 | - || get_user_u32(addrlen, vptr + 5 * n)) | 1928 | + || get_user_ual(addrlen, vptr + 5 * n)) |
| 1903 | return -TARGET_EFAULT; | 1929 | return -TARGET_EFAULT; |
| 1904 | 1930 | ||
| 1905 | ret = do_sendto(sockfd, msg, len, flags, addr, addrlen); | 1931 | ret = do_sendto(sockfd, msg, len, flags, addr, addrlen); |
| @@ -1907,19 +1933,19 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1907,19 +1933,19 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1907 | break; | 1933 | break; |
| 1908 | case SOCKOP_recvfrom: | 1934 | case SOCKOP_recvfrom: |
| 1909 | { | 1935 | { |
| 1910 | - int sockfd; | 1936 | + abi_ulong sockfd; |
| 1911 | abi_ulong msg; | 1937 | abi_ulong msg; |
| 1912 | size_t len; | 1938 | size_t len; |
| 1913 | - int flags; | 1939 | + abi_ulong flags; |
| 1914 | abi_ulong addr; | 1940 | abi_ulong addr; |
| 1915 | socklen_t addrlen; | 1941 | socklen_t addrlen; |
| 1916 | 1942 | ||
| 1917 | - if (get_user_s32(sockfd, vptr) | 1943 | + if (get_user_ual(sockfd, vptr) |
| 1918 | || get_user_ual(msg, vptr + n) | 1944 | || get_user_ual(msg, vptr + n) |
| 1919 | || get_user_ual(len, vptr + 2 * n) | 1945 | || get_user_ual(len, vptr + 2 * n) |
| 1920 | - || get_user_s32(flags, vptr + 3 * n) | 1946 | + || get_user_ual(flags, vptr + 3 * n) |
| 1921 | || get_user_ual(addr, vptr + 4 * n) | 1947 | || get_user_ual(addr, vptr + 4 * n) |
| 1922 | - || get_user_u32(addrlen, vptr + 5 * n)) | 1948 | + || get_user_ual(addrlen, vptr + 5 * n)) |
| 1923 | return -TARGET_EFAULT; | 1949 | return -TARGET_EFAULT; |
| 1924 | 1950 | ||
| 1925 | ret = do_recvfrom(sockfd, msg, len, flags, addr, addrlen); | 1951 | ret = do_recvfrom(sockfd, msg, len, flags, addr, addrlen); |
| @@ -1927,10 +1953,10 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1927,10 +1953,10 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1927 | break; | 1953 | break; |
| 1928 | case SOCKOP_shutdown: | 1954 | case SOCKOP_shutdown: |
| 1929 | { | 1955 | { |
| 1930 | - int sockfd, how; | 1956 | + abi_ulong sockfd, how; |
| 1931 | 1957 | ||
| 1932 | - if (get_user_s32(sockfd, vptr) | ||
| 1933 | - || get_user_s32(how, vptr + n)) | 1958 | + if (get_user_ual(sockfd, vptr) |
| 1959 | + || get_user_ual(how, vptr + n)) | ||
| 1934 | return -TARGET_EFAULT; | 1960 | return -TARGET_EFAULT; |
| 1935 | 1961 | ||
| 1936 | ret = get_errno(shutdown(sockfd, how)); | 1962 | ret = get_errno(shutdown(sockfd, how)); |
| @@ -1939,13 +1965,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1939,13 +1965,13 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1939 | case SOCKOP_sendmsg: | 1965 | case SOCKOP_sendmsg: |
| 1940 | case SOCKOP_recvmsg: | 1966 | case SOCKOP_recvmsg: |
| 1941 | { | 1967 | { |
| 1942 | - int fd; | 1968 | + abi_ulong fd; |
| 1943 | abi_ulong target_msg; | 1969 | abi_ulong target_msg; |
| 1944 | - int flags; | 1970 | + abi_ulong flags; |
| 1945 | 1971 | ||
| 1946 | - if (get_user_s32(fd, vptr) | 1972 | + if (get_user_ual(fd, vptr) |
| 1947 | || get_user_ual(target_msg, vptr + n) | 1973 | || get_user_ual(target_msg, vptr + n) |
| 1948 | - || get_user_s32(flags, vptr + 2 * n)) | 1974 | + || get_user_ual(flags, vptr + 2 * n)) |
| 1949 | return -TARGET_EFAULT; | 1975 | return -TARGET_EFAULT; |
| 1950 | 1976 | ||
| 1951 | ret = do_sendrecvmsg(fd, target_msg, flags, | 1977 | ret = do_sendrecvmsg(fd, target_msg, flags, |
| @@ -1954,17 +1980,17 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1954,17 +1980,17 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1954 | break; | 1980 | break; |
| 1955 | case SOCKOP_setsockopt: | 1981 | case SOCKOP_setsockopt: |
| 1956 | { | 1982 | { |
| 1957 | - int sockfd; | ||
| 1958 | - int level; | ||
| 1959 | - int optname; | 1983 | + abi_ulong sockfd; |
| 1984 | + abi_ulong level; | ||
| 1985 | + abi_ulong optname; | ||
| 1960 | abi_ulong optval; | 1986 | abi_ulong optval; |
| 1961 | socklen_t optlen; | 1987 | socklen_t optlen; |
| 1962 | 1988 | ||
| 1963 | - if (get_user_s32(sockfd, vptr) | ||
| 1964 | - || get_user_s32(level, vptr + n) | ||
| 1965 | - || 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) | ||
| 1966 | || get_user_ual(optval, vptr + 3 * n) | 1992 | || get_user_ual(optval, vptr + 3 * n) |
| 1967 | - || get_user_u32(optlen, vptr + 4 * n)) | 1993 | + || get_user_ual(optlen, vptr + 4 * n)) |
| 1968 | return -TARGET_EFAULT; | 1994 | return -TARGET_EFAULT; |
| 1969 | 1995 | ||
| 1970 | ret = do_setsockopt(sockfd, level, optname, optval, optlen); | 1996 | ret = do_setsockopt(sockfd, level, optname, optval, optlen); |
| @@ -1972,17 +1998,17 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | @@ -1972,17 +1998,17 @@ static abi_long do_socketcall(int num, abi_ulong vptr) | ||
| 1972 | break; | 1998 | break; |
| 1973 | case SOCKOP_getsockopt: | 1999 | case SOCKOP_getsockopt: |
| 1974 | { | 2000 | { |
| 1975 | - int sockfd; | ||
| 1976 | - int level; | ||
| 1977 | - int optname; | 2001 | + abi_ulong sockfd; |
| 2002 | + abi_ulong level; | ||
| 2003 | + abi_ulong optname; | ||
| 1978 | abi_ulong optval; | 2004 | abi_ulong optval; |
| 1979 | socklen_t optlen; | 2005 | socklen_t optlen; |
| 1980 | 2006 | ||
| 1981 | - if (get_user_s32(sockfd, vptr) | ||
| 1982 | - || get_user_s32(level, vptr + n) | ||
| 1983 | - || 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) | ||
| 1984 | || get_user_ual(optval, vptr + 3 * n) | 2010 | || get_user_ual(optval, vptr + 3 * n) |
| 1985 | - || get_user_u32(optlen, vptr + 4 * n)) | 2011 | + || get_user_ual(optlen, vptr + 4 * n)) |
| 1986 | return -TARGET_EFAULT; | 2012 | return -TARGET_EFAULT; |
| 1987 | 2013 | ||
| 1988 | ret = do_getsockopt(sockfd, level, optname, optval, optlen); | 2014 | ret = do_getsockopt(sockfd, level, optname, optval, optlen); |
| @@ -2215,7 +2241,7 @@ static inline abi_long do_semctl(int semid, int semnum, int cmd, | @@ -2215,7 +2241,7 @@ static inline abi_long do_semctl(int semid, int semnum, int cmd, | ||
| 2215 | { | 2241 | { |
| 2216 | union semun arg; | 2242 | union semun arg; |
| 2217 | struct semid_ds dsarg; | 2243 | struct semid_ds dsarg; |
| 2218 | - unsigned short *array; | 2244 | + unsigned short *array = NULL; |
| 2219 | struct seminfo seminfo; | 2245 | struct seminfo seminfo; |
| 2220 | abi_long ret = -TARGET_EINVAL; | 2246 | abi_long ret = -TARGET_EINVAL; |
| 2221 | abi_long err; | 2247 | abi_long err; |
| @@ -4529,7 +4555,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | @@ -4529,7 +4555,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | ||
| 4529 | case TARGET_NR_access: | 4555 | case TARGET_NR_access: |
| 4530 | if (!(p = lock_user_string(arg1))) | 4556 | if (!(p = lock_user_string(arg1))) |
| 4531 | goto efault; | 4557 | goto efault; |
| 4532 | - ret = get_errno(access(p, arg2)); | 4558 | + ret = get_errno(access(path(p), arg2)); |
| 4533 | unlock_user(p, arg1, 0); | 4559 | unlock_user(p, arg1, 0); |
| 4534 | break; | 4560 | break; |
| 4535 | #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat) | 4561 | #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat) |
| @@ -5021,8 +5047,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | @@ -5021,8 +5047,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, | ||
| 5021 | if (!is_error(ret)) { | 5047 | if (!is_error(ret)) { |
| 5022 | if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0)) | 5048 | if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0)) |
| 5023 | goto efault; | 5049 | goto efault; |
| 5024 | - rlim.rlim_cur = tswapl(target_rlim->rlim_cur); | ||
| 5025 | - rlim.rlim_max = tswapl(target_rlim->rlim_max); | 5050 | + target_rlim->rlim_cur = tswapl(rlim.rlim_cur); |
| 5051 | + target_rlim->rlim_max = tswapl(rlim.rlim_max); | ||
| 5026 | unlock_user_struct(target_rlim, arg2, 1); | 5052 | unlock_user_struct(target_rlim, arg2, 1); |
| 5027 | } | 5053 | } |
| 5028 | } | 5054 | } |