This fixes CVE-2016-9602 for all security models.
Signed-off-by: Greg Kurz <[email protected]>
---
hw/9pfs/9p-local.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c
index 1f9239de07e5..4377aa6524c2 100644
--- a/hw/9pfs/9p-local.c
+++ b/hw/9pfs/9p-local.c
@@ -1231,15 +1231,16 @@ out:
return ret;
}
-static int local_truncate(FsContext *ctx, V9fsPath *fs_path, off_t size)
+static int local_truncate(FsContext *fs_ctx, V9fsPath *fs_path, off_t size)
{
- char *buffer;
- int ret;
- char *path = fs_path->data;
+ int fd, ret;
- buffer = rpath(ctx, path);
- ret = truncate(buffer, size);
- g_free(buffer);
+ fd = local_open_nofollow(fs_ctx, fs_path->data, O_WRONLY, 0);
+ if (fd == -1) {
+ return -1;
+ }
+ ret = ftruncate(fd, size);
+ close_preserve_errno(fd);
return ret;
}