[libvirt] [PATCH] util: Fix coverity warings in virProcessGetAffinity
John Ferlan
jferlan at redhat.com
Thu Jun 4 15:28:24 UTC 2015
On 06/04/2015 11:13 AM, Peter Krempa wrote:
> On Thu, Jun 04, 2015 at 08:34:00 -0400, John Ferlan wrote:
>>
>>
>> On 06/04/2015 08:15 AM, Peter Krempa wrote:
>>> Refactor the code flow a bit more to clear coverity errors.
>>>
>>> Store the cpu count in an intermediate variable and reuse it rather than
>>> caluclating the index.
>>> ---
>>> src/util/virprocess.c | 11 +++++++----
>>> 1 file changed, 7 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/src/util/virprocess.c b/src/util/virprocess.c
>>> index a38cb75..c07e5cd 100644
>>> --- a/src/util/virprocess.c
>>> +++ b/src/util/virprocess.c
>>> @@ -474,12 +474,14 @@ virProcessGetAffinity(pid_t pid)
>>> size_t i;
>>> cpu_set_t *mask;
>>> size_t masklen;
>>> + size_t ncpus;
>>> virBitmapPtr ret = NULL;
>>>
>>> # ifdef CPU_ALLOC
>>> /* 262144 cpus ought to be enough for anyone */
>>> - masklen = CPU_ALLOC_SIZE(1024 << 8);
>>> - mask = CPU_ALLOC(1024 << 8);
>>> + ncpus = 1024 << 8;
>>> + masklen = CPU_ALLOC_SIZE(ncpus);
>>> + mask = CPU_ALLOC(ncpus);
>>>
>>> if (!mask) {
>>> virReportOOMError();
>>> @@ -488,6 +490,7 @@ virProcessGetAffinity(pid_t pid)
>>>
>>> CPU_ZERO_S(masklen, mask);
>>> # else
>>> + ncpus = 1024;
>>> if (VIR_ALLOC(mask) < 0)
>>> return NULL;
>>>
>>> @@ -501,10 +504,10 @@ virProcessGetAffinity(pid_t pid)
>>> goto cleanup;
>>> }
>>>
>>> - if (!(ret = virBitmapNew(masklen * 8)))
>>> + if (!(ret = virBitmapNew(ncpus)))
>>> goto cleanup;
>>>
>>> - for (i = 0; i < masklen * 8; i++) {
>>> + for (i = 0; i < ncpus; i++) {
>>> # ifdef CPU_ALLOC
>>> if (CPU_ISSET_S(i, masklen, mask))
>>
>> ^^^ Coverity still complains here
>>
>> No real change since previous...
>
> Would you mind sharing the error after applying this patch?
>
> Peter
>
Sure (it's cut-n-paste)
471 virBitmapPtr
472 virProcessGetAffinity(pid_t pid)
473 {
474 size_t i;
475 cpu_set_t *mask;
476 size_t masklen;
477 size_t ncpus;
478 virBitmapPtr ret = NULL;
479
480 # ifdef CPU_ALLOC
481 /* 262144 cpus ought to be enough for anyone */
(1) Event assignment: Assigning: "ncpus" = "262144UL".
Also see events: [cond_at_most][assignment][overrun-local]
482 ncpus = 1024 << 8;
483 masklen = CPU_ALLOC_SIZE(ncpus);
484 mask = CPU_ALLOC(ncpus);
485
(2) Event cond_false: Condition "!mask", taking false branch
486 if (!mask) {
487 virReportOOMError();
488 return NULL;
(3) Event if_end: End of if statement
489 }
490
491 CPU_ZERO_S(masklen, mask);
492 # else
493 ncpus = 1024;
494 if (VIR_ALLOC(mask) < 0)
495 return NULL;
496
497 masklen = sizeof(*mask);
498 CPU_ZERO(mask);
499 # endif
500
(4) Event cond_false: Condition "sched_getaffinity(pid, masklen, mask) < 0", taking false branch
501 if (sched_getaffinity(pid, masklen, mask) < 0) {
502 virReportSystemError(errno,
503 _("cannot get CPU affinity of process %d"), pid);
504 goto cleanup;
(5) Event if_end: End of if statement
505 }
506
(6) Event cond_false: Condition "!(ret = virBitmapNew(ncpus))", taking false branch
507 if (!(ret = virBitmapNew(ncpus)))
(7) Event if_end: End of if statement
508 goto cleanup;
509
(8) Event cond_true: Condition "i < ncpus", taking true branch
(13) Event loop_begin: Jumped back to beginning of loop
(14) Event cond_true: Condition "i < ncpus", taking true branch
(15) Event cond_at_most: Checking "i < ncpus" implies that "i" may be up to 262143 on the true branch.
Also see events: [assignment][assignment][overrun-local]
510 for (i = 0; i < ncpus; i++) {
511 # ifdef CPU_ALLOC
(9) Event cond_true: Condition "__cpu / 8 < masklen", taking true branch
(10) Event cond_true: Condition "((__cpu_mask const *)mask->__bits[__cpu / (64UL /* 8 * sizeof (__cpu_mask) */)] & (1UL /* (__cpu_mask)1 */ << __cpu % (64UL /* 8 * sizeof (__cpu_mask) */))) != 0", taking true branch
(11) Event cond_true: Condition "({...})", taking true branch
(16) Event assignment: Assigning: "__cpu" = "i". The value of "__cpu" may now be up to 262143.
(17) Event cond_true: Condition "__cpu / 8 < masklen", taking true branch
(18) Event overrun-local: Overrunning array of 16 8-byte elements at element index 4095 (byte offset 32760) by dereferencing pointer "(__cpu_mask const *)mask->__bits + __cpu / 64UL".
Also see events: [assignment][cond_at_most]
512 if (CPU_ISSET_S(i, masklen, mask))
513 ignore_value(virBitmapSetBit(ret, i));
514 # else
515 if (CPU_ISSET(i, mask))
516 ignore_value(virBitmapSetBit(ret, i));
517 # endif
(12) Event loop: Jumping back to the beginning of the loop
518 }
519
520 cleanup:
521 # ifdef CPU_ALLOC
522 CPU_FREE(mask);
523 # else
524 VIR_FREE(mask);
525 # endif
526
527 return ret;
528 }
More information about the libvir-list
mailing list