From: Po Lu Date: Tue, 2 May 2023 08:44:46 +0000 (+0800) Subject: Fix ps name in Android subprocesses X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f4512cca0b996e5343ebe57511f45a29f64c4a8e;p=emacs.git Fix ps name in Android subprocesses * exec/Makefile.in (.SUFFIXES): Include ., then `srcdir'. * exec/loader-aarch64.s (_start): * exec/loader-armeabi.s (_start): * exec/loader-mips64el.s (__start): * exec/loader-mipsel.s (__start): * exec/loader-x86.s (_start): * exec/loader-x86_64.s (_start): Get basename of opened exec file and make it the command name. Fix envp skipping on x86 and various leaks. --- diff --git a/exec/Makefile.in b/exec/Makefile.in index 365dc42e0b7..ae6bdf00415 100644 --- a/exec/Makefile.in +++ b/exec/Makefile.in @@ -81,7 +81,7 @@ Makefile: config.status Makefile.in .SUFFIXES: .c .s .c.o: - $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEPFLAGS) -I$(srcdir) -I. $< -o $@ + $(CC) -c $(CPPFLAGS) $(CFLAGS) $(DEPFLAGS) -I. -I$(srcdir) $< -o $@ .s.o: $(M4) $< > $(notdir $<).s $(AS) $(ASFLAGS) $(notdir $<).s -o $@ diff --git a/exec/loader-aarch64.s b/exec/loader-aarch64.s index 1b99d238b92..da8ec1f4977 100644 --- a/exec/loader-aarch64.s +++ b/exec/loader-aarch64.s @@ -92,14 +92,27 @@ _start: svc #0 // syscall cmp x0, #-1 // rc < 0? ble .perror + mov x19, x1 // x19 == x1 .nextc: ldrb w2, [x1], #1 // b = *x1++ + cmp w2, #47 // dir separator? + bne .nextc1 // not dir separator + mov x19, x1 // x19 = char past separator +.nextc1: cbnz w2, .nextc // b? add x1, x1, #7 // round up x1 and x20, x1, #-8 // mask for round, set x20 tst x11, #16 // primary fd? bne .secondary // secondary fd mov x29, x0 // primary fd + mov x8, #167 // SYS_prctl + mov x0, #15 // PR_SET_NAME + mov x1, x19 // basename + mov x2, #0 // arg2 + mov x3, #0 // arg3 + mov x4, #0 // arg4 + mov x5, #0 // arg5 + svc #0 // syscall b .next_action // next action .secondary: mov x28, x0 // secondary fd diff --git a/exec/loader-armeabi.s b/exec/loader-armeabi.s index 182ff11ec7a..32b2a5268d6 100644 --- a/exec/loader-armeabi.s +++ b/exec/loader-armeabi.s @@ -104,15 +104,27 @@ _start: cmp r0, #-1 @ r0 <= -1? ble .perror add r8, r8, #4 @ r8 = start of string + mov r1, r8 @ r1 = r8 .nextc: - ldrb r1, [r8], #1 @ b = *r0++ - cmp r1, #0 @ b? + ldrb r2, [r8], #1 @ b = *r0++ + cmp r2, #47 @ dir separator? + bne .nextc1 @ not dir separator + mov r1, r8 @ r1 = char past separator +.nextc1: + cmp r2, #0 @ b? bne .nextc @ next character add r8, r8, #3 @ round up r8 and r8, r8, #-4 @ mask for round, set r8 tst r11, #16 @ primary fd? bne .secondary @ secondary fd mov r10, r0 @ primary fd + mov r7, #172 @ SYS_prctl + mov r0, #15 @ PR_SET_NAME, r1 = name + mov r2, #0 @ arg2 + mov r3, #0 @ arg3 + mov r4, #0 @ arg4 + mov r5, #0 @ arg5 + swi #0 @ syscall b .next_action @ next action .secondary: mov r14, r0 @ secondary fd diff --git a/exec/loader-mips64el.s b/exec/loader-mips64el.s index 73dc8c63fe8..00a2765a9b6 100644 --- a/exec/loader-mips64el.s +++ b/exec/loader-mips64el.s @@ -123,10 +123,16 @@ dnl syscall # syscall bne $a3, $zero, .perror # perror nop # delay slot DADDI2( $s0, 8) # start of string + move $t3, $s0 # t3 = s0 .nextc: lb $t0, ($s0) # load byte DADDI2( $s0, 1) # s0++ - bne $t0, $zero, .nextc # next character? + li $t1, 47 # directory separator `/' + bne $t0, $t1, .nextc1 # is separator char? + nop # delay slot + move $t3, $s0 # t3 = char past separator +.nextc1: + bnez $t0, .nextc # next character? nop # delay slot DADDI2( $s0, 7) # adjust for round li $t2, -8 # t2 = -8 @@ -136,8 +142,19 @@ dnl syscall # syscall beqz $t0, .primary # primary fd? nop # delay slot DADDI2( $t1, 8) # address of secondary fd + sd $v0, ($t1) # store fd + j .next_action # next action + nop # delay slot .primary: sd $v0, ($t1) # store fd + li $v0, 5153 # SYS_prctl + li $a0, 15 # PR_SET_NAME + move $a1, $t3 # char past separator + move $a2, $zero # a2 + move $a3, $zero # a3 + move $a4, $zero # a4 + move $a5, $zero # a5 + syscall # syscall j .next_action # next action nop # delay slot .perror: diff --git a/exec/loader-mipsel.s b/exec/loader-mipsel.s index 2ad9d97dfed..8537a0d2fe2 100644 --- a/exec/loader-mipsel.s +++ b/exec/loader-mipsel.s @@ -24,10 +24,10 @@ include(`config-mips.m4') .section .text .global __start __start: -dnl li $v0, SYSCALL_nanosleep # SYS_nanosleep -dnl la $a0, .timespec # rqtp -dnl li $a1, 0 # rmtp -dnl syscall # syscall + li $v0, SYSCALL_nanosleep # SYS_nanosleep + la $a0, .timespec # rqtp + li $a1, 0 # rmtp + syscall # syscall lw $s6, ($sp) # original stack pointer addi $s0, $sp, 8 # start of load area addi $sp, -8 # primary fd, secondary fd @@ -121,10 +121,16 @@ RESTORE() # delay slot, restore sp syscall # syscall bne $a3, $zero, .perror # perror addi $s0, $s0, 4 # start of string, delay slot + move $t3, $s0 # t3 = char past separator .nextc: lb $t0, ($s0) # load byte addi $s0, $s0, 1 # s0++ - bne $t0, $zero, .nextc # next character? + li $t1, 47 # directory separator `/' + bne $t0, $t1, .nextc1 # is separator char? + nop # delay slot + move $t3, $s0 # t3 = char past separator +.nextc1: + bnez $t0, .nextc # next character? nop # delay slot addi $s0, $s0, 3 # adjust for round li $t2, -4 # t2 = -4 @@ -133,8 +139,17 @@ RESTORE() # delay slot, restore sp beqz $t0, .primary # primary fd? move $t0, $sp # address of primary fd, delay slot addi $t0, $t0, 4 # address of secondary fd + j .next_action # next action .primary: - sw $v0, ($t0) # store fd + sw $v0, ($t0) # store fd, delay slot + li $v0, SYSCALL_prctl # SYS_prctl + li $a0, 15 # PR_SET_NAME + move $a1, $t3 # name + move $a2, $zero # arg1 + move $a3, $zero # arg2 +SYSCALL(`$a2',`$a2',`$a2',`$a2') # syscall args + syscall # syscall +RESTORE() # restore sp j .next_action # next action nop # delay slot .perror: diff --git a/exec/loader-x86.s b/exec/loader-x86.s index ee69b26d78b..6329e7f33b1 100644 --- a/exec/loader-x86.s +++ b/exec/loader-x86.s @@ -21,10 +21,10 @@ CC along with GNU Emacs. If not, see . .section .text .global _start _start: - #movl $162, %eax CC SYS_nanosleep - #leal timespec, %ebx - #xorl %ecx, %ecx - #int $0x80 +dnl movl $162, %eax CC SYS_nanosleep +dnl leal timespec, %ebx +dnl xorl %ecx, %ecx +dnl int $0x80 leal 8(%esp), %ebp CC ebp = start of load area subl $8, %esp CC (%esp) = primary fd, 4(%esp) = secondary fd movl $-1, 4(%esp) @@ -102,10 +102,16 @@ _start: jle .perror movl %ebp, %esi CC (esi) = original action number popl %ebp CC ebp = start of string + movl %ebp, %ecx CC char past separator decl %ebp .nextc: incl %ebp - cmpb $0, (%ebp) CC *ebp == 0? + movb (%ebp), %dl CC dl = *ebp + cmpb $47, %dl CC dl == '\?'? + jne .nextc1 + leal 1(%ebp), %ecx CC ecx = char past separator +.nextc1: + cmpb $0, %dl CC dl == 0? jne .nextc addl $4, %ebp CC adjust past ebp prior to rounding andl $-4, %ebp CC round ebp up to the next long @@ -114,7 +120,16 @@ _start: movl %eax, 4(%esp) CC secondary fd = eax jmp .next_action .primary: - movl %eax, (%esp) CC primary fd = eax + pushl %ebp + xorl %esi, %esi CC arg3 + movl %eax, 4(%esp) CC primary fd = eax + xorl %edx, %edx CC arg2 + movl $15, %ebx CC PR_SET_NAME, arg1 = ecx + xorl %edi, %edi CC arg4 + movl $172, %eax CC SYS_prctl + xorl %ebp, %ebp CC arg5 + int $0x80 CC syscall + popl %ebp jmp .next_action .perror: movl %eax, %ebx @@ -127,7 +142,7 @@ _start: leal 8(%ecx, %esi, 4), %ecx CC ecx = start of environ .skip_environ: movl (%ecx), %esi CC envp[N] - subl $4, %ecx + addl $4, %ecx testl %esi, %esi CC envp[n] ? jnz .skip_environ CC otherwise, esi is now at the start of auxv .one_auxv: @@ -168,12 +183,12 @@ _start: jmp .one_auxv .cleanup: movl $6, %eax CC SYS_close - cmpl $1, -4(%esp) CC see if interpreter fd is set - jne .cleanup_1 - movl -4(%esp), %ebx + cmpl $-1, 4(%esp) CC see if interpreter fd is set + je .cleanup_1 + movl 4(%esp), %ebx int $0x80 -.cleanup_1: movl $6, %eax CC SYS_close +.cleanup_1: movl (%esp), %ebx int $0x80 .enter: diff --git a/exec/loader-x86_64.s b/exec/loader-x86_64.s index 07227d38396..acba609b202 100644 --- a/exec/loader-x86_64.s +++ b/exec/loader-x86_64.s @@ -21,10 +21,10 @@ CC along with GNU Emacs. If not, see . .section .text .global _start _start: - #movq $35, %rax CC SYS_nanosleep - #leaq timespec(%rip), %rdi - #xorq %rsi, %rsi - #syscall +dnl movq $35, %rax CC SYS_nanosleep +dnl leaq timespec(%rip), %rdi +dnl xorq %rsi, %rsi +dnl syscall popq %r13 CC original SP popq %r15 CC size of load area. movq $-1, %r12 CC r12 is the interpreter fd @@ -87,9 +87,16 @@ _start: jle .perror movq %rdi, %rsp CC rsp = start of string subq $1, %rsp + movq %rsp, %r14 CC r14 = start of string .nextc: addq $1, %rsp - cmpb $0, (%rsp) CC *rsp == 0? + movb (%rsp), %dil CC rdi = *rsp + cmpb $47, %dil CC *rsp == '/'? + jne .nextc1 + movq %rsp, %r14 CC r14 = rsp + addq $1, %r14 CC r14 = char past separator +.nextc1: + cmpb $0, %dil CC *rsp == 0? jne .nextc addq $8, %rsp CC adjust past rsp prior to rounding andq $-8, %rsp CC round rsp up to the next quad @@ -99,6 +106,14 @@ _start: jmp .next_action .primary: movq %rax, %rbx CC if not, move fd to rbx + movq $157, %rax CC SYS_prctl + movq $15, %rdi CC PR_SET_NAME + movq %r14, %rsi CC arg1 + xorq %rdx, %rdx CC arg2 + xorq %r10, %r10 CC arg3 + xorq %r8, %r8 CC arg4 + xorq %r9, %r9 CC arg5 + syscall jmp .next_action .perror: movq %rax, %r12 CC error code @@ -159,11 +174,11 @@ _start: .cleanup: movq $3, %rax CC SYS_close cmpq $-1, %r12 CC see if interpreter fd is set - jne .cleanup_1 + je .cleanup_1 movq %r12, %rdi syscall -.cleanup_1: movq $3, %rax CC SYS_close +.cleanup_1: movq %rbx, %rdi syscall .enter: