[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] tools/migration: Fix potential overflow in send_checkpoint_dirty_pfn_list()
On 06.07.2021 15:34, Andrew Cooper wrote: > On 06/07/2021 13:03, Jan Beulich wrote: >> On 06.07.2021 13:23, Andrew Cooper wrote: >>> 'count * sizeof(*pfns)' can in principle overflow, but is implausible in >>> practice as the time between checkpoints is typically sub-second. >>> Nevertheless, simplify the code and remove the risk. >>> >>> There is no need to loop over the bitmap to calculate count. The number of >>> set bits is returned in xc_shadow_op_stats_t which is already collected (and >>> ignored). >>> >>> Bounds check the count against what will fit in REC_LENGTH_MAX. At the time >>> of writing, this allows up to 0xffffff pfns. >> Well, okay, this then means that an overflow in the reporting of >> dirty_count doesn't matter for now, because the limit is lower >> anyway. >> >>> Rearrange the pfns loop to check >>> for errors both ways, not simply that there were more pfns than expected. >> Hmm, "both ways" to me would mean ... >> >>> @@ -459,24 +462,20 @@ static int send_checkpoint_dirty_pfn_list(struct >>> xc_sr_context *ctx) >>> goto err; >>> } >>> >>> - for ( i = 0, written = 0; i < ctx->restore.p2m_size; ++i ) >>> + for ( i = 0, written = 0; count && i < ctx->restore.p2m_size; ++i, >>> --count ) >>> { >>> if ( !test_bit(i, dirty_bitmap) ) >>> continue; >>> >>> - if ( written > count ) >>> - { >>> - ERROR("Dirty pfn list exceed"); >>> - goto err; >>> - } >>> - >>> pfns[written++] = i; >>> } >>> >>> - rec.length = count * sizeof(*pfns); >>> - >>> - iov[1].iov_base = pfns; >>> - iov[1].iov_len = rec.length; >>> + if ( written != stats.dirty_count ) >>> + { >>> + ERROR("Mismatch between dirty bitmap bits (%u), and dirty_count >>> (%u)", >>> + written, stats.dirty_count); >>> + goto err; >>> + } >> ... you then also check that there are no further bit set in the >> bitmap. As said elsewhere, I'm not convinced using statistics as >> a basis for actual operation (rather than just reporting) is >> appropriate. > > I'm not interested in inference based on the name of the structure. I'm afraid that's the problem: Because you started using it for something it wasn't meant to be used for, you now think it's the name that's misleading, and the use is okay. I remain of the opinion that it's the other way around (but see below for there not being an real dependency at least in this particular case). >> I'm unaware of there being any spelled out guarantee >> that the numbers reported back from the hypercall are accurate. > > The live loop uses this information already for this purpose. If it is > wrong, we've got bigger problems that this. send_memory_live() passes the value to send_dirty_pages(), which in turn passes it only to xc_report_progress_step() and uses it in if ( written > entries ) DPRINTF("Bitmap contained more entries than expected..."); There's no relying on this number at all afaics. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |