[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/4] tools/libxc: Tolerate zero-length records in migration v2 streams
Under some circumstances, the migration v2 save code would generate valid records with zero content, when the intended behaviour was to omit the record entirely. As the stream is otherwise fine, tolerate these records and avoid failing the migration. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> CC: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/libxc/xc_sr_restore_x86_hvm.c | 25 ++++++++++++++++++++++--- tools/libxc/xc_sr_restore_x86_pv.c | 17 ++++++++++++++--- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/tools/libxc/xc_sr_restore_x86_hvm.c b/tools/libxc/xc_sr_restore_x86_hvm.c index 49d22c7..1dca853 100644 --- a/tools/libxc/xc_sr_restore_x86_hvm.c +++ b/tools/libxc/xc_sr_restore_x86_hvm.c @@ -39,13 +39,32 @@ static int handle_hvm_params(struct xc_sr_context *ctx, unsigned int i; int rc; - if ( rec->length < sizeof(*hdr) - || rec->length < sizeof(*hdr) + hdr->count * sizeof(*entry) ) + if ( rec->length < sizeof(*hdr) ) { - ERROR("hvm_params record is too short"); + ERROR("HVM_PARAMS record truncated: length %u, header size %zu", + rec->length, sizeof(*hdr)); return -1; } + if ( rec->length != (sizeof(*hdr) + hdr->count * sizeof(*entry)) ) + { + ERROR("HVM_PARAMS record truncated: header %zu, count %u, " + "expected len %zu, got %u", + sizeof(*hdr), hdr->count, hdr->count * sizeof(*entry), + rec->length); + return -1; + } + + /* + * Tolerate empty records. Older sending sides used to accidentally + * generate them. + */ + if ( hdr->count == 0 ) + { + DBGPRINTF("Skipping empty HVM_PARAMS record\n"); + return 0; + } + for ( i = 0; i < hdr->count; i++, entry++ ) { switch ( entry->index ) diff --git a/tools/libxc/xc_sr_restore_x86_pv.c b/tools/libxc/xc_sr_restore_x86_pv.c index bc604b3..50e25c1 100644 --- a/tools/libxc/xc_sr_restore_x86_pv.c +++ b/tools/libxc/xc_sr_restore_x86_pv.c @@ -753,15 +753,26 @@ static int handle_x86_pv_vcpu_blob(struct xc_sr_context *ctx, } /* Confirm that there is a complete header. */ - if ( rec->length <= sizeof(*vhdr) ) + if ( rec->length < sizeof(*vhdr) ) { - ERROR("%s record truncated: length %u, min %zu", - rec_name, rec->length, sizeof(*vhdr) + 1); + ERROR("%s record truncated: length %u, header size %zu", + rec_name, rec->length, sizeof(*vhdr)); goto out; } blobsz = rec->length - sizeof(*vhdr); + /* + * Tolerate empty records. Older sending sides used to accidentally + * generate them. + */ + if ( blobsz == 0 ) + { + DBGPRINTF("Skipping empty %s record for vcpu %u\n", + rec_type_to_str(rec->type), vhdr->vcpu_id); + goto out; + } + /* Check that the vcpu id is within range. */ if ( vhdr->vcpu_id >= ctx->x86_pv.restore.nr_vcpus ) { -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |