Newsgroups: comp.archives
Path: utzoo!news-server.csri.toronto.edu!ox.com!emv
From: oz@nexus.YorkU.CA (Ozan Yigit)
Subject: [ultrix...] important sdbm (ndbm clone) bugfix
Message-ID: <1991Mar9.082248.14205@ox.com>
Followup-To: comp.unix.ultrix,comp.unix.questions,comp.unix.wizards,comp.sources.d,comp.databases,comp.os.minix,comp.windows.x,news.software.b,comp.lang.perl,comp.mail.sendmail,comp.sources.bugs
Sender: emv@ox.com (Edward Vielmetti)
Reply-To: oz@nexus.YorkU.CA (Ozan Yigit)
Organization: York U. Communications Research & Development
References: <21842@yunexus.YorkU.CA>
Date: Sat, 9 Mar 1991 08:22:48 GMT
Approved: emv@ox.com (Edward Vielmetti)
X-Original-Newsgroups: comp.unix.ultrix,comp.unix.questions,comp.unix.wizards,comp.sources.d,comp.databases,comp.os.minix,comp.windows.x,news.software.b,comp.lang.perl,comp.mail.sendmail,comp.sources.bugs

Archive-name: database/dbm/sdbm/1991-03-08
Archive: nexus.yorku.ca:/pub/oz/sdbm.shar.Z [130.63.9.1]
Original-posting-by: oz@nexus.YorkU.CA (Ozan Yigit)
Original-subject: important sdbm (ndbm clone) bugfix
Reposted-by: emv@ox.com (Edward Vielmetti)

[sorry to have to crosspost this wide]

The recent public distribution of sdbm, an ndbm clone came with a subtle bug
[parens, damn parens] that seems to have gone unnoticed for a very long
time. I am thankful to Ronald S. H. Khoo (ronald@robobar.co.uk) for
discovering this bug.

The bug will make some data inaccessible altogether. In one case, 135
entries out of a thousand could not be located in the database. The reason
for the bug to remain unnoticed is probably due to the way sdbm [or ndbm]
is often utilized: short keys with short-to-medium variable-length data.
This use along with sdbm's good page splitting behaviour means the buggy
portion of the code that handles multiple split attempts gets used rarely.

A patch for this nasty bug is included.

FTP: ~ftp/pub/oz/sdbm.shar.Z on nexus.yorku.ca [130.63.9.1] is updated.

My sincere apologies for any inconvenience this bug may have caused. 

oz
---
[patch included cause it's short.  --Ed.]

*** sdbm-dist/sdbm.c	Thu Dec 13 13:52:45 1990
--- sdbm-work/sdbm.c	Fri Mar  8 01:29:40 1991
***************
*** 337,345 ****
   * need to read in anything. BUT we have to write the current
   * [deferred] page out, as the window of failure is too great.
   */
! 		db->curbit = 2 * db->curbit + 
! 			(hash & (db->hmask + 1)) ? 2 : 1;
! 		db->hmask |= (db->hmask + 1);
  
  		if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0
  		    || write(db->pagf, db->pagbuf, PBLKSIZ) < 0)
--- 337,345 ----
   * need to read in anything. BUT we have to write the current
   * [deferred] page out, as the window of failure is too great.
   */
! 		db->curbit = 2 * db->curbit +
! 			((hash & (db->hmask + 1)) ? 2 : 1);
! 		db->hmask |= db->hmask + 1;
  
  		if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0
  		    || write(db->pagf, db->pagbuf, PBLKSIZ) < 0)

---
In seeking the unattainable, simplicity  |  Internet: oz@nexus.yorku.ca
only gets in the way. -- Alan J. Perlis  |  Uucp: utai/utzoo!yunexus!oz
