block: Make path_combine() return the path
Besides being safe for arbitrary path lengths, after some follow-up patches all callers will want a freshly allocated buffer anyway. In the meantime, path_combine_deprecated() is added which has the same interface as path_combine() had before this patch. All callers to that function will be converted in follow-up patches. Signed-off-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Alberto Garcia <berto@igalia.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20190201192935.18394-10-mreitz@redhat.com Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
0f62cd8204
commit
009b03aaa2
61
block.c
61
block.c
|
@ -152,22 +152,19 @@ int path_is_absolute(const char *path)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if filename is absolute, just copy it to dest. Otherwise, build a
|
/* if filename is absolute, just return its duplicate. Otherwise, build a
|
||||||
path to it by considering it is relative to base_path. URL are
|
path to it by considering it is relative to base_path. URL are
|
||||||
supported. */
|
supported. */
|
||||||
void path_combine(char *dest, int dest_size,
|
char *path_combine(const char *base_path, const char *filename)
|
||||||
const char *base_path,
|
|
||||||
const char *filename)
|
|
||||||
{
|
{
|
||||||
|
const char *protocol_stripped = NULL;
|
||||||
const char *p, *p1;
|
const char *p, *p1;
|
||||||
|
char *result;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (dest_size <= 0)
|
|
||||||
return;
|
|
||||||
if (path_is_absolute(filename)) {
|
if (path_is_absolute(filename)) {
|
||||||
pstrcpy(dest, dest_size, filename);
|
return g_strdup(filename);
|
||||||
} else {
|
}
|
||||||
const char *protocol_stripped = NULL;
|
|
||||||
|
|
||||||
if (path_has_protocol(base_path)) {
|
if (path_has_protocol(base_path)) {
|
||||||
protocol_stripped = strchr(base_path, ':');
|
protocol_stripped = strchr(base_path, ':');
|
||||||
|
@ -182,23 +179,35 @@ void path_combine(char *dest, int dest_size,
|
||||||
{
|
{
|
||||||
const char *p2;
|
const char *p2;
|
||||||
p2 = strrchr(base_path, '\\');
|
p2 = strrchr(base_path, '\\');
|
||||||
if (!p1 || p2 > p1)
|
if (!p1 || p2 > p1) {
|
||||||
p1 = p2;
|
p1 = p2;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (p1)
|
|
||||||
p1++;
|
|
||||||
else
|
|
||||||
p1 = base_path;
|
|
||||||
if (p1 > p)
|
|
||||||
p = p1;
|
|
||||||
len = p - base_path;
|
|
||||||
if (len > dest_size - 1)
|
|
||||||
len = dest_size - 1;
|
|
||||||
memcpy(dest, base_path, len);
|
|
||||||
dest[len] = '\0';
|
|
||||||
pstrcat(dest, dest_size, filename);
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
if (p1) {
|
||||||
|
p1++;
|
||||||
|
} else {
|
||||||
|
p1 = base_path;
|
||||||
|
}
|
||||||
|
if (p1 > p) {
|
||||||
|
p = p1;
|
||||||
|
}
|
||||||
|
len = p - base_path;
|
||||||
|
|
||||||
|
result = g_malloc(len + strlen(filename) + 1);
|
||||||
|
memcpy(result, base_path, len);
|
||||||
|
strcpy(result + len, filename);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void path_combine_deprecated(char *dest, int dest_size,
|
||||||
|
const char *base_path,
|
||||||
|
const char *filename)
|
||||||
|
{
|
||||||
|
char *combined = path_combine(base_path, filename);
|
||||||
|
pstrcpy(dest, dest_size, combined);
|
||||||
|
g_free(combined);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -316,7 +325,7 @@ void bdrv_get_full_backing_filename_from_filename(const char *backed,
|
||||||
error_setg(errp, "Cannot use relative backing file names for '%s'",
|
error_setg(errp, "Cannot use relative backing file names for '%s'",
|
||||||
backed);
|
backed);
|
||||||
} else {
|
} else {
|
||||||
path_combine(dest, sz, backed, backing);
|
path_combine_deprecated(dest, sz, backed, backing);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4657,7 +4666,7 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
|
||||||
} else {
|
} else {
|
||||||
/* If not an absolute filename path, make it relative to the current
|
/* If not an absolute filename path, make it relative to the current
|
||||||
* image's filename path */
|
* image's filename path */
|
||||||
path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
|
path_combine_deprecated(filename_tmp, PATH_MAX, curr_bs->filename,
|
||||||
backing_file);
|
backing_file);
|
||||||
|
|
||||||
/* We are going to compare absolute pathnames */
|
/* We are going to compare absolute pathnames */
|
||||||
|
@ -4667,7 +4676,7 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
|
||||||
|
|
||||||
/* We need to make sure the backing filename we are comparing against
|
/* We need to make sure the backing filename we are comparing against
|
||||||
* is relative to the current image filename (or absolute) */
|
* is relative to the current image filename (or absolute) */
|
||||||
path_combine(filename_tmp, PATH_MAX, curr_bs->filename,
|
path_combine_deprecated(filename_tmp, PATH_MAX, curr_bs->filename,
|
||||||
curr_bs->backing_file);
|
curr_bs->backing_file);
|
||||||
|
|
||||||
if (!realpath(filename_tmp, backing_file_full)) {
|
if (!realpath(filename_tmp, backing_file_full)) {
|
||||||
|
|
|
@ -873,8 +873,7 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
extent_path = g_malloc0(PATH_MAX);
|
extent_path = path_combine(desc_file_path, fname);
|
||||||
path_combine(extent_path, PATH_MAX, desc_file_path, fname);
|
|
||||||
|
|
||||||
ret = snprintf(extent_opt_prefix, 32, "extents.%d", s->num_extents);
|
ret = snprintf(extent_opt_prefix, 32, "extents.%d", s->num_extents);
|
||||||
assert(ret < 32);
|
assert(ret < 32);
|
||||||
|
|
|
@ -496,9 +496,7 @@ void bdrv_get_full_backing_filename_from_filename(const char *backed,
|
||||||
|
|
||||||
int path_has_protocol(const char *path);
|
int path_has_protocol(const char *path);
|
||||||
int path_is_absolute(const char *path);
|
int path_is_absolute(const char *path);
|
||||||
void path_combine(char *dest, int dest_size,
|
char *path_combine(const char *base_path, const char *filename);
|
||||||
const char *base_path,
|
|
||||||
const char *filename);
|
|
||||||
|
|
||||||
int bdrv_readv_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
|
int bdrv_readv_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
|
||||||
int bdrv_writev_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
|
int bdrv_writev_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
|
||||||
|
|
Loading…
Reference in New Issue