From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/7350 Path: news.gmane.org!not-for-mail From: Eugene Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH] MIPS big endian and *stat syscalls return value Date: Tue, 07 Apr 2015 12:25:45 +0300 Message-ID: <5523A299.5050209@ndmsystems.com> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------090809070909050905010600" X-Trace: ger.gmane.org 1428398776 14153 80.91.229.3 (7 Apr 2015 09:26:16 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 7 Apr 2015 09:26:16 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-7363-gllmg-musl=m.gmane.org@lists.openwall.com Tue Apr 07 11:26:10 2015 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1YfPlp-0008GC-9p for gllmg-musl@m.gmane.org; Tue, 07 Apr 2015 11:26:09 +0200 Original-Received: (qmail 13383 invoked by uid 550); 7 Apr 2015 09:26:04 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 13335 invoked from network); 7 Apr 2015 09:25:59 -0000 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :subject:content-type; bh=fP7RDyXO15IvRoEqno7QPXhsHKA+e2fSJTylo0w4D5E=; b=SKq8L5NV+728OcqZpudVe0hbP8FZkzK8tpUKp9rh2451ZUeRIOb1f4nA5UvuQdEnpl zxwcG9Kd2w4c5/tVVyKNK5/BSlDZQxSubLw1GUFO9zCRntSV9DjiaeJT8kCHdVciBd/j 95LfBCAvhcvnW49uUHBSB2HLNL34FGNIavFIq0G4bwEfDCFC+/m4m8F3OZ0RBjQv5Igh XIiKmU9XK9puIKCJDlPUCT24h7cV119RCl6ijIwxlPOkmz6AmZG6U0rKHojdpfJHk/Fq Q0uGm5zNWiXhlEKWiKiCUbiqRbILYHoOczDhP5uaR8JhHjMLkcA776//p4A5uwXArRPZ EvzA== X-Gm-Message-State: ALoCoQm8K1uz0K93RG5lOM97a80aM+PyMXRr2Ng+sb/GPvp/zhcYfcPpVwa7IoL4Hdp68uNfvYP3 X-Received: by 10.152.10.180 with SMTP id j20mr17539497lab.54.1428398747829; Tue, 07 Apr 2015 02:25:47 -0700 (PDT) User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 Xref: news.gmane.org gmane.linux.lib.musl.general:7350 Archived-At: This is a multi-part message in MIME format. --------------090809070909050905010600 Content-Type: multipart/alternative; boundary="------------000302020800010200090608" --------------000302020800010200090608 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Hello, Thank for a wonderful system library! Revision f61be1f875a2758509d6e9e2cf6f1d9603b28b65 has led to regression with system calls of family *stat on MIPS with big endian byte order. Upon successful completion, the system call returns the number from stat structure instead of 0. _Information: _Binutils 2.23.2/2.24 GCC 4.8.3/4.9.2 musl 1.1.5/1.1.8/HEAD _Code to reproduce problem:_ #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd, res = EXIT_FAILURE, ret; struct stat st; fd = open("/dev/urandom", O_RDONLY); if (fd < 0) { perror("open"); goto out; } ret = fstat(fd, &st); if (ret < 0) { perror("fstat"); goto out_close; } else { printf("ret = %d\n", ret); } res = EXIT_SUCCESS; out_close: close(fd); out: return res; } _Output:_ # test_fstat ret = 265 # strace -s 1024 test_fstat execve("/bin/test_fstat", ["test_fstat"], [/* 7 vars */]) = 0 set_thread_area(0x2ae00764) = 0 set_tid_address(0x2adf96b4) = 150 open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 3 fstat64(3, {st_mode=S_IFCHR|0600, st_rdev=makedev(1, 9), ...}) = 0 ioctl(1, TIOCNXCL, {B9600 opost isig icanon echo ...}) = 0 writev(1, [{"ret = 265", 9}, {"\n", 1}], 2ret = 265 ) = 10 close(3) = 0 exit_group(0) = ? +++ exited with 0 +++ The reason of the problem is that the function __stat_fix rewrites register $v0, which is not stored in the parent function. Disassembled code of fstat64 is attached. Patchis attachedalso. Sorry for my english. --------------000302020800010200090608 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit Hello,

Thank for a wonderful system library!

Revision f61be1f875a2758509d6e9e2cf6f1d9603b28b65 has led to regression with system calls of family *stat on MIPS with big endian byte order.
Upon successful completion, the system call returns the number from stat structure instead of 0.

Information:
Binutils 2.23.2/2.24
GCC 4.8.3/4.9.2
musl 1.1.5/1.1.8/HEAD

Code to reproduce problem:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
        int fd, res = EXIT_FAILURE, ret;
        struct stat st;
        fd = open("/dev/urandom", O_RDONLY);
        if (fd < 0) {
                perror("open");
                goto out;
        }
        ret = fstat(fd, &st);
        if (ret < 0) {
                perror("fstat");
                goto out_close;
        } else {
                printf("ret = %d\n", ret);
        }
        res = EXIT_SUCCESS;
out_close:
        close(fd);
out:
        return res;
}

Output:
# test_fstat 
ret = 265

# strace -s 1024 test_fstat
execve("/bin/test_fstat", ["test_fstat"], [/* 7 vars */]) = 0
set_thread_area(0x2ae00764)             = 0
set_tid_address(0x2adf96b4)             = 150
open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFCHR|0600, st_rdev=makedev(1, 9), ...}) = 0
ioctl(1, TIOCNXCL, {B9600 opost isig icanon echo ...}) = 0
writev(1, [{"ret = 265", 9}, {"\n", 1}], 2ret = 265
) = 10
close(3)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

The reason of the problem is that the function __stat_fix rewrites register $v0, which is not stored in the parent function.

Disassembled code of fstat64 is attached.
Patch is attached also.

Sorry for my english.
--------------000302020800010200090608-- --------------090809070909050905010600 Content-Type: application/octet-stream; name="dis.asm" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="dis.asm" X19zdGF0X2ZpeDoKCQlsdwkkdjAsIDAoJGEwKQoJCXN3CSQwLCAwKCRhMCkKCQlzdwkkdjAs IDQoJGEwKQoJCWx3CSR2MCwgMHgyOCgkYTApCgkJc3cJJDAsIDB4MjgoJGEwKQoJCWpyCSRy YQoJCXN3CSR2MCwgMHgyQygkYTApCiAjIEVuZCBvZiBmdW5jdGlvbiBfX3N0YXRfZml4CgoJ CS5nbG9ibCBmc3RhdDY0CSMgd2Vhawpmc3RhdDY0OgkJCQkgIyBEQVRBCVhSRUY6IC5nb3Q6 ZnN0YXQ2NF9wdHIZbwoKdmFyXzU2RTQJPSAtMHg1NkU0CnZhcl80MAkJPSAtMHg0MAp2YXJf MzgJCT0gLTB4MzgKdmFyXzE0CQk9IC0weDE0CnZhcl8xMAkJPSAtMHgxMAp2YXJfQwkJPSAt MHhDCnZhcl84CQk9IC04CnZhcl80CQk9IC00CgoJCWxhCSRncCwgbG9jXzc5MDlDCSAjIEFs dGVybmF0aXZlIG5hbWUgaXMgJ2ZzdGF0JwoJCWFkZHUJJGdwLCAkdDkKCQlhZGRpdQkkc3As IC0weDUwCgkJc3cJJGdwLCAweDUwK3Zhcl80MCgkc3ApCgkJc3cJJHMzLCAweDUwK3Zhcl84 KCRzcCkKCQltb3ZlCSRzMywgJGEwCgkJc3cJJHMwLCAweDUwK3Zhcl8xNCgkc3ApCgkJbW92 ZQkkczAsICRhMQoJCXN3CSRyYSwgMHg1MCt2YXJfNCgkc3ApCgkJc3cJJHMyLCAweDUwK3Zh cl9DKCRzcCkKCQlzdwkkczEsIDB4NTArdmFyXzEwKCRzcCkKCQlsaQkkdjAsIFNZU19mc3Rh dDY0CgkJc3lzY2FsbAkwCgkJYm5legkkYTMsIGZzdGF0NjRfZmFpbAoJCW5lZ3UJJGEyLCAk djAKCQlsdwkkdDksIC0weDc4MzgoJGdwKQoJCWFkZGl1CSR0OSwgMHhBOTZDCgkJamFscgkk dDkJCSAjIF9fc3RhdF9maXgKCQltb3ZlCSRhMCwgJGExCgkJbHcJJGdwLCAweDUwK3Zhcl80 MCgkc3ApCgkJbW92ZQkkYTIsICR2MAkgIyBjb3B5CSR2MCBmcm9tIF9fc3RhdF9maXghCgpm c3RhdDY0X2ZhaWw6CQkJCSAjIENPREUJWFJFRjogZnN0YXQ2NCszOBhqCgkJbGkJJHYxLCAt RUJBREYKCQliZXEJJGEyLCAkdjEsIGVycm5vX2ViYWRmCgkJbHcJJHMxLCAtMHg3RjUwKCRn cCkKCmxvY180QjlDODoJCQkJICMgQ09ERQlYUkVGOiBmc3RhdDY0Kzg0GWoKCQliCW91dAoJ CW1vdmUJJGEwLCAkYTIKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplcnJub19lYmFkZjoJ CQkJICMgQ09ERQlYUkVGOiBmc3RhdDY0KzVDGGoKCQltb3ZlCSRhMCwgJHMzCgkJbGkJJGEx LCAxCgkJbGkJJHYwLCBTWVNfZmNudGw2NAoJCXN5c2NhbGwJMAoJCW5lZ3UJJHYxLCAkdjAK CQltb3ZuCSR2MCwgJHYxLCAkYTMKCQlibHR6CSR2MCwgbG9jXzRCOUM4CgkJbHcJJHQ5LCAt MHg3QzFDKCRncCkKCQlhZGRpdQkkczIsICRzcCwgMHg1MCt2YXJfMzgKCQltb3ZlCSRhMSwg JHMzCgkJamFscgkkdDkKCQltb3ZlCSRhMCwgJHMyCgkJbW92ZQkkYTAsICRzMgoJCWx3CSRn cCwgMHg1MCt2YXJfNDAoJHNwKQoJCW1vdmUJJGExLCAkczAKCQlsaQkkdjAsIFNZU19zdGF0 NjQKCQlzeXNjYWxsCTAKCQlibmV6CSRhMywgc3RhdDY0X2ZhaWx1cmUKCQluZWd1CSR2MCwg JHYwCgkJbHcJJHQ5LCAtMHg3ODM4KCRncCkKCQlhZGRpdQkkdDksIDB4QTk2QwoJCWphbHIJ JHQ5CQkgIyBfX3N0YXRfZml4CgkJbW92ZQkkYTAsICRzMAoKc3RhdDY0X2ZhaWx1cmU6CQkJ CSAjIENPREUJWFJFRjogZnN0YXQ2NCtCMBhqCgkJbW92ZQkkYTAsICR2MAoKb3V0OgkJCQkJ ICMgQ09ERQlYUkVGOiBmc3RhdDY0OmxvY180QjlDOBhqCgkJbW92ZQkkdDksICRzMQoJCWph bHIJJHQ5CgkJbm9wCgkJbHcJJHJhLCAweDUwK3Zhcl80KCRzcCkKCQlsdwkkczMsIDB4NTAr dmFyXzgoJHNwKQoJCWx3CSRzMiwgMHg1MCt2YXJfQygkc3ApCgkJbHcJJHMxLCAweDUwK3Zh cl8xMCgkc3ApCgkJbHcJJHMwLCAweDUwK3Zhcl8xNCgkc3ApCgkJanIJJHJhCgkJYWRkaXUJ JHNwLCAweDUwCiAjIEVuZCBvZiBmdW5jdGlvbiBmc3RhdDY0Cg== --------------090809070909050905010600 Content-Type: text/x-patch; name="musl.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="musl.patch" diff --git a/arch/mips/syscall_arch.h b/arch/mips/syscall_arch.h index 0f89a1c..ac2487b 100644 --- a/arch/mips/syscall_arch.h +++ b/arch/mips/syscall_arch.h @@ -25,11 +25,13 @@ static inline long __syscall0(long n) { register long r7 __asm__("$7"); register long r2 __asm__("$2"); + __asm__ __volatile__ ( "addu $2,$0,%2 ; syscall" : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7) : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"); + return r7 ? -r2 : r2; } @@ -38,67 +40,84 @@ static inline long __syscall1(long n, long a) register long r4 __asm__("$4") = a; register long r7 __asm__("$7"); register long r2 __asm__("$2"); + __asm__ __volatile__ ( "addu $2,$0,%2 ; syscall" : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7), "r"(r4) : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"); + return r7 ? -r2 : r2; } static inline long __syscall2(long n, long a, long b) { + long t; register long r4 __asm__("$4") = a; register long r5 __asm__("$5") = b; register long r7 __asm__("$7"); register long r2 __asm__("$2"); + __asm__ __volatile__ ( "addu $2,$0,%2 ; syscall" : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5) : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"); + if (r7) return -r2; + t = r2; if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b); - return r2; + + return t; } static inline long __syscall3(long n, long a, long b, long c) { + long t; register long r4 __asm__("$4") = a; register long r5 __asm__("$5") = b; register long r6 __asm__("$6") = c; register long r7 __asm__("$7"); register long r2 __asm__("$2"); + __asm__ __volatile__ ( "addu $2,$0,%2 ; syscall" : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6) : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"); + if (r7) return -r2; + t = r2; if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b); - return r2; + + return t; } static inline long __syscall4(long n, long a, long b, long c, long d) { + long t; register long r4 __asm__("$4") = a; register long r5 __asm__("$5") = b; register long r6 __asm__("$6") = c; register long r7 __asm__("$7") = d; register long r2 __asm__("$2"); + __asm__ __volatile__ ( "addu $2,$0,%2 ; syscall" : "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6) : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$25", "hi", "lo", "memory"); + if (r7) return -r2; + t = r2; if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b); if (n == SYS_fstatat) __stat_fix(c); - return r2; + + return t; } #else --------------090809070909050905010600--