MFD_EXEC is unknown in older Ubuntu linux
modified: stub/src/include/linux.h modified: stub/src/upxfd_android.c
This commit is contained in:
@@ -568,7 +568,7 @@ off_t lseek(int fd, off_t offset, int whence);
|
|||||||
int memfd_create(char const *, unsigned);
|
int memfd_create(char const *, unsigned);
|
||||||
int munmap(void *, size_t);
|
int munmap(void *, size_t);
|
||||||
int mprotect(void const *, size_t, int);
|
int mprotect(void const *, size_t, int);
|
||||||
int open(char const *, unsigned, unsigned);
|
int open(char const *, int, int);
|
||||||
int openat(int fd, char const *, unsigned, unsigned);
|
int openat(int fd, char const *, unsigned, unsigned);
|
||||||
ssize_t read(int, void *, size_t);
|
ssize_t read(int, void *, size_t);
|
||||||
int unlink(char const *);
|
int unlink(char const *);
|
||||||
|
|||||||
@@ -134,11 +134,13 @@ struct stat { // __NR_stat = 106 + NR_SYSCALL_BASE
|
|||||||
#define NO_WANT_OPEN 1
|
#define NO_WANT_OPEN 1
|
||||||
#define NO_WANT_READ 1
|
#define NO_WANT_READ 1
|
||||||
#include "include/linux.h" // syscalls; i386 inlines via "int 0x80"
|
#include "include/linux.h" // syscalls; i386 inlines via "int 0x80"
|
||||||
|
extern int open(char const *, int, int);
|
||||||
|
|
||||||
extern int fstatat(int dirfd, const char *restrict pathname,
|
extern int fstatat(int dirfd, const char *restrict pathname,
|
||||||
struct stat *restrict statbuf, int flags);
|
struct stat *restrict statbuf, int flags);
|
||||||
|
|
||||||
#define ENOENT 2 /* no such name */
|
#define ENOENT 2 /* no such name */
|
||||||
|
#define EINVAL 22 /* invalid arguemnt */
|
||||||
#define ENOSPC 28 /* no space left on device */
|
#define ENOSPC 28 /* no space left on device */
|
||||||
#define ENOSYS 38 /* no such system call */
|
#define ENOSYS 38 /* no such system call */
|
||||||
|
|
||||||
@@ -272,6 +274,10 @@ static int strncmplc(char const *s1, char const *s2, unsigned n)
|
|||||||
#define ANDROID_TEST 0
|
#define ANDROID_TEST 0
|
||||||
|
|
||||||
#define MFD_EXEC 0x10
|
#define MFD_EXEC 0x10
|
||||||
|
//#define O_RDWR 2
|
||||||
|
#define O_DIRECTORY 0200000 /* 0x010000 */
|
||||||
|
#define O_TMPFILE 020000000 /* 0x400000 */
|
||||||
|
|
||||||
extern int memfd_create(char const *name, unsigned flags);
|
extern int memfd_create(char const *name, unsigned flags);
|
||||||
extern int ftruncate(int fd, size_t length);
|
extern int ftruncate(int fd, size_t length);
|
||||||
extern ssize_t write(int fd, void const *buf, size_t length);
|
extern ssize_t write(int fd, void const *buf, size_t length);
|
||||||
@@ -287,7 +293,20 @@ unsigned long upx_mmap_and_fd( // returns (mapped_addr | (1+ fd))
|
|||||||
|
|
||||||
unsigned long addr = 0; // for result
|
unsigned long addr = 0; // for result
|
||||||
// Early 32-bit Android did not implement memfd_create
|
// Early 32-bit Android did not implement memfd_create
|
||||||
int fd = (ANDROID_TEST ? -ENOSYS : memfd_create(addr_string("upx"), MFD_EXEC));
|
int fd = -ENOSYS;
|
||||||
|
if (!ANDROID_TEST) {
|
||||||
|
char const *name = addr_string("upx");
|
||||||
|
fd = memfd_create(name, MFD_EXEC);
|
||||||
|
if (-EINVAL == fd) { // MFD_EXEC unknown to ubuntu-20.04
|
||||||
|
fd = memfd_create(name, 0); // try again
|
||||||
|
}
|
||||||
|
if (fd < 0) { // last chance for Linux
|
||||||
|
fd = open(addr_string("/dev/shm"), O_RDWR | O_DIRECTORY | O_TMPFILE, 0700);
|
||||||
|
if (fd < 0) {
|
||||||
|
my_bkpt(addr_string("memfd_create"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if ANDROID_FRIEND //{
|
#if ANDROID_FRIEND //{
|
||||||
// Varying __NR_ftruncate on Android can hurt even if memfd_create() succeeds.
|
// Varying __NR_ftruncate on Android can hurt even if memfd_create() succeeds.
|
||||||
|
|||||||
Reference in New Issue
Block a user