mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-03-03 15:38:22 +00:00
Fix Redbean when file is read-only (#365)
This commit is contained in:
parent
22409b2b5e
commit
38112aeb20
2 changed files with 17 additions and 4 deletions
|
@ -41,6 +41,7 @@ OpenExecutable:
|
||||||
pushq MAP_PRIVATE(%rip) # -0x30(%rbp)
|
pushq MAP_PRIVATE(%rip) # -0x30(%rbp)
|
||||||
pushq MAP_FIXED(%rip) # -0x38(%rbp)
|
pushq MAP_FIXED(%rip) # -0x38(%rbp)
|
||||||
pushq __NR_mprotect(%rip) # -0x40(%rbp)
|
pushq __NR_mprotect(%rip) # -0x40(%rbp)
|
||||||
|
pushq O_RDONLY(%rip) # -0x48(%rbp)
|
||||||
push %rbx # code buffer
|
push %rbx # code buffer
|
||||||
push %r12 # data buffer
|
push %r12 # data buffer
|
||||||
push %r14 # filename
|
push %r14 # filename
|
||||||
|
@ -120,8 +121,20 @@ OpenExecutable:
|
||||||
mov -0x08(%rbp),%eax # __NR_open
|
mov -0x08(%rbp),%eax # __NR_open
|
||||||
mov %r14,%rdi
|
mov %r14,%rdi
|
||||||
mov -0x20(%rbp),%esi # O_RDWR
|
mov -0x20(%rbp),%esi # O_RDWR
|
||||||
syscall
|
clc # clear carry flag
|
||||||
mov %eax,%r15d
|
syscall
|
||||||
|
jc .Lohno # bsd error
|
||||||
|
cmp $-4095,%eax
|
||||||
|
jae .Lohno # linux error
|
||||||
|
jmp .Lok
|
||||||
|
|
||||||
|
// Open executable in read-only mode.
|
||||||
|
.Lohno: mov -0x08(%rbp),%eax # __NR_open
|
||||||
|
mov %r14,%rdi
|
||||||
|
mov -0x48(%rbp),%esi # O_RDONLY
|
||||||
|
syscall
|
||||||
|
|
||||||
|
.Lok: mov %eax,%r15d
|
||||||
|
|
||||||
// Map code segment.
|
// Map code segment.
|
||||||
mov -0x10(%rbp),%eax # __NR_mmap
|
mov -0x10(%rbp),%eax # __NR_mmap
|
||||||
|
|
|
@ -6884,8 +6884,8 @@ static void RestoreApe(void) {
|
||||||
if (endswith(zpath, ".com.dbg")) return;
|
if (endswith(zpath, ".com.dbg")) return;
|
||||||
if ((a = GetAssetZip("/.ape", 5)) && (p = LoadAsset(a, &n))) {
|
if ((a = GetAssetZip("/.ape", 5)) && (p = LoadAsset(a, &n))) {
|
||||||
close(zfd);
|
close(zfd);
|
||||||
zfd = OpenExecutable();
|
if ((zfd = OpenExecutable()) == -1 || write(zfd, p, n) == -1)
|
||||||
write(zfd, p, n);
|
WARNF("(srvr) can't restore .ape");
|
||||||
free(p);
|
free(p);
|
||||||
} else {
|
} else {
|
||||||
WARNF("(srvr) /.ape not found");
|
WARNF("(srvr) /.ape not found");
|
||||||
|
|
Loading…
Add table
Reference in a new issue