On Mon, Jun 23, 2025 at 12:51:23AM +0200, Samuel Thibault wrote:
> > +  err = vm_deallocate(mach_task_self(), mem, M_512M);
> > +  ASSERT_RET(err, "deallocation failed");
> 
> It would be also useful to check that trying to vm_protect the PROT_NONE
> into PROT_ALL fails when that comes above the limit.
> 

I'm tackling this test and I'm finding some trouble to implement it.
Currently, the patch performs the calculation of PROT_NONE size based
on the entry's max protection.

So, if I want to test for the promotion from PROT_NONE to PROT_ALL, I
need to set the current protection to NONE and the max protection to ALL.

This is a test in between or for preparation to the one you suggested
but that I thought it would work:

    printf("check that allocation promotions from PROT_NONE to PROT_ALL account 
for the limit\n");
    err = vm_map(mach_task_self(),
      &mem, M_512M, 0, 0, MACH_PORT_NULL, 0, 1,
      VM_PROT_NONE, VM_PROT_ALL, VM_INHERIT_COPY);
    ASSERT_RET(err, "allocation failed");
    /* test, again, that PROT_NONE maps do no decrease the limit */
    err = vm_allocate(mach_task_self(), &mem2, M_512M, TRUE);
    ASSERT_RET(err, "allocating memory below the limit must succeed");
      ^
      |
      +----- this fails because vm_map used up 512M which weren't accounted as
             NONE due to its max protection being VM_PROT_ALL

My guess is that I should account every page with current protection (instead of
max protection) set to VM_PROT_NONE and keep track of updates through 
vm_protect.

I don't remember why it was implemented against the max protection but switching
shouldn't be a problem.

Regards,
Diego

Reply via email to