Hi,

Here is another access to uninitialized values detected by valgrind. The 
function CacheFlush() (cache.c:335) initializes 
entries[k].nd_{primary,secondary}.nEvalContext and entries[k].lock, but keys 
are not initialized.
When the eval cache is almost empty (e.g., at the startup), 
CacheLookupNoLocking() and CacheLookupWithLocking () accesses keys, which may 
be uninitialized, before checking nEvalContext.
Below patch swaps the order of condition check.
Thank you very much.

Regards,
Daisuke Takahashi

--- lib/cache.c 16 Jun 2013 02:16:23 -0000      1.35
+++ lib/cache.c 14 Jul 2014 14:43:46 -0000
@@ -247,8 +247,8 @@
 #if USE_MULTITHREAD
     cache_lock(pc, l);
 #endif
-    if (!EqualKeys(pc->entries[l].nd_primary.key, e->key) || 
pc->entries[l].nd_primary.nEvalContext != e->nEvalContext) {       /* Not in 
primary slot */
-        if (!EqualKeys(pc->entries[l].nd_secondary.key, e->key) || 
pc->entries[l].nd_secondary.nEvalContext != e->nEvalContext) {       /* Cache 
miss */
+    if (pc->entries[l].nd_primary.nEvalContext != e->nEvalContext || 
!EqualKeys(pc->entries[l].nd_primary.key, e->key)) {       /* Not in primary 
slot */
+        if (pc->entries[l].nd_secondary.nEvalContext != e->nEvalContext || 
!EqualKeys(pc->entries[l].nd_secondary.key, e->key)) {       /* Cache miss */
 #if USE_MULTITHREAD
             cache_unlock(pc, l);
 #endif
@@ -284,8 +284,8 @@
 #if CACHE_STATS
     ++pc->cLookup;
 #endif
-    if (!EqualKeys(pc->entries[l].nd_primary.key, e->key) || 
pc->entries[l].nd_primary.nEvalContext != e->nEvalContext) {       /* Not in 
primary slot */
-        if (!EqualKeys(pc->entries[l].nd_secondary.key, e->key) || 
pc->entries[l].nd_secondary.nEvalContext != e->nEvalContext) {       /* Cache 
miss */
+    if (pc->entries[l].nd_primary.nEvalContext != e->nEvalContext || 
!EqualKeys(pc->entries[l].nd_primary.key, e->key)) {       /* Not in primary 
slot */
+        if (pc->entries[l].nd_secondary.nEvalContext != e->nEvalContext || 
!EqualKeys(pc->entries[l].nd_secondary.key, e->key)) {       /* Cache miss */
             return l;
         } else {                /* Found in second slot, promote "hot" entry */
             cacheNodeDetail tmp = pc->entries[l].nd_primary;


_______________________________________________
Bug-gnubg mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-gnubg

Reply via email to