@@ -3017,19 +3017,32 @@ sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen)
3017
3017
if (valsize > len )
3018
3018
sopt -> sopt_valsize = valsize = len ;
3019
3019
3020
- if (sopt -> sopt_td != NULL ) {
3020
+ if (sopt -> sopt_td != NULL )
3021
+ return (copyin (sopt -> sopt_val , buf , valsize ));
3022
+
3023
+ bcopynocap ((__cheri_fromcap void * )sopt -> sopt_val , buf , valsize );
3024
+ return (0 );
3025
+ }
3026
+
3021
3027
#if __has_feature (capabilities )
3022
- if (sopt -> sopt_dir == SOPT_SETCAP ||
3023
- sopt -> sopt_dir == SOPT_GETCAP )
3024
- return (copyincap (sopt -> sopt_val , buf , valsize ));
3025
- else
3026
- #endif
3027
- return (copyin (sopt -> sopt_val , buf , valsize ));
3028
- }
3028
+ /* Version of sooptcopyin that preserves tags. */
3029
+ int
3030
+ sooptcopyincap (struct sockopt * sopt , void * buf , size_t len , size_t minlen )
3031
+ {
3032
+ size_t valsize ;
3033
+
3034
+ if ((valsize = sopt -> sopt_valsize ) < minlen )
3035
+ return EINVAL ;
3036
+ if (valsize > len )
3037
+ sopt -> sopt_valsize = valsize = len ;
3038
+
3039
+ if (sopt -> sopt_td != NULL )
3040
+ return (copyincap (sopt -> sopt_val , buf , valsize ));
3029
3041
3030
3042
bcopy ((__cheri_fromcap void * )sopt -> sopt_val , buf , valsize );
3031
3043
return (0 );
3032
3044
}
3045
+ #endif
3033
3046
3034
3047
/*
3035
3048
* Kernel version of setsockopt(2).
@@ -3211,16 +3224,8 @@ sosetopt(struct socket *so, struct sockopt *sopt)
3211
3224
tmpmac .m_buflen );
3212
3225
} else
3213
3226
#endif
3214
- {
3215
- #if __has_feature (capabilities )
3216
- sopt -> sopt_dir = SOPT_SETCAP ;
3217
- #endif
3218
- error = sooptcopyin (sopt , & extmac ,
3227
+ error = sooptcopyincap (sopt , & extmac ,
3219
3228
sizeof extmac , sizeof extmac );
3220
- #if __has_feature (capabilities )
3221
- sopt -> sopt_dir = SOPT_SET ;
3222
- #endif
3223
- }
3224
3229
if (error )
3225
3230
goto bad ;
3226
3231
error = mac_setsockopt_label (sopt -> sopt_td -> td_ucred ,
@@ -3288,15 +3293,10 @@ sooptcopyout(struct sockopt *sopt, const void *buf, size_t len)
3288
3293
valsize = min (len , sopt -> sopt_valsize );
3289
3294
sopt -> sopt_valsize = valsize ;
3290
3295
if (sopt -> sopt_val != NULL ) {
3291
- if (sopt -> sopt_td != NULL ) {
3292
- #if __has_feature (capabilities )
3293
- KASSERT (sopt -> sopt_dir != SOPT_GETCAP &&
3294
- sopt -> sopt_dir != SOPT_SETCAP ,
3295
- ("exporting capabilities not supproted" ));
3296
- #endif
3296
+ if (sopt -> sopt_td != NULL )
3297
3297
error = copyout (buf , sopt -> sopt_val , valsize );
3298
- } else
3299
- bcopy (buf , (__cheri_fromcap void * )sopt -> sopt_val ,
3298
+ else
3299
+ bcopynocap (buf , (__cheri_fromcap void * )sopt -> sopt_val ,
3300
3300
valsize );
3301
3301
}
3302
3302
return (error );
@@ -3438,16 +3438,8 @@ sogetopt(struct socket *so, struct sockopt *sopt)
3438
3438
tmpmac .m_buflen );
3439
3439
} else
3440
3440
#endif
3441
- {
3442
- #if __has_feature (capabilities )
3443
- sopt -> sopt_dir = SOPT_GETCAP ;
3444
- #endif
3445
- error = sooptcopyin (sopt , & extmac ,
3446
- sizeof extmac , sizeof extmac );
3447
- #if __has_feature (capabilities )
3448
- sopt -> sopt_dir = SOPT_GET ;
3449
- #endif
3450
- }
3441
+ error = sooptcopyincap (sopt , & extmac ,
3442
+ sizeof (extmac ), sizeof (extmac ));
3451
3443
if (error )
3452
3444
goto bad ;
3453
3445
error = mac_getsockopt_label (sopt -> sopt_td -> td_ucred ,
@@ -3477,16 +3469,8 @@ sogetopt(struct socket *so, struct sockopt *sopt)
3477
3469
tmpmac .m_buflen );
3478
3470
} else
3479
3471
#endif
3480
- {
3481
- #if __has_feature (capabilities )
3482
- sopt -> sopt_dir = SOPT_GETCAP ;
3483
- #endif
3484
- error = sooptcopyin (sopt , & extmac ,
3485
- sizeof extmac , sizeof extmac );
3486
- #if __has_feature (capabilities )
3487
- sopt -> sopt_dir = SOPT_GET ;
3488
- #endif
3489
- }
3472
+ error = sooptcopyincap (sopt , & extmac ,
3473
+ sizeof (extmac ), sizeof (extmac ));
3490
3474
if (error )
3491
3475
goto bad ;
3492
3476
error = mac_getsockopt_peerlabel (
0 commit comments