Build GENERIC with IPX support

Jeremy Chadwick jdc at koitsu.org
Mon May 13 06:52:08 UTC 2013


On Mon, May 13, 2013 at 08:07:42AM +0200, Marek Salwerowicz wrote:
> W dniu 2013-05-13 00:45, Adrian Chadd pisze:
> >It's supported as long as someone wants to use it and can help in at
> >least diagnosing issues.
> >
> >So, if you have a segfault, run it inside gdb and report where its dying.
> >
> >Chances are things have just bitrotted a bit but not so much that it's
> >worth killing.
> 
> # gdb ncplogin
> GNU gdb 6.1.1 [FreeBSD]
> Copyright 2004 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain
> conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB.  Type "show warranty" for details.
> This GDB was configured as "amd64-marcel-freebsd"...(no debugging
> symbols found)...
> (gdb) run
> Starting program: /usr/bin/ncplogin
> (no debugging symbols found)...(no debugging symbols found)...(no
> debugging symbols found)...(no debugging symbols found)...
> Program received signal SIGSEGV, Segmentation fault.
> 0x0000000800d285f7 in strlen () from /lib/libc.so.7
> (gdb) bt
> #0  0x0000000800d285f7 in strlen () from /lib/libc.so.7
> #1  0x0000000800d205b0 in gettimeofday () from /lib/libc.so.7
> #2  0x0000000800d2163e in gettimeofday () from /lib/libc.so.7
> #3  0x0000000800d21798 in vfprintf_l () from /lib/libc.so.7
> #4  0x0000000800d0e701 in fprintf () from /lib/libc.so.7
> #5  0x0000000800822a85 in ncp_error () from /usr/lib/libncp.so.4
> #6  0x000000080081fa7c in ncp_li_readrc () from /usr/lib/libncp.so.4
> #7  0x0000000000400ea7 in ?? ()
> #8  0x0000000000400d2e in ?? ()
> #9  0x000000080061c000 in ?? ()
> #10 0x0000000000000000 in ?? ()
> #11 0x0000000000000001 in ?? ()
> #12 0x00007fffffffddf8 in ?? ()
> #13 0x0000000000000000 in ?? ()
> #14 0x00007fffffffde0a in ?? ()
> #15 0x00007fffffffde1e in ?? ()
> #16 0x00007fffffffde35 in ?? ()
> #17 0x00007fffffffde3d in ?? ()
> #18 0x00007fffffffde49 in ?? ()
> #19 0x00007fffffffde52 in ?? ()
> #20 0x00007fffffffde67 in ?? ()
> #21 0x00007fffffffde74 in ?? ()
> #22 0x00007fffffffde88 in ?? ()
> #23 0x00007fffffffdee5 in ?? ()
> #24 0x00007fffffffdef3 in ?? ()
> #25 0x00007fffffffdf07 in ?? ()
> #26 0x00007fffffffdf12 in ?? ()
> #27 0x00007fffffffdf1d in ?? ()
> #28 0x00007fffffffdf27 in ?? ()
> #29 0x00007fffffffdf40 in ?? ()
> #30 0x00007fffffffdf50 in ?? ()
> #31 0x00007fffffffdf5e in ?? ()
> #32 0x0000000000000000 in ?? ()
> #33 0x0000000000000003 in ?? ()
> #34 0x0000000000400040 in ?? ()
> #35 0x0000000000000004 in ?? ()
> #36 0x0000000000000038 in ?? ()
> #37 0x0000000000000005 in ?? ()
> #38 0x0000000000000008 in ?? ()
> #39 0x0000000000000006 in ?? ()
> #40 0x0000000000001000 in ?? ()
> #41 0x0000000000000008 in ?? ()
> #42 0x0000000000000000 in ?? ()
> #43 0x0000000000000009 in ?? ()
> #44 0x0000000000400ca0 in ?? ()
> #45 0x0000000000000007 in ?? ()
> #46 0x0000000800601000 in ?? ()
> #47 0x000000000000000f in ?? ()
> #48 <signal handler called>
> #49 0x0000000000000000 in ?? ()
> Previous frame inner to this frame (corrupt stack?)
> (gdb)
> 
> #
> 
> my /etc/rc.conf file contains these lines:
> 
> ifconfig_em0f1_ipx="ipx 0x01230000.1"
> ipxrouted_enable="YES"
> 
> and in /boot/loader.conf:
> if_ef_load="YES"
> 
> What's more, the 'ncplist s' command is unable to find any NetWare servers:
> # ncplist s
> Can't find any file server
> #
> 
> But Frame type (802.3) and network number  (0x0123) are correct.

Without debugging symbols this will be annoying to debug.  From a brief
skim of the code, it looks like the author has very horrible error
checking and makes a lot of assumptions about the user's environment
(dot files, etc.).

IPX has been neglected for what should be obvious reasons.  As someone
who got his CNE back in 1994 (circa Netware 3.11), you're the first
person I have encountered since roughly 1997 who is actively using IPX.
Netware does support TCP/IP, you know...

Anyway, in your case, you're in luck:

> #0  0x0000000800d285f7 in strlen () from /lib/libc.so.7
> #1  0x0000000800d205b0 in gettimeofday () from /lib/libc.so.7
> #2  0x0000000800d2163e in gettimeofday () from /lib/libc.so.7
> #3  0x0000000800d21798 in vfprintf_l () from /lib/libc.so.7
> #4  0x0000000800d0e701 in fprintf () from /lib/libc.so.7
> #5  0x0000000800822a85 in ncp_error () from /usr/lib/libncp.so.4
> #6  0x000000080081fa7c in ncp_li_readrc () from /usr/lib/libncp.so.4

ncp_li_readrc(), which is part of libncp, only has one call to
ncp_error() in it:

src/lib/libncp/ncpl_conn.c --

180 /*
181  * read rc file as follows:
182  * 1. read [server] section
183  * 2. override with [server:user] section
184  * Since abcence of rcfile is not a bug, silently ignore that fact.
185  * rcfile never closed to reduce number of open/close operations.
186  */
187 int
188 ncp_li_readrc(struct ncp_conn_loginfo *li) {
189         int i, val, error;
190         char uname[NCP_BINDERY_NAME_LEN*2+1];
191         char *sect = NULL, *p;
192
193         /*
194          * if info from cmd line incomplete, try to find existing
195          * connection and fill server/user from it.
196          */
197         if (li->server[0] == 0 || li->user == NULL) {
198                 int connHandle;
199                 struct ncp_conn_stat cs;
200
201                 if ((error = ncp_conn_scan(li, &connHandle)) != 0) {
202                         ncp_error("no default connection found", errno);
203                         return error;
204                 }

To me, this may indicate you have some kind of "ncp rc file" (I believe
this is ~/.nwfsrc according to the ncplist(1) man page) that may contain
something invalid, or maybe you lack such a file altogether (creating one
might work around the problem).

Back to the actual segfault itself: ncp_error() is pretty simple:

src/lib/libncp/ncpl_subr.c --

447 /*
448  * Print a (descriptive) error message
449  * error values:
450  *         0 - no specific error code available;
451  *  -999..-1 - NDS error
452  *  1..32767 - system error
453  *  the rest - requester error;
454  */
455 void
456 ncp_error(const char *fmt, int error, ...) {
457         va_list ap;
458
459         fprintf(stderr, "%s: ", _getprogname());
460         va_start(ap, error);
461         vfprintf(stderr, fmt, ap);
462         va_end(ap);
463         if (error == -1)
464                 error = errno;
465         if (error > -1000 && error < 0) {
466                 fprintf(stderr, ": dserr = %d\n", error);
467         } else if (error & 0x8000) {
468                 fprintf(stderr, ": nwerr = %04x\n", error);
469         } else if (error) {
470                 fprintf(stderr, ": syserr = %s\n", strerror(error));
471         } else
472                 fprintf(stderr, "\n");
473 }

What I don't understand from the calling stack is how gettimeofday() is
involved.  I have looked at the libc code, looked at the underlying
calling functions and so on (from fprintf() to vfprintf_l() and deeper),
and I don't see how or where gettimeofday() would be called.  The only
place I can think of might be the related locale stuff, but I'm doubting
that given what I've looked at but could still be wrong.

Have world/kernel on this system ever been rebuilt?  If they have,
were both kernel and world rebuilt together from the same source code
and not at different times?

If you're setting LANG, LC_CTYPE, LC_COLLATE, or other locale-oriented
settings in your environment (and my gut feeling is that you are), you
could try removing them and see if you get an actual useful error
message on stderr, but I'm not holding my breath.

I cannot help you with the remaining IPX-specific "stuff"; it's fairly
obvious though, as I said, that this code has been neglected.

-- 
| Jeremy Chadwick                                   jdc at koitsu.org |
| UNIX Systems Administrator                http://jdc.koitsu.org/ |
| Mountain View, CA, US                                            |
| Making life hard for others since 1977.             PGP 4BD6C0CB |


More information about the freebsd-stable mailing list