NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

bin/51264: Fix src/sbin/fsck_lfs/bufcache.c



>Number:         51264
>Category:       bin
>Synopsis:       Fix src/sbin/fsck_lfs/bufcache.c
>Confidential:   no
>Severity:       critical
>Priority:       medium
>Responsible:    bin-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Jun 22 18:15:00 +0000 2016
>Originator:     Jose Luis Rodriguez Garcia
>Release:        NetBSD current
>Organization:
>Environment:
>Description:
Two bugs:

1- In function bufrehash,the entries are inserted in the hash table using the old hash function, because the hasmask hasn't been updated.

2- In function bufrehash, it must be :

if (max < 0 || max <= hashmax)

instead of:

if (max < 0 || max < hashmax), 

because in the case of max=hashmax both original an new hash table have the same size. It is a waste to reserve more memory and do the copy.

I think that this fix must be pulled o NetBSD 7 and NetBSD 6 (mainly case 1), because it can affect to the cleaner daemon and fsck_lfs.
>How-To-Repeat:

>Fix:
pc2$ diff -u bufcache.c.orig bufcache.c
--- bufcache.c.orig	2016-06-21 21:54:30.000000000 +0200
+++ bufcache.c	2016-06-22 19:57:06.000000000 +0200
@@ -101,17 +101,17 @@
 /* Widen the hash table. */
 void bufrehash(int max)
 {
-	int i, newhashmax, newhashmask;
+	int i, newhashmax;
 	struct ubuf *bp, *nbp;
 	struct bufhash_struct *np;
 
-	if (max < 0 || max < hashmax)
+	if (max < 0 || max <= hashmax)
 		return;
 
 	/* Round up to a power of two */
 	for (newhashmax = 1; newhashmax < max; newhashmax <<= 1)
 		;
-	newhashmask = newhashmax - 1;
+	hashmask = newhashmax - 1;
 
 	/* Allocate new empty hash table, if we can */
 	np = emalloc(newhashmax * sizeof(*bufhash));
@@ -134,7 +134,6 @@
 	free(bufhash);
 	bufhash = np;
 	hashmax = newhashmax;
-	hashmask = newhashmask;
 }
 
 /* Print statistics of buffer cache usage */



Home | Main Index | Thread Index | Old Index