Send inn-workers mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        https://lists.isc.org/mailman/listinfo/inn-workers
or, via email, send a message with subject or body 'help' to
        [email protected]

You can reach the person managing the list at
        [email protected]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of inn-workers digest..."


Today's Topics:

   1. Re: Capability to integer casts on CheriBSD (Julien ?LIE)


----------------------------------------------------------------------

Message: 1
Date: Tue, 31 Oct 2023 23:01:01 +0100
From: Julien ?LIE <[email protected]>
To: [email protected]
Subject: Re: Capability to integer casts on CheriBSD
Message-ID: <[email protected]>
Content-Type: text/plain; charset=UTF-8; format=flowed

Hi Richard,

>> As for pointer-to-integer conversion, maybe casting to (uintptr_t) 
>> could be of help?? I've googled a bit and found out that it is in the 
>> C99 standard
>
> All the sizes are bounded by the size of whatever the containing memory 
> mapping is, which has to fit in a size_t since that's what the argument 
> to mmap() was when the mapping was created.
> 
> So I don't think uintptr_t will make much difference.

I've just tried:
- char *end = (char *) (((size_t) p + length + pagesize) & mask);
+ char *end = (char *) (((uintptr_t) p + length + pagesize) & mask);

and Clang no longer emits a warning.
size_t and uintptr_t are both of the same size.
Looking deeper, I've found this interesting document about porting C 
software to Morello (an implementation of the CHERI architecture):
     https://soft-dev.org/events/cheritech22/slides/Richardson.pdf

"""
CHERI C/C++ is very similar to ?normal? C/C++ with a few difference such as:
   ? On Morello, pointers require 16-byte alignment.
   ? (u)intptr_t is not the same type as (unsigned) long.
   ? Pointers created from a (non-uintptr_t) integer are not 
dereferenceable.
   ? Pointers are tightly bounded and cannot be used to access adjacent
objects.

In CHERI C/C++ unsigned long cannot store the capability metadata
   ? Casting from pointer to integer strips the capability metadata.
   ? Usually flagged by the compiler by emitting a warning when creating 
a pointer from an integer.

Casting via uintptr_t generally resolves this problem.

Truncating capability metadata can result in crashes if converted back 
to a pointer.
"""

Looks like just changing the (size_t) cast to (uintptr_t) does the job, 
and the code builds and works fine.  The relevant capability metadata 
for pointers is preserved in the uintptr_t datatype, so the 
pointer-to-integer conversion is fine, and so is afterwards the other 
way round of converting the computed integer value to a pointer.


Interestingly, the document also mentions the other problem mentioned 
earlier in this discussion (accessing p[-1] before the start of the 
string).  "CHERI sometimes detects out-of-bounds accesses that are not 
noticed otherwise [...] [especially] reading beyond bounded buffers 
derived from string literals."
So true!
I'll go on reading to understand a bit more that unusual architecture.



>>> ?? // Total length of pages
>>> ?? size_t total_length = start_offset + length + end_offset;
>>
>> I'm unsure total_length always has the right value.? If end_offset is 
>> 0, total_length should be pagesize I think.
> 
> Are you sure?
> 
> As a concrete example, suppose:
>  ? pagesize = 4096
>  ? p is at the start of a page
>  ? length = 8192
> Then:
>  ? start_offset = 0
>  ? start = p
>  ? end_offset = (0+8192)&4095 = 0
>  ? total_length = 0+8192+0 = 8192
> which is surely what we want.

Indeed, agreed.

-- 
Julien ?LIE

??Non omnia possumus omnes.?? (Virgile)


------------------------------

Subject: Digest Footer

_______________________________________________
inn-workers mailing list
[email protected]
https://lists.isc.org/mailman/listinfo/inn-workers


------------------------------

End of inn-workers Digest, Vol 155, Issue 1
*******************************************

Reply via email to