[comp.os.xinu] Old Bug uncovered

sdo@PURDUE.EDU (Shawn Ostermann) (02/08/89)

(A little trivia for pointer buffs)

I was helping the VM Xinu guys track down a bug, and found a coding
mistake that has been living in a library file for years.  The bug is
in the library file src/lib/libxc/doscan.c, and the interesting
parts are as follows (watch the variable fileended):

MANY LINES DELETED

/* doscan.c - doscan */
...
_doscan( ... )
{
	int **ptr, fileended, size;

        ...

	fileended = 0;

        ...

                if (_innum(ptr, ch, len, size, getch, ungetch, 
                        arg1, arg2, fileended) && ptr)
        ...
}

...

_innum(ptr, type, len, size, getch, ungetch, arg1, arg2, eofptr)
   ...
        int     *eofptr;
{
    ...
	if (c != EOF) {
                (*ungetch)(arg1, arg2);
		*eofptr = 0;
	} else
		*eofptr = 1;
    ...
}

_innum is trying to use eofptr as a flag for doscan.  The mistake (as
you've ALL already seen (-: ) is that the call to innum SHOULD be
                if (_innum(ptr, ch, len, size, getch, ungetch, 
                        arg1, arg2, &fileended) && ptr)
                                    ^

to pass the ADDRESS of fileended, rather than a null pointer.  The bug
was never noticed in the old Xinu stuff because address 0 was writable,
and not used.  In VM Xinu, however, that is an illegal address for
some processes, and the dereferencing causes a page fault (that's how
I found it).  A little poking around found that this routine has been
included faithfully in all of the architecture distributions that I
looked at.  This will probably never affect anyone using the old Xinu
stuff, but if you're a stickler for good pointer grammar, you might
want to fix it.

The moral of the story:
Boy I'm glad that this module was written before I started working on the
Xinu project, that way (for once) it's not my fault!!!
(no pun intended)
Anybody out there in Xinu land wanna own up to it????!!!

Shawn
-----------------------------------------------------------------------------
Shawn Ostermann      ARPA:  sdo@cs.purdue.edu      UUCP:  ...!purdue!sdo
-----------------------------------------------------------------------------

krr@PURDUE.EDU (02/09/89)

Ha!  I just checked the ConcurrenC version of Xinu, and this version is
correct! I just copied and modified the Unix(t) system's doscan, so Xinu's
bug was not propigated.


- Ken Rodemann		krr@cs.purdue.edu
			{ihnp4, ucbvax, decvax, pur-ee}!purdue!krr


(t) Unix is a five letter word, and is a trademark of AT&T Bell Laboratories.

raj@PURDUE.EDU (02/09/89)

>Ha!  I just checked the ConcurrenC version of Xinu, and this version is
>correct! I just copied and modified the Unix(t) system's doscan, so Xinu's
>bug was not propigated.


>- Ken Rodemann		krr@cs.purdue.edu
>			{ihnp4, ucbvax, decvax, pur-ee}!purdue!krr


>(t) Unix is a five letter word, and is a trademark of AT&T Bell Laboratories.

Software reuseabilty is wonderful.

Raj