Nul-terminated strings are passed in all cases, so the strlen() can very
well be invoked by the function itself. In preparation for a hypervisor
change also include the nul terminator in the size calculation.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
---
Ideally libxl_flask_context_to_sid() would follow suit, but aiui doing so
would break its (stable) API.
Of course the casts in xc_flask_access() are suspicious.
---
v2: Avoid assert() use in libxl.
--- a/tools/helpers/init-xenstore-domain.c
+++ b/tools/helpers/init-xenstore-domain.c
@@ -108,7 +108,7 @@ static int build(xc_interface *xch)
if ( flask )
{
- rv = xc_flask_context_to_sid(xch, flask, strlen(flask), &config.ssidref);
+ rv = xc_flask_context_to_sid(xch, flask, &config.ssidref);
if ( rv )
{
fprintf(stderr, "xc_flask_context_to_sid failed\n");
--- a/tools/include/xenctrl.h
+++ b/tools/include/xenctrl.h
@@ -2372,7 +2372,7 @@ long xc_sharing_used_frames(xc_interface
/*** End sharing interface ***/
int xc_flask_load(xc_interface *xc_handle, char *buf, uint32_t size);
-int xc_flask_context_to_sid(xc_interface *xc_handle, char *buf, uint32_t size, uint32_t *sid);
+int xc_flask_context_to_sid(xc_interface *xc_handle, char *buf, uint32_t *sid);
int xc_flask_sid_to_context(xc_interface *xc_handle, int sid, char *buf, uint32_t size);
int xc_flask_getenforce(xc_interface *xc_handle);
int xc_flask_setenforce(xc_interface *xc_handle, int mode);
--- a/tools/libs/ctrl/xc_flask.c
+++ b/tools/libs/ctrl/xc_flask.c
@@ -83,10 +83,11 @@ int xc_flask_load(xc_interface *xch, cha
return err;
}
-int xc_flask_context_to_sid(xc_interface *xch, char *buf, uint32_t size, uint32_t *sid)
+int xc_flask_context_to_sid(xc_interface *xch, char *buf, uint32_t *sid)
{
int err;
struct xen_flask_op op = {};
+ size_t size = strlen(buf) + 1;
DECLARE_HYPERCALL_BOUNCE(buf, size, XC_HYPERCALL_BUFFER_BOUNCE_IN);
if ( xc_hypercall_bounce_pre(xch, buf) )
@@ -249,7 +250,7 @@ static int xc_flask_add(xc_interface *xc
int err;
struct xen_flask_op op = {};
- err = xc_flask_context_to_sid(xch, scontext, strlen(scontext), &sid);
+ err = xc_flask_context_to_sid(xch, scontext, &sid);
if ( err )
return err;
@@ -325,10 +326,10 @@ int xc_flask_access(xc_interface *xch, c
struct xen_flask_op op = {};
int err;
- err = xc_flask_context_to_sid(xch, (char*)scon, strlen(scon), &op.u.access.ssid);
+ err = xc_flask_context_to_sid(xch, (char*)scon, &op.u.access.ssid);
if ( err )
return err;
- err = xc_flask_context_to_sid(xch, (char*)tcon, strlen(tcon), &op.u.access.tsid);
+ err = xc_flask_context_to_sid(xch, (char*)tcon, &op.u.access.tsid);
if ( err )
return err;
--- a/tools/libs/light/libxl_flask.c
+++ b/tools/libs/light/libxl_flask.c
@@ -21,7 +21,10 @@ int libxl_flask_context_to_sid(libxl_ctx
{
int rc;
- rc = xc_flask_context_to_sid(ctx->xch, buf, len, ssidref);
+ if (len != strlen(buf))
+ return ERROR_INVAL;
+
+ rc = xc_flask_context_to_sid(ctx->xch, buf, ssidref);
return rc;
}
--- a/tools/python/xen/lowlevel/xc/xc.c
+++ b/tools/python/xen/lowlevel/xc/xc.c
@@ -1754,7 +1754,7 @@ static PyObject *pyflask_context_to_sid(
return PyErr_SetFromErrno(xc_error_obj);
}
- ret = xc_flask_context_to_sid(xc_handle, ctx, strlen(ctx), &sid);
+ ret = xc_flask_context_to_sid(xc_handle, ctx, &sid);
xc_interface_close(xc_handle);
On 7/1/26 10:47 AM, Jan Beulich wrote:
> Nul-terminated strings are passed in all cases, so the strlen() can very
> well be invoked by the function itself. In preparation for a hypervisor
> change also include the nul terminator in the size calculation.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> Acked-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
> ---
> Ideally libxl_flask_context_to_sid() would follow suit, but aiui doing so
> would break its (stable) API.
>
> Of course the casts in xc_flask_access() are suspicious.
> ---
> v2: Avoid assert() use in libxl.
>
> --- a/tools/helpers/init-xenstore-domain.c
> +++ b/tools/helpers/init-xenstore-domain.c
> @@ -108,7 +108,7 @@ static int build(xc_interface *xch)
>
> if ( flask )
> {
> - rv = xc_flask_context_to_sid(xch, flask, strlen(flask), &config.ssidref);
> + rv = xc_flask_context_to_sid(xch, flask, &config.ssidref);
> if ( rv )
> {
> fprintf(stderr, "xc_flask_context_to_sid failed\n");
> --- a/tools/include/xenctrl.h
> +++ b/tools/include/xenctrl.h
> @@ -2372,7 +2372,7 @@ long xc_sharing_used_frames(xc_interface
> /*** End sharing interface ***/
>
> int xc_flask_load(xc_interface *xc_handle, char *buf, uint32_t size);
> -int xc_flask_context_to_sid(xc_interface *xc_handle, char *buf, uint32_t size, uint32_t *sid);
> +int xc_flask_context_to_sid(xc_interface *xc_handle, char *buf, uint32_t *sid);
> int xc_flask_sid_to_context(xc_interface *xc_handle, int sid, char *buf, uint32_t size);
> int xc_flask_getenforce(xc_interface *xc_handle);
> int xc_flask_setenforce(xc_interface *xc_handle, int mode);
> --- a/tools/libs/ctrl/xc_flask.c
> +++ b/tools/libs/ctrl/xc_flask.c
> @@ -83,10 +83,11 @@ int xc_flask_load(xc_interface *xch, cha
> return err;
> }
>
> -int xc_flask_context_to_sid(xc_interface *xch, char *buf, uint32_t size, uint32_t *sid)
> +int xc_flask_context_to_sid(xc_interface *xch, char *buf, uint32_t *sid)
> {
> int err;
> struct xen_flask_op op = {};
> + size_t size = strlen(buf) + 1;
> DECLARE_HYPERCALL_BOUNCE(buf, size, XC_HYPERCALL_BUFFER_BOUNCE_IN);
>
> if ( xc_hypercall_bounce_pre(xch, buf) )
> @@ -249,7 +250,7 @@ static int xc_flask_add(xc_interface *xc
> int err;
> struct xen_flask_op op = {};
>
> - err = xc_flask_context_to_sid(xch, scontext, strlen(scontext), &sid);
> + err = xc_flask_context_to_sid(xch, scontext, &sid);
> if ( err )
> return err;
>
> @@ -325,10 +326,10 @@ int xc_flask_access(xc_interface *xch, c
> struct xen_flask_op op = {};
> int err;
>
> - err = xc_flask_context_to_sid(xch, (char*)scon, strlen(scon), &op.u.access.ssid);
> + err = xc_flask_context_to_sid(xch, (char*)scon, &op.u.access.ssid);
> if ( err )
> return err;
> - err = xc_flask_context_to_sid(xch, (char*)tcon, strlen(tcon), &op.u.access.tsid);
> + err = xc_flask_context_to_sid(xch, (char*)tcon, &op.u.access.tsid);
> if ( err )
> return err;
>
> --- a/tools/libs/light/libxl_flask.c
> +++ b/tools/libs/light/libxl_flask.c
> @@ -21,7 +21,10 @@ int libxl_flask_context_to_sid(libxl_ctx
> {
> int rc;
>
> - rc = xc_flask_context_to_sid(ctx->xch, buf, len, ssidref);
> + if (len != strlen(buf))
> + return ERROR_INVAL;
> +
> + rc = xc_flask_context_to_sid(ctx->xch, buf, ssidref);
>
> return rc;
> }
> --- a/tools/python/xen/lowlevel/xc/xc.c
> +++ b/tools/python/xen/lowlevel/xc/xc.c
> @@ -1754,7 +1754,7 @@ static PyObject *pyflask_context_to_sid(
> return PyErr_SetFromErrno(xc_error_obj);
> }
>
> - ret = xc_flask_context_to_sid(xc_handle, ctx, strlen(ctx), &sid);
> + ret = xc_flask_context_to_sid(xc_handle, ctx, &sid);
>
> xc_interface_close(xc_handle);
>
>
Reviewed-by: Daniel P. Smith <dpsmith@apertussolutions.com>
On Wed, Jul 01, 2026 at 04:47:52PM +0200, Jan Beulich wrote: > Nul-terminated strings are passed in all cases, so the strlen() can very > well be invoked by the function itself. In preparation for a hypervisor > change also include the nul terminator in the size calculation. > > Signed-off-by: Jan Beulich <jbeulich@suse.com> > Acked-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> Reviewed-by: Anthony PERARD <anthony.perard@vates.tech> Thanks, -- | Vates XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech
© 2016 - 2026 Red Hat, Inc.