
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 }