mirror of
https://git.proxmox.com/git/qemu
synced 2025-07-09 13:18:26 +00:00
virtio-9p: Implemented Security model for lstat and fstat
Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
f7613bee32
commit
1237ad7607
@ -27,9 +27,38 @@ static const char *rpath(FsContext *ctx, const char *path)
|
|||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int local_lstat(FsContext *ctx, const char *path, struct stat *stbuf)
|
|
||||||
|
static int local_lstat(FsContext *fs_ctx, const char *path, struct stat *stbuf)
|
||||||
{
|
{
|
||||||
return lstat(rpath(ctx, path), stbuf);
|
int err;
|
||||||
|
err = lstat(rpath(fs_ctx, path), stbuf);
|
||||||
|
if (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
if (fs_ctx->fs_sm == SM_MAPPED) {
|
||||||
|
/* Actual credentials are part of extended attrs */
|
||||||
|
uid_t tmp_uid;
|
||||||
|
gid_t tmp_gid;
|
||||||
|
mode_t tmp_mode;
|
||||||
|
dev_t tmp_dev;
|
||||||
|
if (getxattr(rpath(fs_ctx, path), "user.virtfs.uid", &tmp_uid,
|
||||||
|
sizeof(uid_t)) > 0) {
|
||||||
|
stbuf->st_uid = tmp_uid;
|
||||||
|
}
|
||||||
|
if (getxattr(rpath(fs_ctx, path), "user.virtfs.gid", &tmp_gid,
|
||||||
|
sizeof(gid_t)) > 0) {
|
||||||
|
stbuf->st_gid = tmp_gid;
|
||||||
|
}
|
||||||
|
if (getxattr(rpath(fs_ctx, path), "user.virtfs.mode", &tmp_mode,
|
||||||
|
sizeof(mode_t)) > 0) {
|
||||||
|
stbuf->st_mode = tmp_mode;
|
||||||
|
}
|
||||||
|
if (getxattr(rpath(fs_ctx, path), "user.virtfs.rdev", &tmp_dev,
|
||||||
|
sizeof(dev_t)) > 0) {
|
||||||
|
stbuf->st_rdev = tmp_dev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int local_set_xattr(const char *path, FsCred *credp)
|
static int local_set_xattr(const char *path, FsCred *credp)
|
||||||
@ -171,9 +200,34 @@ static int local_mkdir(FsContext *ctx, const char *path, mode_t mode)
|
|||||||
return mkdir(rpath(ctx, path), mode);
|
return mkdir(rpath(ctx, path), mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int local_fstat(FsContext *ctx, int fd, struct stat *stbuf)
|
static int local_fstat(FsContext *fs_ctx, int fd, struct stat *stbuf)
|
||||||
{
|
{
|
||||||
return fstat(fd, stbuf);
|
int err;
|
||||||
|
err = fstat(fd, stbuf);
|
||||||
|
if (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
if (fs_ctx->fs_sm == SM_MAPPED) {
|
||||||
|
/* Actual credentials are part of extended attrs */
|
||||||
|
uid_t tmp_uid;
|
||||||
|
gid_t tmp_gid;
|
||||||
|
mode_t tmp_mode;
|
||||||
|
dev_t tmp_dev;
|
||||||
|
|
||||||
|
if (fgetxattr(fd, "user.virtfs.uid", &tmp_uid, sizeof(uid_t)) > 0) {
|
||||||
|
stbuf->st_uid = tmp_uid;
|
||||||
|
}
|
||||||
|
if (fgetxattr(fd, "user.virtfs.gid", &tmp_gid, sizeof(gid_t)) > 0) {
|
||||||
|
stbuf->st_gid = tmp_gid;
|
||||||
|
}
|
||||||
|
if (fgetxattr(fd, "user.virtfs.mode", &tmp_mode, sizeof(mode_t)) > 0) {
|
||||||
|
stbuf->st_mode = tmp_mode;
|
||||||
|
}
|
||||||
|
if (fgetxattr(fd, "user.virtfs.rdev", &tmp_dev, sizeof(dev_t)) > 0) {
|
||||||
|
stbuf->st_rdev = tmp_dev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int local_open2(FsContext *ctx, const char *path, int flags, mode_t mode)
|
static int local_open2(FsContext *ctx, const char *path, int flags, mode_t mode)
|
||||||
|
Loading…
Reference in New Issue
Block a user