On Thu, Jan 30, 2025 at 04:47:00PM +0100, Jens Remus wrote:
> On 22.01.2025 03:31, Josh Poimboeuf wrote:
> > +struct sframe_fre {
> > +   unsigned int    size;
> > +   s32             ip_off;
> 
> The IP offset (from function start) in the SFrame V2 FDE is unsigned:
> 
> u32 ip_off;

Indeed.

> > +#define __UNSAFE_GET_USER_INC(to, from, type, label)                       
> > \
> > +({                                                                 \
> > +   type __to;                                                      \
> > +   unsafe_get_user(__to, (type __user *)from, label);              \
> > +   from += sizeof(__to);                                           \
> > +   to = (typeof(to))__to;                                                  
> > \
> > +})
> > +
> > +#define UNSAFE_GET_USER_INC(to, from, size, label)                 \
> > +({                                                                 \
> > +   switch (size) {                                                 \
> > +   case 1:                                                         \
> > +           __UNSAFE_GET_USER_INC(to, from, u8, label);             \
> > +           break;                                                  \
> > +   case 2:                                                         \
> > +           __UNSAFE_GET_USER_INC(to, from, u16, label);            \
> > +           break;                                                  \
> > +   case 4:                                                         \
> > +           __UNSAFE_GET_USER_INC(to, from, u32, label);            \
> > +           break;                                                  \
> > +   default:                                                        \
> > +           return -EFAULT;                                         \
> > +   }                                                               \
> > +})
> 
> This does not work for the signed SFrame fields, such as the FRE CFA,
> RA, and FP offsets, as it does not perform the required sign extension.
> One option would be to rename to UNSAFE_GET_USER_UNSIGNED_INC() and
> re-introduce UNSAFE_GET_USER_SIGNED_INC() using s8, s16, and s32.

See the following line in __UNSAFE_GET_USER_INC():

        to = (typeof(to))__to;

Does that not do the sign extension?

-- 
Josh

Reply via email to