MCPcopy Create free account
hub / github.com/qilingframework/qiling / ql_syscall___sysctl

Function ql_syscall___sysctl

qiling/os/freebsd/syscall.py:64–103  ·  view source on GitHub ↗
(ql: Qiling, name: int, namelen: int, old: int, oldlenp: int, new_arg: int, newlen: int)

Source from the content-addressed store, hash-verified

62 return ql_syscall_newfstatat(ql, newfstatat_dirfd, newfstatat_path, newfstatat_buf_ptr, newfstatat_flag, *args, **kw)
63
64def 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

Callers

nothing calls this directly

Calls 3

read_ptrMethod · 0.80
read_cstringMethod · 0.80
write_ptrMethod · 0.80

Tested by

no test coverage detected