Describe the bug
In version 1.4.6, ql_syscall_open is hard coded to always return EPERM (-1) for evey failed open attempt, preventing some libc implementations from traversing the LD_LIBRARY_PATH. Fixing this should also fix: #1403 and possibly #1412 ??
Sample Code
def __do_open(ql: Qiling, absvpath: str, flags: int, mode: int) -> int:
flags &= 0xffffffff
mode &= 0xffffffff
# look for the next available fd slot
idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] is None), -1)
if idx == -1:
return -EMFILE
if ql.arch.type is QL_ARCH.ARM and ql.os.type is not QL_OS.QNX:
mode = 0
# translate emulated os open flags into host os open flags
flags = ql_open_flag_mapping(ql, flags)
try:
ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file(absvpath, flags, mode)
except QlSyscallError:
return -1
return idx
def ql_syscall_open(ql: Qiling, filename: int, flags: int, mode: int):
vpath = ql.os.utils.read_cstring(filename)
absvpath = ql.os.path.virtual_abspath(vpath)
regreturn = __do_open(ql, absvpath, flags, mode)
ql.log.debug(f'open("{absvpath}", {flags:#x}, 0{mode:o}) = {regreturn}')
return regreturn
Expected behavior
Open should return actual open error code like before.
Proposed Change
Something like the following will work, or something similar from 1.4.5.
def __do_open(ql: Qiling, absvpath: str, flags: int, mode: int) -> int:
flags &= 0xffffffff
mode &= 0xffffffff
# look for the next available fd slot
idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] is None), -1)
if idx == -1:
return -EMFILE
if ql.arch.type is QL_ARCH.ARM and ql.os.type is not QL_OS.QNX:
mode = 0
# translate emulated os open flags into host os open flags
flags = ql_open_flag_mapping(ql, flags)
try:
ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file(absvpath, flags, mode)
except QlSyscallError as e:
return -e.errno
return idx
Describe the bug
In version 1.4.6,
ql_syscall_openis hard coded to always return EPERM (-1) for evey failed open attempt, preventing some libc implementations from traversing the LD_LIBRARY_PATH. Fixing this should also fix: #1403 and possibly #1412 ??Sample Code
Expected behavior
Open should return actual open error code like before.
Proposed Change
Something like the following will work, or something similar from 1.4.5.