kernel: all string parameters now take a corresponding length parameter

This commit is contained in:
2026-02-19 19:07:55 +00:00
parent 291a5f677e
commit 2f413c603d
5 changed files with 56 additions and 32 deletions

View File

@@ -70,15 +70,16 @@ enum vm_page_order vm_object_global_page_order(void)
struct vm_object *vm_object_create(
const char *name,
size_t len,
enum vm_prot prot)
size_t name_len,
size_t data_len,
vm_prot_t prot)
{
size_t page_bytes = VM_PAGE_SIZE;
uintptr_t page_mask = page_bytes - 1;
if (len & page_mask) {
len &= ~page_mask;
len += page_bytes;
if (data_len & page_mask) {
data_len &= ~page_mask;
data_len += page_bytes;
}
struct object *obj = object_create(&vm_object_type);
@@ -88,12 +89,13 @@ struct vm_object *vm_object_create(
struct vm_object *out = VM_OBJECT_CAST(obj);
out->vo_size = len;
out->vo_size = data_len;
out->vo_prot = prot;
if (name) {
strncpy(out->vo_name, name, sizeof out->vo_name);
out->vo_name[sizeof out->vo_name - 1] = '\0';
if (name && name_len) {
name_len = MIN(sizeof out->vo_name - 1, name_len);
memcpy(out->vo_name, name, name_len);
out->vo_name[name_len] = '\0';
}
return out;
@@ -101,11 +103,13 @@ struct vm_object *vm_object_create(
extern struct vm_object *vm_object_create_in_place(
const char *name,
size_t name_len,
phys_addr_t base,
size_t len,
enum vm_prot prot)
size_t data_len,
vm_prot_t prot)
{
struct vm_object *vmo = vm_object_create(name, len, prot);
struct vm_object *vmo
= vm_object_create(name, name_len, data_len, prot);
if (!vmo) {
return NULL;
}

View File

@@ -474,26 +474,36 @@ kern_status_t vm_region_type_init(void)
return object_type_register(&vm_region_type);
}
struct vm_region *vm_region_cast(struct object *obj)
{
return VM_REGION_CAST(obj);
}
kern_status_t vm_region_create(
struct vm_region *parent,
const char *name,
size_t name_len,
off_t offset,
size_t len,
enum vm_prot prot,
size_t region_len,
vm_prot_t prot,
struct vm_region **out)
{
if (!offset || !len) {
if (!offset || !region_len) {
return KERN_INVALID_ARGUMENT;
}
if (len & VM_PAGE_MASK) {
len &= ~VM_PAGE_MASK;
len += VM_PAGE_SIZE;
if (region_len & VM_PAGE_MASK) {
region_len &= ~VM_PAGE_MASK;
region_len += VM_PAGE_SIZE;
}
kern_status_t status = KERN_OK;
if (parent) {
status = region_validate_allocation(parent, prot, &offset, len);
status = region_validate_allocation(
parent,
prot,
&offset,
region_len);
}
if (status != KERN_OK) {
@@ -510,7 +520,13 @@ kern_status_t vm_region_create(
region->vr_prot = prot;
region->vr_entry.e_type = VM_REGION_ENTRY_REGION;
region->vr_entry.e_offset = offset;
region->vr_entry.e_size = len;
region->vr_entry.e_size = region_len;
#ifdef TRACE
tracek("creating sub-region at [%llx-%llx]",
offset,
offset + region_len);
#endif
if (parent) {
region->vr_entry.e_parent = &parent->vr_entry;
@@ -518,9 +534,10 @@ kern_status_t vm_region_create(
region_put_entry(parent, &region->vr_entry);
}
if (name) {
strncpy(region->vr_name, name, sizeof region->vr_name);
region->vr_name[sizeof region->vr_name - 1] = '\0';
if (name && name_len) {
name_len = MIN(sizeof region->vr_name - 1, name_len);
memcpy(region->vr_name, name, name_len);
region->vr_name[name_len] = '\0';
}
*out = region;