4.2 BUGLIST, Part 4 of 10
Vance Vaughan
vance at mtxinu.UUCP
Thu Nov 8 03:32:05 AEST 1984
4.2 BUGLIST ABSTRACTS from MT XINU, part 4 of 10:
The following is part of the 4.2 buglist abstracts as processed by
Mt Xinu. The initial line of each abstract gives the offending
program or source file and source directory (separated by --),
who submitted the bug, when, and whether or not it contained
a proposed fix. Due to license restrictions, no source is
included in these abstracts.
Important general information and disclaimers about this and
other lists is appended at the end of the list...
lib.b--usr.lib Mike Braca <mjb%Brown at UDel-Relay> 27 Sep 83 +FIX
The bc library lib.b was missing from our 4.1c tape.
I was bummed because I wanted to see if you had fixed
a bug we found in 4.1a. In case you missed that one,
here it is again:
All calls to a(x) (except a(0)) return same value because
in /usr/lib/lib.b:
-----
if(x==1)
if(scale<52)
return(.7853981633974483096156608458198757210492923498437764/1)
-----
should be:
-----
if(x==1) {
if(scale<52) {
return(.7853981633974483096156608458198757210492923498437764/1)
}
}
REPEAT BY:
N/A
FIX:
I retrieved it from our 4.1a system
_______________________________________________________________________________
libI77--usr.lib Pisces Development <pisces at Fuji> 1 Oct 84
According to /usr/doc/f77/f77IO.ms, "a real value that is zero
will display as 0. to distinguish it from a very small non-zero
value. This occurs in F and G format conversions. This was not
done for E and D since the embedded blanks in the external
datum causes problems for other input systems."
It WAS done for E and D, causing problems for this and
other input systems.
REPEAT BY:
Compile and run the following Fortran program:
-----------------------------
write(6,'(1pe12.3)') 0.,1.,2.
stop
end
-----------------------------
Output on Fuji at Stanford (4.2BSD) is
0. e+00
1.000e+00
2.000e+00
If this is piped into:
read(6,*) a,b,c
a gets 0, b gets 0, c gets 1.
From: C.S.Rafferty, 231A Applied Electronics Laboratory, Via Crespi,
Stanford Ca.94305
_______________________________________________________________________________
libI77--lib dlw at ucbopal.CC (David L Wasley) 6 Jun 84 +FIX
This is my mistake: the routines ioinit.o & ioinit.f should be
in libU77.a and not in libI77.a
This is because they are essentially user code and refer to
entry points in the other libs.
Repeat by:
I believe if you just call ioinit and nothing else, the load
will fail, eg:
program x
call ioinit()
end
FIX:
Move ioinit source to libU77, modify the makefile appropriately
in both directories, and remake both libs.
_______________________________________________________________________________
libI77/err.c--usr.lib dlw at ucbopal.CC (David L. Wasley) 28 Oct 83 +FIX
FORTRAN programs will not core dump after an error has been detected.
REPEAT BY:
program test
C
write (6, 10) i
stop
10 format (1^)
end
_______________________________________________________________________________
libI77/ioinit.f--usr.lib sdcsvax!sdchema!donn 23 Feb 84 +FIX
The new F77 I/O library routine ioinit() is very useful but
unfortunately it has the problem that it wants to use
subroutines from the run-time library, and the run-time
library is loaded ahead of the I/O library.
REPEAT BY:
If you compile the program 'iotest.f' as in the script below,
you get the results shown:
----------------------------------------------------------------
% cat iotest.f
c
c iotest.f -- check load order of ioinit()
c
logical n
logical ioinit
n = ioinit( .true., .false., .false., 'FORT', .false. )
stop
end
% f77 -O iotest.f
iotest.f:
MAIN:
Undefined:
_i_len
_i_indx
_lnblnk_
_s_cmp
_s_copy
%
----------------------------------------------------------------
More complex programs probably don't have this problem -- they
load all of the routines needed by ioinit() anyway, because
they need them elsewhere. However a reasonably complex program
which one of our users was trying to bring up still failed to
load a few of the required routines.
FIX:
I scratched my head with this one. I have decided not to offer
a real fix and let the authorities decide how to deal with it.
There are a number of conceptual problems (e.g, ioinit.f is
supposed to be a model F77 subroutine, but it won't work in the
F77 I/O library because it calls run-time subroutines like any
good F77 program should, so perhaps it should be rewritten in
C; or perhaps the run-time and I/O libraries should get loaded
together; etc.). A hack that makes the problem go away is the
following:
----------------------------------------------------------------
# cd /usr/lib
# ar xv libI77.a ioinit.o
x - ioinit.o
# ar rv libF77.a ioinit.o
a - ioinit.o
# ranlib libF77.a
# rm ioinit.o
----------------------------------------------------------------
Donn Seeley UCSD Chemistry Dept. ucbvax!sdcsvax!sdchema!donn
32 52' 30"N 117 14' 25"W (619) 452-4016 sdcsvax!sdchema!donn at noscvax
_______________________________________________________________________________
libI77/sfe.c--usr.lib dlw at ucbopal.CC (David L. Wasley) 30 Oct 83 +FIX
(Original description, submitted 26 Oct 83, by gregc at ucsfcgl.UUCP)
"Formatted read's with X's don't behave properly on truncated lines."
Actually, the format execution IS correct. However, the I/O system
should be tolerant and allow short records, particularly if a human
is typing data. Therefore, the "1x" below should not cause an error.
REPEAT BY:
Try the program below, and type in lines that are 3 characters
long and those that are longer. A 3 character line causes a
F_EREREC error.
C
C Exercise read from incomplete line bug
C
program test
C
character*3 str
integer int
real float
C
read (5, 10) str, int, float
print *, str
stop
10 format (a3,1x,i7,f8)
end
FIX:
The original fix proposed introduces other bugs as side effects.
The fix below works only for sequential external reads from a
device that can't seek, e.g. a terminal port. The more general
fix requires major restructuring of the I/O code.
I've delta'ed this into the source code on UcbMonet.
diff sfe.c version 1.7 vs version 1.8
170c170
< if(n=='\n') return(F_EREREC);
---
> if(n=='\n') return(cursor=0); /* be tolerant */
David Wasley
dlw at opal.CC.Berkeley
_______________________________________________________________________________
lib[FU]77/signal_.c--usr.lib quarles at ucbic (Tom Quarles) 13 Oct 83 +FIX
The user accessable signal handling mechanism provided in both
libF77 and libU77 (source is identical except for sccsid) is
for the old signal system, and does not allow access to signals
from 16 to 27, and more importantly, does not pass on the
additional fields now supplied, most importantly, the signal
code field which distinguishes betweeh the different types of
floating point exceptions.
REPEAT BY:
Comparing the source code with the documentation.
_______________________________________________________________________________
libc/gen/alarm.c--lib sun!shannon (Bill Shannon) 21 Mar 84 +FIX
alarm (which is implemented using setitimer) can sometimes lie
and return zero even when there is an alarm pending. This
screws up people who do:
left = alarm(0); /* turn alarm off */
diddle, diddle, diddle...
alarm(left); /* turn it back on */
REPEAT BY:
See above.
_______________________________________________________________________________
libc/gen/crypt.c--lib cooper (Eric Cooper) 9 Oct 83 +FIX
The primitive DES function encrypt() doesn't work if you call it
directly. For instance, if you encrypt something and then decrypt it,
you don't get what you started with.
REPEAT BY:
/*
* Test DES by encrypting block of all 1's with 0 key.
*/
char key[64];
char data[64];
main()
{
register int i;
for (i = 0; i < 64; i++)
data[i] = 1;
setkey(key);
encrypt(data, 0);
encrypt(data, 1);
/* data should again be all 1's, but isn't */
for (i = 0; i < 64; i++)
printf("%d", data[i]);
printf("\n");
}
FIX:
The problem is that there are two arrays, e[], which is initialized,
and E[], which isn't. As it stands now, E[] only gets set in crypt(),
the higher-level password encryption function. There's a for-loop in the
code for crypt() which copies e[] to E[]. (Later on, E gets shuffled around.)
The fix is to take this for-loop out of crypt() and put it in setkey(),
so that E[] will get set up even if you don't go through crypt().
_______________________________________________________________________________
libc/gen/crypt.c--lib amd!nsc!chongo (Landon C. Noll) 22 Sep 84 +FIX
Encryption/Decryption via the encrypt(3)/setkey(3) system does
not work. The reason for this problem is that the E table
is not setup prior to use. Worse, crypt(3) loads the E table
with the standard values and then perturbs the E table. Calling
crypt(3) between usage of encrypt(3) changes the E table.
REPEAT BY:
The following program with fix undefined will show the error
with the standard crypt.c. When you have applied the bug fix
and installed the new crypt.c in libc.a, recompile with -Dfix.
--------------------------cut here for crypttest.c-----------------------------
/*
* play with DES encryption
*
* usage:
* crypttest key block
*
* adopted from a program by: ihnp4!ihnet!tjr
*
* NOTE: when the fix is made to the crypt(3) routines, define fix and
* recompile.
*/
#include <stdio.h>
main(argc,argv)
int argc;
char *argv[];
{
register i; /* index */
char *crypt();
char block[65]; /* block to encrypt */
char block2[65]; /* copy of block */
char key[64]; /* key to encrypt by */
/* arg check */
if(argc != 3)
fprintf(stderr,"usage: %s key text\n",argv[0]);
/* convert key to a binary bit per byte */
for( i=1; i<64; ++i) {
/* make the extra bits zero */
if ( ! argv[1][i-1] ) {
for ( ; i<64; ++i ) {
key[i] = 0;
}
break;
} else if ( argv[1][i-1] == '0' ) {
key[i] = 0;
} else {
key[i] = 1;
}
}
/* convert block to a binary bit per byte */
for( i=1; i<64; ++i) {
/* make the extra bits zero */
if ( ! argv[2][i-1] ) {
for ( ; i<64; ++i ) {
block[i] = 0;
block2[i] = 0;
}
break;
} else if ( argv[2][i-1] == '0' ) {
block[i] = 0;
block2[i] = 0;
} else {
block[i] = 1;
block2[i] = 1;
}
}
/* set our key */
setkey(key);
#ifdef fix
load_etable(0); /* preload the standard E table */
#endif fix
/* show what we start with */
#ifdef fix
printf("We will encrypt and decrypt back to the original\n\n");
#else
printf("In this test, we shall encrypt/decrypt with encrypt(3).\n");
printf("Note that we dont get the original back!\n\n");
#endif fix
prt("original: ",block);
/* encrypt it */
encrypt(block,0);
prt("encrypted: ",block);
/* decrypt */
encrypt(block,1);
prt("original: ",block);
/* encrypt it again */
putchar('\n');
#ifdef fix
printf("\nUsing crypt(3) does not change things\n\n");
#else
printf("\nNext we will use crypt(3) and reload our key. You will\n");
printf("observe that crypt(3) disturbs encrypt(3)\n\n");
#endif fix
prt("original: ",block2);
encrypt(block2,0);
prt("encrypted: ",block2);
/* now we use crypt and reset the key afterwards */
crypt(block,"aA");
setkey(key);
/* decrypt */
encrypt(block2,1);
prt("original: ",block2);
}
prt(s,block)
char *s;
char block[];
{
int i;
fputs(s,stdout);
for(i=1; i<64; ++i)
putchar(block[i]+'0');
putchar('\n');
}
--------------------------end of crypttest.c-----------------------------
_______________________________________________________________________________
libc/gen/ctime.c--lib solomon at wisc-crys (Marvin Solomon) 4 Jan 84 +FIX
localtime() (and hence ctime()) returns a ridiculous result when handed
an input representing a moment between midnight, Jan 1, 1970 local
time and midnight, Jan 1, 1970 GMT. In particular, they return nonsense
on an input of 0.
REPEAT BY:
compile and run the program:
main() {
int t = 0;
printf(ctime(&t));
}
_______________________________________________________________________________
libc/gen/ctime.c--lib ECN.davy at Purdue.ARPA (Dave Curry) 25 Aug 84 +FIX
The asctime() routine will die on dates after Dec 31 23:59:59 1999,
producing a string with an incomplete year.
REPEAT BY:
#include <sys/time.h>
main()
{
char *ctime();
long clock = 946702800; /* or anything greater */
printf("Next line should be: Sat Jan 1 00:00:00 2000\n");
printf("%s", ctime(&clock));
}
FIX:
On line 292, change:
cp[2] = '0' + t->tm_year >= 200;
to:
cp[2] = '0';
--Dave Curry
decvax!pur-ee!davy
eevax.davy at purdue
_______________________________________________________________________________
libc/gen/ctype_.c--lib hpda!hpdsa!decot (Dave Decot) 4 Sep 84 +FIX
Manual page seems to indicate that anything less than ' ' will
return non-zero from iscntrl(). The "space characters" (HT,
LF, VT, FF, CR) are classified as space but not as control.
REPEAT BY:
main() {
printf("Is \\n a control character? %s\n", iscntrl('\n')? "Yes" : "No");
}
FIX:
Change "_S" to "_S|_C" for those five characters in the table, or
fix the manual.
Dave Decot
_______________________________________________________________________________
libc/gen/execvp.c--lib donn at utah-cs (Donn Seeley) 16 Oct 84 +FIX
It seems to me that this has been complained about before, but
since it doesn't appear to have been fixed (I just peeked on
monet), I figure I might as well submit a report. The problem
is that execvp() treats '-' as separating paths in a PATH
variable, unlike the shell. This causes many surprises when
'make' wants to find commands in directories that have
hyphenated names (as I just discovered) and probably has other
negative side-effects.
REPEAT BY:
% mkdir /tmp/a-test
% cp /bin/echo /tmp/a-test/a-echo
% setenv PATH /tmp/a-test:$PATH
% cat > makefile
hi:
a-echo hi there
% make hi
a-echo hi there
Make: Cannot load a-echo. Stop.
%
_______________________________________________________________________________
libc/gen/frexp.c--lib Jeff Mogul <mogul at Gregorio> 16 Aug 84 +FIX
The manual page for frexp(3) states that it ``returns the mantissa
... as a double ... of magnitude less than 1''. In fact, it does
not always do this: if the input is a power of two, the value
returned is equal to 1, not less than 1.
Also, if the input is zero, then the function goes into an infinite
loop.
The first problem can be solved either by changing the manual
page or by fixing the function. The second problem is obviously
a bug.
REPEAT BY:
Compile this program:
double frexp();
main()
{
double value;
double mantissa;
int exponent;
while (1) {
scanf("%lf",&value);
mantissa = frexp(value, &exponent);
printf("%f == %f * 2^%d\n", value, mantissa, exponent);
}
}
and run it with the input:
1.0
2.0
0.0
It will print:
1.000000 == 1.000000 * 2^0
2.000000 == 1.000000 * 2^1
and then hang
_______________________________________________________________________________
libc/gen/frexp.c--lib Mike Muuss <mike at BRL-VGR.ARPA> 22 Aug 84 +FIX
When executing a program that uses sqrt() heavily, more time
is spent in frexp() (called by sqrt()) than in sqrt() itself!
frexp() just returns the fractional & exponent parts of a
floating point number. It's problem is that it's written
in a nice machine independent manner which is quite portable,
but also foolish and slow.
Also, frexp( 1.0, &i ) will return a fractional part of 1.0
and an exponent of 0, even though the documentation explicitly
states that the return is LESS THAN 1.0 -- I have fixed this
problem in both the vax and !vax code, below.
REPEAT BY:
Write a program to use sqrt() a lot. Profile it with -pg -lm_p
and count the cycles.
_______________________________________________________________________________
libc/gen/getwd.c--lib Mike Braca <mjb%Brown at UDel-Relay> 27 Sep 83 +FIX
If you have a soft link pointing at a directory on which you
mount a file system, getwd will often return a path starting
at that link, rather than at the real directory.
(Well, hey, our users got confused!)
REPEAT BY:
Make a soft link in / which points at a directory on which a file
system is mounted. Cd to a subdirectory in the file system, and
do a pwd. Note: this happens only if the soft link happened to
get into the directory earlier than the real directory name (or
maybe it's the inode being smaller).
_______________________________________________________________________________
libc/gen/malloc.c--lib lepreau at utah-cs (Jay Lepreau) 9 Nov 83 +FIX
1. When RCHECK is defined, realloc needs to move the trailing
RMAGIC and adjust the recorded ov_size when it uses the same
block. Otherwise got false assertion failures. Spencer Thomas
found this one.
2. botch() printout needs cleaning up: it used to print to
stdout and w/o an fflush (so never saw it), and it needs to bracket
the msg with \r\n's cause terminal state may be funny.
3. If one defined RCHECK but not debug you didn't get any checking.
4. minor lint in morecore().
(5. There seems to be some redundant code in morecore(), i.e.
"can't happen" stuff, but why mess with working code?)
REPEAT BY:
Inspection (these arose in Gosling's emacs for us).
_______________________________________________________________________________
libc/gen/mktemp.c--lib Keith Bostic <keith at seismo.ARPA> 25 Sep 84 +FIX
1: Mktemp only produces 26 unique file names.
It's a real pain to run out of file names,
especially considering...
2: On failure, mktemp returns the string "/".
You can't test mktemp in the standard fashion, i.e.
"if (!mktemp(str))" has to be done as
"if (!strcmp(mktemp(str),"/"))" unless you just want
to try and recover when you fail to open the file. The
fact that it returns "/" is undocumented, and a real
good 20 minute bug when it occurs.
REPEAT BY:
#include <stdio.h>
main()
{
int cnt;
char buf[20],
*strcpy(), *mktemp();
for (cnt = 0;cnt < 30;++cnt) {
creat(mktemp(strcpy(buf,"/tmp/fileXXXXXX")),0444);
printf("%d -- %s\n",cnt,buf);
}
}
_______________________________________________________________________________
libc/gen/popen.c--lib dlw at ucbmonet (David Wasley) 12 Aug 83 +FIX
Popen() unconditionally dup2's the child's end of the pipe
after forking. It then closes the original. If the fd was
already correct, it ends up with NO fd!
REPEAT BY:
Run the following with & without an arg.
#include <stdio.h>
main(argc)
{
if (argc < 2)
close(0);
fprintf(popen("/bin/cat", "w"), "hello cat\n");
}
_______________________________________________________________________________
libc/gen/random.c--lib jerry at ucbopal.CC (Jerry Berkman) 13 Sep 84
According to man 3 random:
"random will by default produce a sequence of numbers
that can be duplicated by calling srandom with 1 as the seed"
The following program shows this does not always work.
It reinitializes each time it calls random() and therefore should
always print the same number, but it does not.
REPEAT BY:
#include <stdio.h>
main()
{
int i;
for (i = 1; i < 20; i++ ) {
srandom(1);
printf("%12d\n", random(0));
}
}
_______________________________________________________________________________
libc/gen/scandir.c--lib Jay Lepreau <lepreau at utah-cs> 29 Nov 83 +FIX
1. If the arraysz estimate proved low, scandir does a realloc
assuming the worst, but it never recomputes the new arraysz,
so it keeps calling realloc all the rest of the way thru the dir.
(This isn't as bad as it sounds, for realloc is smart enuf not
to do anything if the same size is requested.)
2. scandir is overly optimistic about the worst case: the directory
could grow on it (unless there's some synchrony out there I don't
know about), leading to an infinite loop. It should restat the
directory.
REPEAT BY:
Well, *I* noticed it from that nifty gprof output showing
hundreds of realloc calls. Obvious from inspection too.
_______________________________________________________________________________
libc/gen/sleep.c--lib pur-ee!ef:ks (Kirk Smith) 27 Aug 84 +FIX
After a call to sleep(), the signal SIGALRM remains blocked.
REPEAT BY:
main()
{
sleep(1);
alarm(1);
}
This program will never terminate.
_______________________________________________________________________________
libc/gen/syslog.c--lib Marshall Rose <mrose at uci-750a> 18 Jan 84 +FIX
If the format string you give to syslog() contains a '%' escape
other than a '%m', then the format string is truncated after that
escape and the resulting output in the syslog file looks very wierd.
This bug makes syslog() virtually useless if you like to put lots
of information in a single line.
REPEAT BY:
Run the following program, wait a while for some other process to send
something to the syslog daemon, and then check out the file.
You'll see something like this:
Jan 17 17:39:12 localhost: 4222 foo: argc=1<8>4231 sendmail: connected to uci-750b
Note how the syslog daemon got real confused on that one...
#include <syslog.h>
main (argc, argv)
char **argv;
{
openlog ("foo", LOG_PID);
syslog (LOG_INFO, "argc=%d *argv=%s", argc, *argv);
}
_______________________________________________________________________________
libc/gen/ttyslot.c--lib watcgl!dmmartindale 28 Mar 84 +FIX
The ttyslot() C library routine is called by many programs
(either directly or via getlogin()) because it reads through
/etc/ttys via sys reads of one byte. On a large system, this
wastes an appreciable amount of time.
REPEAT BY:
On a completely unloaded system, type "su". See how long it
takes to prompt for a password. On watmath, su took 1.5 CPU
seconds to reach this point, when invoked from a pseudo-tty
line whose entry is near the end of /etc/ttys. 1.39 seconds
of this was spent in sys read called from getttys().
(Gprof is wonderful!)
_______________________________________________________________________________
libc/stdio/fopen.c--lib ralph (Ralph Campbell) 25 May 83 +FIX
I think I might have found a bug in the 4.1bsd fopen routine.
At the start of stdio/fopen.c, the following code appears:
for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT|_IORW); iop++)
if (iop >= _lastbuf)
return(NULL);
The purpose of this segment is apparently to find an unused element
of the iob array. The problem with this is that it's possible
to exit the loop with iop == _lastbuf, which should never happen.
When it does, a variety of program malfunctions can occur, based
on what lies after the last element of _iob.
REPEAT BY:
When I was trying to find this bug, I was using adb (and sdb). When
I ran the program with adb, the program worked ok. When I just ran
the program, it blew up. It seems like I've had this (programs not
being buggy inside a debugger) happen before, does anybody know
any general causes of this phenomenon?
_______________________________________________________________________________
libc/stdio/fputs.c--lib Mike Braca <mjb%Brown at UDel-Relay> 27 Sep 83 +FIX
Fputs returns garbage when passed a zero-length string. It should
return 0 instead.
REPEAT BY:
Obvious (just look at the source)
FIX:
change the declaration:
register r;
to:
register r = 0;
_______________________________________________________________________________
libc/vax/gen/bcopy.s--lib lepreau at utah-cs (Jay Lepreau) 7 Sep 83 +FIX
The one line comment at the tops says:
/* bcopy(to, from, size) */
but the man page says bcopy(b1, b2, len) copies from b1 to b2.
The man page is right (unfortunately for compatibility).
REPEAT BY:
Yikes! Scenario: 1) not able to find the man page and so glance at
source, 2) surprised and grateful that there is such a comment there,
3) pgm gets blown away, 4) much later really look at the source...
FIX:
No, it's NOT to delete the comment....
_______________________________________________________________________________
libc/vax/gen/ffs.s--lib donn at utah-cs (Donn Seeley) 17 Sep 84 +FIX
The documentation for ffs() says it returns -1 if 0 is passed
as an argument, but in fact it returns 0.
REPEAT BY:
Compile the following program:
----------------------------------------------------------------
main()
{
register int i, j;
for ( i = -1; i < 32; ++i ) {
j = (i < 0 ? 0 : 1 << i);
printf( "%#010x : %d\n", j, ffs( j ) );
}
}
----------------------------------------------------------------
When run it prints:
----------------------------------------------------------------
0000000000 : 0
0x00000001 : 1
0x00000002 : 2
0x00000004 : 3
0x00000008 : 4
0x00000010 : 5
0x00000020 : 6
0x00000040 : 7
...
----------------------------------------------------------------
Notice the misfeature of printf() that prevents zero operands
from being converted the same way as other operands with "%#x"...
What is the point of that?
FIX:
It's pretty clear to me that the documentation is wrong. The
following trivial change in man3/ffs.3 would make it correspond
properly with the actual function return values:
----------------------------------------------------------------
< starting at 1. A return value of \-1 indicates the
---
> starting at 1. A return value of 0 indicates the
----------------------------------------------------------------
The Sun documentation fixed one problem ('starting at 1' now
reads 'starting at 1 from the right') but the '-1' is still
there (and is wrong for the Sun, too, from what I can tell).
If the function is wrong, I'd be very surprised,
Donn Seeley University of Utah CS Dept donn at utah-cs.arpa
40 46' 6"N 111 50' 34"W (801) 581-5668 decvax!utah-cs!donn
_______________________________________________________________________________
libdbm/Makefile--usr.lib sjk at sri-spam (Scott J. Kramer) 11 Nov 83 +FIX
The "-c" option should be used when compiling the dbm library
and the resulting object should be renamed to libdbm.a.
REPEAT BY:
Run "make" in the source directory.
FIX:
Fix the makefile...
RCS file: Makefile,v
retrieving revision 4.2
diff -r4.2 Makefile
1a2
> # $Header: Makefile,v 4.2.1.1 83/11/11 22:04:32 sjk Exp $
3c4
< CFLAGS=-O
---
> CFLAGS=-O -c
7c8,9
< ${CC} -o libdbm.a ${CFLAGS} dbm.c
---
> ${CC} ${CFLAGS} dbm.c
> @mv dbm.o libdbm.a
_______________________________________________________________________________
libplot--usr.lib sun!shannon (Bill Shannon) 5 Sep 83 +FIX
The plot libraries for 300, 300s, 450, and 4014 are named
libt300.a, libt300s.a, etc. instead of lib300.a, etc. The
plot filters in /usr/src/usr.bin/plot use -l300, etc.
FIX:
Change the Makefile, the directory names (t300 to 300, etc.)
and the Makefiles in the directories to use the proper names.
Bill Shannon
sun!shannon
Sun Microsystems, Inc.
_______________________________________________________________________________
lint--usr.bin allegra!rdg Jul 4 83
lint fails to detect the use of an assignment statement
which reduces to a constant as the conditional in an if
statement.
with the -h lint option, statements like
if (1)
foo();
produce the warning "constant in conditional statement".
unfortuantely, the statement if (a = 1) which is just
as much a "constant" does not produce the warning.
This is definitely a bug in lint, no question about it!
REPEAT BY:
lint -h file.c
where file.c contains
main()
{
int a;
if (a = 1)
x();
}
_______________________________________________________________________________
lint--usr.bin ellis @ tektronix Jun 20 83 +FIX
According to the man page for lint, flag options can be concatenated
together (that is, "lint -ab file ..." works). The shell script in
/usr/bin/lint uses a case statement to process flags. However,
the command invocation
lint -I/usr/joe/include ...
"breaks" the script. The check for the "-n" option flag is made by
checking for "-*n*"; therefore, as a side-effect of specifying this
particular -I flag, the standard library compatibility checks are
disabled (resulting in large numbers of erroneous lint messages).
A simple fix is to change the script from
-*n*) P= ;;
-*p*) P=port ;;
to
-n) P= ;;
-p) P=port ;;
which simply requires the use of "-n" or "-p" to occur separately
(which the shell script permits, anyway).
_______________________________________________________________________________
lint--usr.bin mazama!stew (Stewart Levin) 29 Apr 84
static declarations appearing in #include files and used
later on in the source file that #include'ed them cause
lint to complain that (1) the variable is defined
but not used in the #include file and (2) the variable
is used but not defined in the source file.
The same program, when compiled executes properly.
It seems lint restricts static declarations to within
the actual file in which they appear (i.e. the #include file)
rather than the more liberal interpretation of any source
file that includes the declaration.
REPEAT BY:
Include file "pi.h":
static double pi=3.1415926535;
Source file "bug.c":
#include "pi.h"
main()
{
printf("2pi=%f\n",2.0*pi);
}
Command:
lint -lc bug.c
Result:
bug.c:
pi defined( ./pi.h(1) ), but never used
pi used( bug.c(4) ), but not defined
_______________________________________________________________________________
lint--usr.bin ellis @ tektronix Jun 20 83 +FIX
According to the man page for lint, flag options can be concatenated
together (that is, "lint -ab file ..." works). The shell script in
/usr/bin/lint uses a case statement to process flags. However,
the command invocation
lint -I/usr/joe/include ...
"breaks" the script. The check for the "-n" option flag is made by
checking for "-*n*"; therefore, as a side-effect of specifying this
particular -I flag, the standard library compatibility checks are
disabled (resulting in large numbers of erroneous lint messages).
A simple fix is to change the script from
-*n*) P= ;;
-*p*) P=port ;;
to
-n) P= ;;
-p) P=port ;;
which simply requires the use of "-n" or "-p" to occur separately
(which the shell script permits, anyway).
_______________________________________________________________________________
lint/llib-lc--usr.bin ucsfcgl!blia!eric (Eric Allman) 9 Feb 84 +FIX
The declaration of longjmp shows the environment as "*e" instead
of "e".
REPEAT BY:
Lint something that uses longjmp -- extra errors will be generated.
FIX:
Remove the extra * from the declaration and remake.
_______________________________________________________________________________
lisp--ucb Dove <dove at sylvester> 25 Feb 84
Franz lisp gets in a cycle in macroexpansion for certain forms of
the mit loop macro. These constructions work fine on my 3600.
REPEAT BY:
--
-> (trace macroexpand)
-> (macroexpand '(loop for i = (ncons 0)
for j from 0 do
collecting (list i j)))
1 <Enter> macroexpand ((loop for i = (ncons 0) ...))
|2 <Enter> macroexpand ((ncons 0))
| 3 <Enter> macroexpand (0)
| 3 <EXIT> macroexpand 0
|2 <EXIT> macroexpand (ncons 0)
|2 <Enter> macroexpand ((ncons 0))
| 3 <Enter> macroexpand (0)
| 3 <EXIT> macroexpand 0
|2 <EXIT> macroexpand (ncons 0)
|2 <Enter> macroexpand ((ncons 0))
| 3 <Enter> macroexpand (0)
| 3 <EXIT> macroexpand 0
|2 <EXIT> macroexpand (ncons 0)
|2 <Enter> macroexpand ((ncons 0))
| 3 <Enter> macroexpand (0)
| 3 <EXIT> macroexpand 0
|2 <EXIT> macroexpand (ncons 0)
|2 <Enter> macroexpand ((ncons 0))
| 3 <Enter> macroexpand (0)
| 3 <EXIT> macroexpand 0
|2 <EXIT> macroexpand (ncons 0)
|2 <Enter> macroexpand ((ncons 0))
Interrupt:
Break nil
<1>: Interrupt:
Break nil
<2>:
<1>:
[Return to top level]
->
------
Please send me an immediate reply if this problem is fixed already, I am
under great time pressure.
_______________________________________________________________________________
lisp--ucb jbn at FORD-WDL1.ARPA 1 Mar 84
There are definitions of DEFCONST in both machacks.l and loop.l, and
they are different. If a LOOP call appears in a program being compiled
with Maclisp compatibility, the autoloading of loop.o will result in
the definition of DEFCONST in loop.o overriding the one in machacks.o.
In any case, both don't work properly in terms of pervading the "declare
special" through compiles and loads. The "defvar" in macros.l does work
properly, and "defconst" in machacks.l should be modified to work like
"defvar", which uses some strange feature named "liszt-declare".
I suggest that "loop.l" should not redefine any standard functions
(names such as "loop-internal-defconst" would be more appropriate for
the internal functions) and "defconst" in "machacks.l" needs to be fixed.
REPEAT BY:
1. Compile something in Maclisp mode which begins by making
macros pervasive with (declare (macros t)), and uses DEFCONST.
2. Load the above into another compilation and reference the
variable mentioned in the DEFCONST, and see if the compiler
issues a "declared special by compiler" warning message.
It does for me.
_______________________________________________________________________________
lisp/Makefile--ucb root%oregon-grad.csnet at csnet-relay.arpa 21 Aug 84 +FIX
In the 4.2 BSD distribution, files in /usr/lib/lisp are
minor version number .69, whereas the lisp and liszt binaries,
and the source for the Franz Lisp system, is .79.
Also, a "make slow" of the Franz Lisp system does not
adequately clean out the old *.o files in /usr/lib/lisp.
REPEAT BY:
Inspection: "strings -a /usr/lib/lisp/version.o" shows it to be
minor version number .69, whereas "lisp" and "liszt" reports
.79. This can result in a newly-built lisp and liszt reporting
.69, if the following is done:
% cd /usr/src/ucb/lisp
% make fast
(No "make copylibrary" was done since it was believed that
/usr/lib/lisp was already the same as the source, since both
were as distributed with 4.2 BSD.)
This results in lisp and liszt being minor version .69,
made from the .69 versions of /usr/lib/lisp/*.l .
Later, when this is done:
% make copylibrary
% make slow
the minor version remains .69, since the copylibrary is done
with "tar", which preserves the original dates of the *.l
source files, the /usr/lib/lisp/*.o files from the previous
"make fast" have later dates than these *.l files, and hence
the *.o files are not rebuilt from the version .79 *.l files, so
the *.o files remain version .69. These *.o files are then
used to build lisp and liszt.
FIX:
Obviously, the distributed /usr/lip/lisp should be made
consistent with the source.
However, the following change to the Makefile should be made
to ensure that the /usr/lib/lisp/*.o files get rebuilt during
a "make slow":
137c137
< (X=`pwd`; cd ${LibDir} ; make Liszt=$$X/${LisztD}/nliszt all)
---
> (X=`pwd`; cd ${LibDir} ; make Liszt=$$X/${LisztD}/nliszt clean all)
RCS log message:
----------------------------
Added "clean" to /usr/lib/lisp portion of "make slow", to avoid
this situation:
1. Installer does "make fast", leaving new .o and .x files in
/usr/lib/lisp.
2. Installer later does "make copylibrary". Since this is done
with "tar", original dates of .l files are preserved.
3. A subsequent "make slow" (before the "clean" was added) will
believe that /usr/lib/lisp is up-to-date, since new .l files
are older than .o and .x files left from previous "make fast".
----------------------------
Bruce Jerrick
Oregon Graduate Center
(503) 645-1121 ex. 355
CSNet: bruce at Oregon-Grad
UUCP: ...tektronix!ogcvax!bruce
_______________________________________________________________________________
lisp/Makefile--ucb lepreau at utah-cs (Jay Lepreau) 14 Nov 83 +FIX
The top-level Makefile fails to pass on flags via the
${MFLAGS} macro, contrary to convention. This is the real
problem; however, this in combination with a both in
lisp/franz/Makefile cause "make -k clean" to fail:
that one needs a -f flag to rm on its clean entry.
REPEAT BY:
cd /usr/src/ucb/lisp; make clean (or make -k clean)
FIX:
Add ${MFLAGS} on every invocation of make on a subdir.
Add the -f flag.
_______________________________________________________________________________
lisp/franz--ucb jbn at FORD-WDL1.ARPA 6 Mar 84
Franz reader improperly converts atom names beginning with digits
when (sstatus uctolc t) is enabled, as in Maclisp mode.
A name of the form "1FOO" reads in as "1foo" but
"1DOO" reads in as "1Doo", because the reader tries to scan
the name as a number and accepts the D (or E) as a possible
exponent indicator. When "getnum" finds a non-numeric after
the "D", it backs out, but does not perform upper case to lower
case conversion when it does so. Thus, the D or E remains in
upper case but the remaining characters get converted to lower
case.
The "D" and "E" characters are hard-coded in "getnum"; it isn't
even possible to fix this by changing the readtable. This makes
the bug serious, since there is no simple work-around.
All Maclisp mode users with names of the form [0-9][DE].* will
have this problem.
REPEAT BY:
(sstatus uctolc t) ; turn on upper case conversion
(print '1ABCDEF) ; prints |1abcdef| -- OK
(terpri)
(print '1DEFABC) ; prints |1Defabc| -- WRONG
(terpri)
_______________________________________________________________________________
lisp/franz/lam7.c--ucb pur-ee!malcolm (Malcolm Slaney) 18 Jan 84 +FIX
The (*process) routine in Opus 38.69 of Franz Lisp does not properly
close the pipe file descripters that the child has open. This problem
only shows up when the user's shell is the Bourne shell. It looks
like csh closes any excess file descripters before exec'ing a
sub-process while the Bourne shell doesn't.
The result for Bourne shell users is that there is no way to pass
an EOF to the sub-process because the sub-process has both ends
of the pipe open.
REPEAT BY:
For users of the Bourne shell.....
SHELL=/bin/sh
export SHELL
lisp
(setq port (*process-send '/bin/cat))
(patom 'hello port)
(close port)
(*process 'ps)
..... You will see that the cat is still running, even
though the lisp end of the pipe is closed.
_______________________________________________________________________________
lisp/franz/vax--ucb salkind at nyu (Lou Salkind) 9 Dec 83 +FIX
rawhlisp can not be built from the distributed sources (several
important franz applications need this).
REPEAT BY:
In the vax directory, type make rawhlisp. You will get _brk
undefined.
_______________________________________________________________________________
lock.c--ucb hpda!hpdsd!edmund (Ed Trujillo) 7 Mar 84 +FIX
When an ctrl-d (EOT) is typed to the lock program, the
fgets call returns NULL. Wherebye the program gets
into an infinite loop dumping ascii 7's (bells) to stdout.
REPEAT BY:
% lock
Key: <type in a key>
Again: <repeat it>
Now hit ctrl-d and the fun begins.
FIX:
The terminal becomes brain damaged due to the handling of
EOT in cooked mode. The fix is simply to put the terminal
in CBREAK mode. See enclosed diff.
31a32
> ntty.sg_flags |= CBREAK;
_______________________________________________________________________________
login.c--bin mark at cbosgd.UUCP 6 Jan 83 +FIX
In /usr/src/cmd/login.c, check the 2nd instance of TIOCLSET.
(The first is an ifdef, the second is an ioctl.) In my copy (which
I think has not changed in that part from 4.1BSD) the 3rd parm passed
to the ioctl is 0. It should be a pointer to a location containing 0.
The symptom of this was than when I made another change to login,
suddenly several bits (nohang, etxack, and intrup) were getting set
when people logged in, and nohang caused the system not to send SIGHUP
when they logged out.
We are still having a similar problem on our dialup - the process
doesn't get a SIGHUP (nor does the DZ notice that carrier is gone)
until the next person dials up. Our dialup is a VENTEL 212+ and I
suspect that the dialer is interactively raising carrier thinking
someone wants to dial out or some such thing.
Mark
_______________________________________________________________________________
lpr--usr.lib hipl!msl at nyu (Mike Landy) 12 Apr 84
The -l switch to lpr doesn't seem to work. If you use it, the spooler entry
does have a "card" beginning with the letter 'l', as it should, but thereafter,
lpf is run without the '-c' switch, which is what I thought should be the
desired effect, leading to control characters being passed. I don't know
whether this is an lpd problem or perhaps a /etc/printcap problem?
Sincerely,
Michael Landy
New York University
Department of Psychology
.....cmcl2!hipl!msl
(212) 598-2249
_______________________________________________________________________________
lpr--usr.lib sun!shannon (Bill Shannon) 19 Dec 83
If you are on a host named "host-a" on network A, which is also
attached to network B and known as "host-b" on network B, and
the system the printer is on is attached to network B, lpr will
spool files to the printer and say they came from "host-a". If
you then try to do lprm, the remote printer system will look up
your Internet address and determine that your are on "host-b"
and therefore won't let you remove the job because "host-a" !=
"host-b", even though they are the same physical host.
REPEAT BY:
See above.
_______________________________________________________________________________
lpr/printjob.c--usr.lib jeff at fluke (Jeff Stearns) 22 Oct 84 +FIX
If a job is queued to a printer with a request that it be indented,
subsequent printouts within the same queue run will be given the
same indentation.
The problem exists because the instantiation of /usr/lib/lpd which
processes the queue doesn't reset all its variables after printing
each job. Specifically, it doesn't reset the indent amount to zero.
REPEAT BY:
Queue two files to a printer, asking that only the first be indented:
% lpr -i8 /tmp/foo; lpr /tmp/foo
Note that BOTH printouts will be indented.
_______________________________________________________________________________
lpr/printjob.c--usr.lib root%oregon-grad.csnet 1 Sep 84 +FIX
Although printcap supports "xc" and "xs" entries to clear
or set local mode bits of a tty, this has no effect because
the tty's line discipline is not set to the "new" discipline.
REPEAT BY:
Include an "xc" or "xs" entry in the /etc/printcap file for a
printer connected via a tty line, then while a job is
printing, do a "pstat -t" to observe that the DISC field is
*not* "ntty", in which case the local mode settings are
ignored (see tty(4)).
Warning: Don't use an "stty > ..." command to check the
settings; it will block while lpd is using the printer.
FIX:
Add lines (marked with '+' below) to printjob.c to set
line discipline if XC or XS is set:
/*
* setup tty lines.
*/
static
setty()
{
struct sgttyb ttybuf;
register struct bauds *bp;
+ int ldisc = NTTYDISC;
.
.
.
if (XC) {
+ if (ioctl(pfd, TIOCSETD, &ldisc) < 0) {
+ log("cannot set tty new line discipline");
+ exit(1);
+ }
.
.
.
if (XS) {
+ if (ioctl(pfd, TIOCSETD, &ldisc) < 0) {
+ log("cannot set tty new line discipline");
+ exit(1);
+ }
.
.
.
=========================================
Bruce Jerrick
Oregon Graduate Center
(503) 645-1121 ex. 355
CSNet: bruce at Oregon-Grad
UUCP: ...tektronix!ogcvax!bruce
_______________________________________________________________________________
GENERAL INFORMATION ON THE 4.2 BUGLIST FROM MT XINU
_________________________________________________________________
--IMPORTANT DISCLAIMERS--
Material in this announcement and the accompanying reports
has been edited and organized by MT XINU as a service to the
UNIX community on a non-profit, non-commercial basis. MT
XINU MAKES NO WARRANTY, EXPRESSED OR IMPLIED, ABOUT THE
ACCURACY, COMPLETENESS, OR FITNESS FOR USE FOR ANY PURPOSE
OF ANY MATERIAL INCLUDED IN THESE REPORTS.
MT XINU welcomes comments in writing about the contents of
these reports via uucp or US mail. MT XINU cannot, however,
accept telephone calls or enter into telephone conversations
about this material.
_________________________________________________________________
Legal difficulties which have delayed the distribution of
4.2bsd buglist summaries by MT XINU have been resolved and
three versions of the buglist are now available.
The current buglist has been derived from reports submitted
to 4bsd-bugs at BERKELEY (not from reports submitted only to
net.bugs.4bsd, for example). Reports are integrated into
the buglist as they are received, so that any distributions
are current to within a week or so.
Buglists now being distributed are essentially "raw". No
judgment has been passed as to whether the submitted bug is
real or not or whether it has been fixed. Only minimal edit-
ing has been done to produce a manageable list. Reports
which are complaints (rather than bug reports) have been
eliminated; obscenities and content-free flames have been
eliminated; and duplicates have been combined. The result-
ing collection contains over 500 bugs.
Three versions of the buglist are now ready for distribu-
tion:
2-Liners:
Two lines per bug, including a concise description, the
affected module, the submittor. Approximately 55K
bytes, it is being distributed to net.sources con-
currently with this announcement.
All-but-Source:
All material, except that all but the most inocuous of
source material has been removed to meet AT&T license
restrictions. Nearly a mega-byte, this will be
distributed to net.sources in several 50K byte pieces
later this week.
A paper listing or mag tape is also available, see
below.
Please note that local usenet size restrictions may
prevent large files from being received and/or
retransmitted. MT XINU will not dump this material on
the net a second time; if your site has not received
material of interest to you within a reasonable time,
please send for a paper or tape copy.
All-with-Source (FOR SOURCE LICENSEES ONLY):
4.2 licensees who also have a suitable AT&T source
license can obtain a tape containing all the material,
including proposed source fixes where such were submit-
ted.
Once again, MT XINU has not evaluated, tested or passed
judgment on proposed fixes; all we have done is organ-
ize the collection and eliminate obvious irrelevancies
and duplications.
A free paper copy of the All-but-Source list can be obtained
by sending mail to:
MT XINU
739 Allston Way
Berkeley CA 94710
attn: buglist
or electronic mail to:
ucbvax!mtxinu!buglist
(Be sure to include your US mail address!)
For a tape, send a check for $110 or a purchase order for
$150 to cover MT XINU's costs to the address given above
(California orders add sales tax). For the All-with-Source
list, mail us a request for the details of license verifica-
tion at either of the above addresses.
More information about the Comp.sources.unix
mailing list