tools/libxendevicemodel: add a call to restrict the handle

My recent patch [1] to the Linux privcmd module introduced a mechanism
to restrict an open file handle to subsequently only accept operations for
a specified domain.

This patch extends the libxendevicemodel API and make use of the
mechanism in the Linux-specific code to restrict operations on the
interface handle.

[1] https://git.kernel.org/cgit/linux/kernel/git/ostr/linux.git/commit/?id=4610d240

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
Paul Durrant authored and Ian Jackson committed 2017-02-23 11:57:51 +00:00
1 parent e7745d8ef5
commit 8ef5f344d0
7 files changed
+41

No files matched your search

+2
View File
@@ -101,5 +101,7 @@ typedef struct privcmd_dm_op {
_IOC(_IOC_NONE, 'P', 4, sizeof(privcmd_mmapbatch_v2_t))
#define IOCTL_PRIVCMD_DM_OP \
_IOC(_IOC_NONE, 'P', 5, sizeof(privcmd_dm_op_t))
#define IOCTL_PRIVCMD_RESTRICT \
_IOC(_IOC_NONE, 'P', 6, sizeof(domid_t))
#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */
+9
View File
@@ -15,6 +15,8 @@
* License along with this library; If not, see <http://www.gnu.org/licenses/>.
*/
#include <errno.h>
#include "private.h"
int osdep_xendevicemodel_open(xendevicemodel_handle *dmod)
@@ -34,6 +36,13 @@ int osdep_xendevicemodel_op(xendevicemodel_handle *dmod,
return xendevicemodel_xcall(dmod, domid, nr_bufs, bufs);
}
int osdep_xendevicemodel_restrict(xendevicemodel_handle *dmod,
domid_t domid)
{
errno = EOPNOTSUPP;
return -1;
}
/*
* Local variables:
* mode: C
+5
View File
@@ -492,6 +492,11 @@ int xendevicemodel_inject_event(
return xendevicemodel_op(dmod, domid, 1, &op, sizeof(op));
}
int xendevicemodel_restrict(xendevicemodel_handle *dmod, domid_t domid)
{
return osdep_xendevicemodel_restrict(dmod, domid);
}
/*
* Local variables:
* mode: C
@@ -283,6 +283,16 @@ int xendevicemodel_inject_event(
xendevicemodel_handle *dmod, domid_t domid, int vcpu, uint8_t vector,
uint8_t type, uint32_t error_code, uint8_t insn_len, uint64_t cr2);
/**
* This function restricts the use of this handle to the specified
* domain.
*
* @parm dmod handle to the open devicemodel interface
* @parm domid the domain id
* @return 0 on success, -1 on failure.
*/
int xendevicemodel_restrict(xendevicemodel_handle *dmod, domid_t domid);
#endif /* __XEN_TOOLS__ */
#endif /* XENDEVICEMODEL_H */
@@ -17,6 +17,7 @@ VERS_1.0 {
xendevicemodel_modified_memory;
xendevicemodel_set_mem_type;
xendevicemodel_inject_event;
xendevicemodel_restrict;
xendevicemodel_close;
local: *; /* Do not expose anything by default */
};
+11
View File
@@ -112,6 +112,17 @@ int osdep_xendevicemodel_op(xendevicemodel_handle *dmod,
return 0;
}
int osdep_xendevicemodel_restrict(xendevicemodel_handle *dmod,
domid_t domid)
{
if (dmod->fd < 0) {
errno = EOPNOTSUPP;
return -1;
}
return ioctl(dmod->fd, IOCTL_PRIVCMD_RESTRICT, &domid);
}
/*
* Local variables:
* mode: C
+3
View File
@@ -29,6 +29,9 @@ int osdep_xendevicemodel_op(xendevicemodel_handle *dmod,
domid_t domid, unsigned int nr_bufs,
struct xendevicemodel_buf bufs[]);
int osdep_xendevicemodel_restrict(
xendevicemodel_handle *dmod, domid_t domid);
#define PERROR(_f...) \
xtl_log(dmod->logger, XTL_ERROR, errno, "xendevicemodel", _f)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.