vmdk: Switch to heap arrays for vmdk_write_cid

It is only called once for each opened image, so we can do it the easy
way.

Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Fam Zheng 2016-03-08 16:24:34 +08:00 committed by Kevin Wolf
parent a81d616437
commit 965415eb20
1 changed files with 14 additions and 11 deletions

View File

@ -274,36 +274,39 @@ static uint32_t vmdk_read_cid(BlockDriverState *bs, int parent)
static int vmdk_write_cid(BlockDriverState *bs, uint32_t cid) static int vmdk_write_cid(BlockDriverState *bs, uint32_t cid)
{ {
char desc[DESC_SIZE], tmp_desc[DESC_SIZE]; char *desc, *tmp_desc;
char *p_name, *tmp_str; char *p_name, *tmp_str;
BDRVVmdkState *s = bs->opaque; BDRVVmdkState *s = bs->opaque;
int ret; int ret = 0;
desc = g_malloc0(DESC_SIZE);
tmp_desc = g_malloc0(DESC_SIZE);
ret = bdrv_pread(bs->file->bs, s->desc_offset, desc, DESC_SIZE); ret = bdrv_pread(bs->file->bs, s->desc_offset, desc, DESC_SIZE);
if (ret < 0) { if (ret < 0) {
return ret; goto out;
} }
desc[DESC_SIZE - 1] = '\0'; desc[DESC_SIZE - 1] = '\0';
tmp_str = strstr(desc, "parentCID"); tmp_str = strstr(desc, "parentCID");
if (tmp_str == NULL) { if (tmp_str == NULL) {
return -EINVAL; ret = -EINVAL;
goto out;
} }
pstrcpy(tmp_desc, sizeof(tmp_desc), tmp_str); pstrcpy(tmp_desc, DESC_SIZE, tmp_str);
p_name = strstr(desc, "CID"); p_name = strstr(desc, "CID");
if (p_name != NULL) { if (p_name != NULL) {
p_name += sizeof("CID"); p_name += sizeof("CID");
snprintf(p_name, sizeof(desc) - (p_name - desc), "%" PRIx32 "\n", cid); snprintf(p_name, DESC_SIZE - (p_name - desc), "%" PRIx32 "\n", cid);
pstrcat(desc, sizeof(desc), tmp_desc); pstrcat(desc, DESC_SIZE, tmp_desc);
} }
ret = bdrv_pwrite_sync(bs->file->bs, s->desc_offset, desc, DESC_SIZE); ret = bdrv_pwrite_sync(bs->file->bs, s->desc_offset, desc, DESC_SIZE);
if (ret < 0) {
return ret;
}
return 0; out:
g_free(desc);
g_free(tmp_desc);
return ret;
} }
static int vmdk_is_cid_valid(BlockDriverState *bs) static int vmdk_is_cid_valid(BlockDriverState *bs)