Merge remote-tracking branch 'remotes/kvaneesh/for-upstream' into staging
* remotes/kvaneesh/for-upstream: virtio: Fix memory leaks reported by Coverity virtfs-proxy: Fix possible overflow fsdev/virtfs-proxy-helper: Fix improper use of negative value hw/9pfs/virtio-9p-posix-acl: Fix out-of-bounds access 9pfs-proxy: tiny cleanups in proxy_pwritev and proxy_preadv 9pfs-local: simplify/optimize local_mapped_attr_path() Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
307146cb93
@ -262,6 +262,9 @@ static int send_status(int sockfd, struct iovec *iovec, int status)
|
||||
*/
|
||||
msg_size = proxy_marshal(iovec, 0, "ddd", header.type,
|
||||
header.size, status);
|
||||
if (msg_size < 0) {
|
||||
return msg_size;
|
||||
}
|
||||
retval = socket_write(sockfd, iovec->iov_base, msg_size);
|
||||
if (retval < 0) {
|
||||
return retval;
|
||||
@ -735,6 +738,7 @@ static int proxy_socket(const char *path, uid_t uid, gid_t gid)
|
||||
return -1;
|
||||
}
|
||||
|
||||
g_assert(strlen(path) < sizeof(proxy.sun_path));
|
||||
sock = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (sock < 0) {
|
||||
do_perror("socket");
|
||||
|
@ -45,19 +45,17 @@
|
||||
|
||||
static char *local_mapped_attr_path(FsContext *ctx, const char *path)
|
||||
{
|
||||
char *dir_name;
|
||||
char *tmp_path = g_strdup(path);
|
||||
char *base_name = basename(tmp_path);
|
||||
char *buffer;
|
||||
|
||||
/* NULL terminate the directory */
|
||||
dir_name = tmp_path;
|
||||
*(base_name - 1) = '\0';
|
||||
|
||||
buffer = g_strdup_printf("%s/%s/%s/%s",
|
||||
ctx->fs_root, dir_name, VIRTFS_META_DIR, base_name);
|
||||
g_free(tmp_path);
|
||||
return buffer;
|
||||
int dirlen;
|
||||
const char *name = strrchr(path, '/');
|
||||
if (name) {
|
||||
dirlen = name - path;
|
||||
++name;
|
||||
} else {
|
||||
name = path;
|
||||
dirlen = 0;
|
||||
}
|
||||
return g_strdup_printf("%s/%.*s/%s/%s", ctx->fs_root,
|
||||
dirlen, path, VIRTFS_META_DIR, name);
|
||||
}
|
||||
|
||||
static FILE *local_fopen(const char *path, const char *mode)
|
||||
@ -488,7 +486,7 @@ static int local_mknod(FsContext *fs_ctx, V9fsPath *dir_path,
|
||||
int err = -1;
|
||||
int serrno = 0;
|
||||
V9fsString fullname;
|
||||
char *buffer;
|
||||
char *buffer = NULL;
|
||||
|
||||
v9fs_string_init(&fullname);
|
||||
v9fs_string_sprintf(&fullname, "%s/%s", dir_path->data, name);
|
||||
@ -499,7 +497,6 @@ static int local_mknod(FsContext *fs_ctx, V9fsPath *dir_path,
|
||||
buffer = rpath(fs_ctx, path);
|
||||
err = mknod(buffer, SM_LOCAL_MODE_BITS|S_IFREG, 0);
|
||||
if (err == -1) {
|
||||
g_free(buffer);
|
||||
goto out;
|
||||
}
|
||||
err = local_set_xattr(buffer, credp);
|
||||
@ -512,7 +509,6 @@ static int local_mknod(FsContext *fs_ctx, V9fsPath *dir_path,
|
||||
buffer = rpath(fs_ctx, path);
|
||||
err = mknod(buffer, SM_LOCAL_MODE_BITS|S_IFREG, 0);
|
||||
if (err == -1) {
|
||||
g_free(buffer);
|
||||
goto out;
|
||||
}
|
||||
err = local_set_mapped_file_attr(fs_ctx, path, credp);
|
||||
@ -525,7 +521,6 @@ static int local_mknod(FsContext *fs_ctx, V9fsPath *dir_path,
|
||||
buffer = rpath(fs_ctx, path);
|
||||
err = mknod(buffer, credp->fc_mode, credp->fc_rdev);
|
||||
if (err == -1) {
|
||||
g_free(buffer);
|
||||
goto out;
|
||||
}
|
||||
err = local_post_create_passthrough(fs_ctx, path, credp);
|
||||
@ -539,8 +534,8 @@ static int local_mknod(FsContext *fs_ctx, V9fsPath *dir_path,
|
||||
err_end:
|
||||
remove(buffer);
|
||||
errno = serrno;
|
||||
g_free(buffer);
|
||||
out:
|
||||
g_free(buffer);
|
||||
v9fs_string_free(&fullname);
|
||||
return err;
|
||||
}
|
||||
@ -552,7 +547,7 @@ static int local_mkdir(FsContext *fs_ctx, V9fsPath *dir_path,
|
||||
int err = -1;
|
||||
int serrno = 0;
|
||||
V9fsString fullname;
|
||||
char *buffer;
|
||||
char *buffer = NULL;
|
||||
|
||||
v9fs_string_init(&fullname);
|
||||
v9fs_string_sprintf(&fullname, "%s/%s", dir_path->data, name);
|
||||
@ -563,7 +558,6 @@ static int local_mkdir(FsContext *fs_ctx, V9fsPath *dir_path,
|
||||
buffer = rpath(fs_ctx, path);
|
||||
err = mkdir(buffer, SM_LOCAL_DIR_MODE_BITS);
|
||||
if (err == -1) {
|
||||
g_free(buffer);
|
||||
goto out;
|
||||
}
|
||||
credp->fc_mode = credp->fc_mode|S_IFDIR;
|
||||
@ -576,7 +570,6 @@ static int local_mkdir(FsContext *fs_ctx, V9fsPath *dir_path,
|
||||
buffer = rpath(fs_ctx, path);
|
||||
err = mkdir(buffer, SM_LOCAL_DIR_MODE_BITS);
|
||||
if (err == -1) {
|
||||
g_free(buffer);
|
||||
goto out;
|
||||
}
|
||||
credp->fc_mode = credp->fc_mode|S_IFDIR;
|
||||
@ -590,7 +583,6 @@ static int local_mkdir(FsContext *fs_ctx, V9fsPath *dir_path,
|
||||
buffer = rpath(fs_ctx, path);
|
||||
err = mkdir(buffer, credp->fc_mode);
|
||||
if (err == -1) {
|
||||
g_free(buffer);
|
||||
goto out;
|
||||
}
|
||||
err = local_post_create_passthrough(fs_ctx, path, credp);
|
||||
@ -604,8 +596,8 @@ static int local_mkdir(FsContext *fs_ctx, V9fsPath *dir_path,
|
||||
err_end:
|
||||
remove(buffer);
|
||||
errno = serrno;
|
||||
g_free(buffer);
|
||||
out:
|
||||
g_free(buffer);
|
||||
v9fs_string_free(&fullname);
|
||||
return err;
|
||||
}
|
||||
@ -659,7 +651,7 @@ static int local_open2(FsContext *fs_ctx, V9fsPath *dir_path, const char *name,
|
||||
int err = -1;
|
||||
int serrno = 0;
|
||||
V9fsString fullname;
|
||||
char *buffer;
|
||||
char *buffer = NULL;
|
||||
|
||||
/*
|
||||
* Mark all the open to not follow symlinks
|
||||
@ -675,7 +667,6 @@ static int local_open2(FsContext *fs_ctx, V9fsPath *dir_path, const char *name,
|
||||
buffer = rpath(fs_ctx, path);
|
||||
fd = open(buffer, flags, SM_LOCAL_MODE_BITS);
|
||||
if (fd == -1) {
|
||||
g_free(buffer);
|
||||
err = fd;
|
||||
goto out;
|
||||
}
|
||||
@ -690,7 +681,6 @@ static int local_open2(FsContext *fs_ctx, V9fsPath *dir_path, const char *name,
|
||||
buffer = rpath(fs_ctx, path);
|
||||
fd = open(buffer, flags, SM_LOCAL_MODE_BITS);
|
||||
if (fd == -1) {
|
||||
g_free(buffer);
|
||||
err = fd;
|
||||
goto out;
|
||||
}
|
||||
@ -706,7 +696,6 @@ static int local_open2(FsContext *fs_ctx, V9fsPath *dir_path, const char *name,
|
||||
buffer = rpath(fs_ctx, path);
|
||||
fd = open(buffer, flags, credp->fc_mode);
|
||||
if (fd == -1) {
|
||||
g_free(buffer);
|
||||
err = fd;
|
||||
goto out;
|
||||
}
|
||||
@ -724,8 +713,8 @@ err_end:
|
||||
close(fd);
|
||||
remove(buffer);
|
||||
errno = serrno;
|
||||
g_free(buffer);
|
||||
out:
|
||||
g_free(buffer);
|
||||
v9fs_string_free(&fullname);
|
||||
return err;
|
||||
}
|
||||
@ -738,7 +727,7 @@ static int local_symlink(FsContext *fs_ctx, const char *oldpath,
|
||||
int serrno = 0;
|
||||
char *newpath;
|
||||
V9fsString fullname;
|
||||
char *buffer;
|
||||
char *buffer = NULL;
|
||||
|
||||
v9fs_string_init(&fullname);
|
||||
v9fs_string_sprintf(&fullname, "%s/%s", dir_path->data, name);
|
||||
@ -751,7 +740,6 @@ static int local_symlink(FsContext *fs_ctx, const char *oldpath,
|
||||
buffer = rpath(fs_ctx, newpath);
|
||||
fd = open(buffer, O_CREAT|O_EXCL|O_RDWR|O_NOFOLLOW, SM_LOCAL_MODE_BITS);
|
||||
if (fd == -1) {
|
||||
g_free(buffer);
|
||||
err = fd;
|
||||
goto out;
|
||||
}
|
||||
@ -781,7 +769,6 @@ static int local_symlink(FsContext *fs_ctx, const char *oldpath,
|
||||
buffer = rpath(fs_ctx, newpath);
|
||||
fd = open(buffer, O_CREAT|O_EXCL|O_RDWR|O_NOFOLLOW, SM_LOCAL_MODE_BITS);
|
||||
if (fd == -1) {
|
||||
g_free(buffer);
|
||||
err = fd;
|
||||
goto out;
|
||||
}
|
||||
@ -810,7 +797,6 @@ static int local_symlink(FsContext *fs_ctx, const char *oldpath,
|
||||
buffer = rpath(fs_ctx, newpath);
|
||||
err = symlink(oldpath, buffer);
|
||||
if (err) {
|
||||
g_free(buffer);
|
||||
goto out;
|
||||
}
|
||||
err = lchown(buffer, credp->fc_uid, credp->fc_gid);
|
||||
@ -831,8 +817,8 @@ static int local_symlink(FsContext *fs_ctx, const char *oldpath,
|
||||
err_end:
|
||||
remove(buffer);
|
||||
errno = serrno;
|
||||
g_free(buffer);
|
||||
out:
|
||||
g_free(buffer);
|
||||
v9fs_string_free(&fullname);
|
||||
return err;
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ static ssize_t mp_dacl_listxattr(FsContext *ctx, const char *path,
|
||||
}
|
||||
|
||||
/* len includes the trailing NUL */
|
||||
memcpy(value, ACL_ACCESS, len);
|
||||
memcpy(value, ACL_DEFAULT, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -693,16 +693,16 @@ static ssize_t proxy_preadv(FsContext *ctx, V9fsFidOpenState *fs,
|
||||
const struct iovec *iov,
|
||||
int iovcnt, off_t offset)
|
||||
{
|
||||
ssize_t ret;
|
||||
#ifdef CONFIG_PREADV
|
||||
return preadv(fs->fd, iov, iovcnt, offset);
|
||||
ret = preadv(fs->fd, iov, iovcnt, offset);
|
||||
#else
|
||||
int err = lseek(fs->fd, offset, SEEK_SET);
|
||||
if (err == -1) {
|
||||
return err;
|
||||
} else {
|
||||
return readv(fs->fd, iov, iovcnt);
|
||||
ret = lseek(fs->fd, offset, SEEK_SET);
|
||||
if (ret >= 0) {
|
||||
ret = readv(fs->fd, iov, iovcnt);
|
||||
}
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t proxy_pwritev(FsContext *ctx, V9fsFidOpenState *fs,
|
||||
@ -714,10 +714,8 @@ static ssize_t proxy_pwritev(FsContext *ctx, V9fsFidOpenState *fs,
|
||||
#ifdef CONFIG_PREADV
|
||||
ret = pwritev(fs->fd, iov, iovcnt, offset);
|
||||
#else
|
||||
int err = lseek(fs->fd, offset, SEEK_SET);
|
||||
if (err == -1) {
|
||||
return err;
|
||||
} else {
|
||||
ret = lseek(fs->fd, offset, SEEK_SET);
|
||||
if (ret >= 0) {
|
||||
ret = writev(fs->fd, iov, iovcnt);
|
||||
}
|
||||
#endif
|
||||
@ -1102,6 +1100,10 @@ static int connect_namedsocket(const char *path)
|
||||
int sockfd, size;
|
||||
struct sockaddr_un helper;
|
||||
|
||||
if (strlen(path) >= sizeof(helper.sun_path)) {
|
||||
fprintf(stderr, "Socket name too large\n");
|
||||
return -1;
|
||||
}
|
||||
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (sockfd < 0) {
|
||||
fprintf(stderr, "failed to create socket: %s\n", strerror(errno));
|
||||
|
Loading…
Reference in New Issue
Block a user