Dbm library
Gary Winiger
gww at beatnix.UUCP
Sun Jan 31 05:01:08 AEST 1988
In article <580 at xyzzy.UUCP> meissner at .UUCP (Michael Meissner) writes:
> I remember quite awhile ago, there was a discussion of problems in the
> dbm library, particularly when it has to split an index node.
Some time last September, I filed the following bug report and fix. Here
it is again for all those who need it. The UCB VAX C compiler does not
have this problem, because it doesn't treat sizeof as an unsigned.
Gary..
{uunet,sun,lll-tis}!elxsi!gww
Subject: dbm_store fails on first attempt to write .pag file. +Fix
Index: libc/gen/ndbm.c 4.3BSD +Fix
Description:
dbm_store fails when the first .pag write is done.
Repeat-By:
mkpasswd passwd
Fix:
The comparison for .pag buffer overflow in additem fails to
recognize overflow. This is due to the size_t (of sizeof) being
unsigned, thus promoting the comparison to unsigned. The C
standard, in C.3.3.4, states:
``... and its type (an unsigned integral type) is size_t.''
Casting sizeof to int resolves this problem at ELXSI.
Gary..
{ucbvax!sun,lll-lcc!lll-tis,amdahl!altos86,bridge2}!elxsi!gww
--------- cut --------- snip --------- :.,$w diff -------------
*** /tmp/,RCSt1000709 Fri Mar 27 17:12:31 1987
--- ndbm.c Fri Mar 27 17:12:12 1987
***************
*** 1,5 ****
--- 1,10 ----
/*
* $Log: ndbm.c,v $
+ * Revision 1.2 87/03/27 17:08:45 gww
+ * Cast sizeof to int. This comparison will fail when i1 is < 0 because the
+ * type of sizeof (according to C standard C.3.3.4) is unsigned thus causing
+ * the comparison to fail because it is promoted to unsigned.
+ *
* Revision 1.1 87/01/15 15:35:33 gww
* Initial revision
*
***************
*** 11,17 ****
*/
#if defined(LIBC_SCCS) && !defined(lint)
! static char *ERcsId = "$Header: ndbm.c,v 1.1 87/01/15 15:35:33 gww Exp $ ENIX BSD";
static char sccsid[] = "@(#)ndbm.c 5.3 (Berkeley) 3/9/86";
#endif LIBC_SCCS and not lint
--- 16,22 ----
*/
#if defined(LIBC_SCCS) && !defined(lint)
! static char *ERcsId = "$Header: ndbm.c,v 1.2 87/03/27 17:08:45 gww Exp $ ENIX BSD";
static char sccsid[] = "@(#)ndbm.c 5.3 (Berkeley) 3/9/86";
#endif LIBC_SCCS and not lint
***************
*** 503,509 ****
if (i2 > 0)
i1 = sp[i2];
i1 -= item.dsize + item1.dsize;
! if (i1 <= (i2+3) * sizeof(short))
return (0);
sp[0] += 2;
sp[++i2] = i1 + item1.dsize;
--- 508,514 ----
if (i2 > 0)
i1 = sp[i2];
i1 -= item.dsize + item1.dsize;
! if (i1 <= (i2+3) * (int)sizeof(short))
return (0);
sp[0] += 2;
sp[++i2] = i1 + item1.dsize;
More information about the Comp.unix.questions
mailing list