(ql: Qiling, name: int, namelen: int, old: int, oldlenp: int, new_arg: int, newlen: int)
| 62 | return ql_syscall_newfstatat(ql, newfstatat_dirfd, newfstatat_path, newfstatat_buf_ptr, newfstatat_flag, *args, **kw) |
| 63 | |
| 64 | def ql_syscall___sysctl(ql: Qiling, name: int, namelen: int, old: int, oldlenp: int, new_arg: int, newlen: int): |
| 65 | ql.log.debug("__sysctl(name: 0x%x, namelen: 0x%x, old: 0x%x, oldlenp: 0x%x, new: 0x%x, newlen: 0x%x)" % ( |
| 66 | name, namelen, old, oldlenp, new_arg, newlen |
| 67 | )) |
| 68 | |
| 69 | vecs = [ql.mem.read_ptr(name + i * 4, 4, signed=True) for i in range(namelen)] |
| 70 | |
| 71 | ql.log.debug(f"__sysctl vectors: {vecs}") |
| 72 | if vecs[0] == CTL_SYSCTL: |
| 73 | if vecs[1] == CTL_SYSCTL_NAME2OID: |
| 74 | # Write oid to old and oldlenp |
| 75 | sysctl_name = ql.os.utils.read_cstring(new_arg) |
| 76 | out_vecs = [] |
| 77 | out_len = 0 |
| 78 | |
| 79 | # TODO: Implement oid<-->name as many as possible from FreeBSD source. |
| 80 | # Search SYSCTL_ADD_NODE etc. |
| 81 | if sysctl_name == "hw.pagesizes": |
| 82 | out_vecs = [CTL_HW, HW_PAGESIZE] |
| 83 | out_len = 2 |
| 84 | else: |
| 85 | ql.log.warning("Unknown oid name!") |
| 86 | |
| 87 | for i, v in enumerate(out_vecs): |
| 88 | ql.mem.write_ptr(old + i * 4, v, 4, signed=True) |
| 89 | |
| 90 | ql.mem.write_ptr(oldlenp, out_len, 4, signed=True) |
| 91 | |
| 92 | return -ENOENT |
| 93 | |
| 94 | if vecs[0] == CTL_KERN: |
| 95 | if vecs[1] == KERN_OSRELDATE: |
| 96 | if old == 0 or oldlenp == 0: |
| 97 | return -1 |
| 98 | |
| 99 | # Ignore oldlenp check. |
| 100 | ql.mem.write_ptr(old, FREEBSD_OSRELDATE, 4, signed=True) |
| 101 | |
| 102 | return 0 |
| 103 | return 0 |
nothing calls this directly
no test coverage detected