Skip to content

Commit f3ae6e7

Browse files
a part written privately: a private mapping with writing and without execution (KAL_EXEC_MAP_WRITE)
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
1 parent d4209ad commit f3ae6e7

1 file changed

Lines changed: 6 additions & 2 deletions

File tree

‎src/exec.cpp‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,15 +243,19 @@ int kal_exec_map_part(void* region, kal_uintptr offset, kal_uintptr size, kal_fi
243243
const int fd = okm::unpack(f.h);
244244
if (region == nullptr || size == 0 || fd < 0 || (offset & (g - 1)) != 0 || (size & (g - 1)) != 0
245245
|| (reinterpret_cast<okm_uptr>(region) & (g - 1)) != 0 || at % KAL_MAP_ALIGNMENT != 0
246-
|| (how & ~(KAL_EXEC_MAP_EXECUTE | KAL_EXEC_MAP_PREFETCH | KAL_EXEC_MAP_BTI)) != 0)
246+
|| (how & ~(KAL_EXEC_MAP_EXECUTE | KAL_EXEC_MAP_PREFETCH | KAL_EXEC_MAP_BTI | KAL_EXEC_MAP_WRITE)) != 0
247+
|| ((how & KAL_EXEC_MAP_WRITE) && (how & KAL_EXEC_MAP_EXECUTE)))
247248
return kal_err_invalid;
248249
okm::kstat64 st{};
249250
const okm_long s = okm::sys(okm::nr_fstat64, fd, reinterpret_cast<okm_long>(&st));
250251
if (okm::failed(s)) return okm::translate(s);
251252
if ((okm::stat_mode(st) & okm::s_ifmt) != okm::s_ifreg) return kal_err_not_supported;
252253
const kal_u64 length = st.size > 0 ? static_cast<kal_u64>(st.size) : 0;
253254
if (at > length || static_cast<kal_u64>(size) > length - at) return kal_err_invalid;
254-
const okm_long prot = okm::prot_read | ((how & KAL_EXEC_MAP_EXECUTE) ? okm::prot_exec : 0);
255+
// WRITTEN PRIVATELY (0.23): a private mapping, so a page written is the
256+
// program's own copy.
257+
const okm_long prot = okm::prot_read | ((how & KAL_EXEC_MAP_EXECUTE) ? okm::prot_exec : 0)
258+
| ((how & KAL_EXEC_MAP_WRITE) ? okm::prot_write : 0);
255259
const okm_long r = okm::sys(okm::nr_mmap,
256260
reinterpret_cast<okm_long>(static_cast<char*>(region) + offset),
257261
static_cast<okm_long>(size), prot, okm::map_private | okm::map_fixed, fd,

0 commit comments

Comments
 (0)