Subject: Re: IPSEC still fails on BETA2/vax (not anymore!)
To: Olaf Seibert <rhialto@polderland.nl>
From: Jaromir Dolecek <jdolecek@netbsd.org>
List: current-users
Date: 07/18/2002 14:02:40
--ELM728330593-3077-0_
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=US-ASCII
Can you try if appended patch would be sufficient to fix the stack
overflow problem with IPsec?
Olaf Seibert wrote:
> On Mon 15 Jul 2002 at 13:09:43 +0200, Jaromir Dolecek wrote:
> > BTW, can you try -current (1.6D) kernel without your stack size
> > changes? There was a fix to kernel stack usage for IPsec committed
> > not too long ago, and the fix has not been pulled up to 1.6 branch
> > yet.
>
> I tried it just now (source supped 15 july). The results are better than
> with the unmodified 1.5ZC kernel: ESP ping traffic works now without
> overflowing the interrupt stack. The NFS mount however still overflows
> the kernel stack with the following backtrace:
>
> bash-2.04# mount /vol1
> panic: kernel stack invalid
> Stopped in pid 170 (mount_nfs) at trap+0x174: tstl 64(r8)
> db> tr
> panic: kernel stack invalid
> Stack traceback :
> 0x80336b34: trap+0x174(0x80336bb4)
> 0x80336bb4: trap type=0xf code=0x0 pc=0x8012a96c psl=0xcc0008
> 0x80336b80: SHA1Transform+0x15a(0x8aae94f4,0x8aae9510)
> 0x8aae9470: SHA1Update+0x66(0x8aae94f4,0x801904ac,0x200)
> 0x8aae94a8: rndpool_extract_data+0x5a(0x80190484,0x886822f0,0x8,0)
> 0x8aae9550: rnd_extract_data+0x23(0x886822f0,0x8,0)
> 0x8aae9590: key_randomfill+0x1a(0x886822f0,0x8)
> 0x8aae95bc: key_sa_stir_iv+0x25(0x88694380)
> 0x8aae95e8: esp_cbc_encrypt+0x457(0x80dc2200,0x14,0x68,0x88694380,0x801648a0,0x8
> )
> 0x8aae9648: esp_output+0x60b(0x80dc2200,0x80dc22f5,0x81ecd100,0x88602a00,0x2)
> 0x8aae96c0: esp4_output+0x42(0x80dc2200,0x88602a00)
> 0x8aae9704: ipsec4_output+0x22f(0x8aae97a4,0x8868b240,0)
> 0x8aae9728: ip_output+0x637(0x81ecd100,0,0x81372384,0,0)
> 0x8aae97c8: udp_output+0x19a(0x80dc2900,0x81372364)
> 0x8aae980c: udp_usrreq+0x1ca(0x8139967c,0x9,0x80dc2900,0x805d3500,0,0x81f7871c)
> 0x8aae9844: sosend+0x4b3(0x8139967c,0x805d3500,0,0x80dc2900,0,0)
> 0x8aae98a8: nfs_send+0x87(0x8139967c,0x805d3500,0x80dc2900,0x88696300)
> 0x8aae98f0: nfs_request+0x2a6(0x80d10034,0x80dc2a00,0x13,0x81f7871c,0x8867ca00,0
> x8aae99d4,0x8aae99d8,0x8aae99dc)
> 0x8aae997c: nfs_fsinfo+0x1e3(0x88602200,0x80d10034,0x8867ca00,0x81f7871c)
> 0x8aae99e8: nfs_bioread+0x80(0x80d10034,0x8aae9bb0,0,0x8867ca00,0x1)
> 0x8aae9acc: nfs_readdir+0x65(0x8aae9b50)
> 0x8aae9b1c: VOP_READDIR+0x4f(0x80d10034,0x8aae9bb0,0x8867ca00,0x8aae9b9c,0x8aae9
> ba0,0x8aae9ba4)
> 0x8aae9b6c: nfs_cookieheuristic+0x6f(0x80d10034,0x886023c0,0x81f7871c,0x8867ca00
> )
> 0x8aae9bd0: mountnfs+0x1f8(0x8aae9dc8,0x88685000,0x805d3500,0x8aae9d6c,0x8aae9d1
> 0,0x8aae9cc4,0x81f7871c)
> 0x8aae9c78: nfs_mount+0x135(0x88685000,0x7ffffca9,0x7ffffacc,0x8aae9e58,0x81f787
> 1c)
> 0x8aae9e10: sys_mount+0x2dc(0x81f7871c,0x8aae9f60,0x8aae9f58)
> 0x8aae9f14: syscall+0x10f(0x8aae9fb4)
> db>
>
> I wonder how close the interrupt stack comes to overflowing - I don't
> suppose there is an easy way to determine this. Perhaps I can pre-fill
> it with known data and then examine it periodically. How do I break into
> ddb from the serial console on a VAX? I find code in vax/vsa/lkc.c for a
> graphics console (ctrl-alt-esc) - perhaps I'll need to add that too.
>
> > Jaromir
> -Olaf.
> --
> ___ Olaf 'Rhialto' Seibert - rhialto@ -- Woe betide the one who feels
> \X/ polderland.nl -- remorse without sin - Tom Poes, "Het boze oog", 4444.
>
--
Jaromir Dolecek <jdolecek@NetBSD.org> http://www.NetBSD.org/Ports/i386/ps2.html
-=- We should be mindful of the potential goal, but as the tantric -=-
-=- Buddhist masters say, ``You may notice during meditation that you -=-
-=- sometimes levitate or glow. Do not let this distract you.'' -=-
--ELM728330593-3077-0_
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=ISO-8859-2
Content-Disposition: attachment; filename=nfsmountstfix.diff
Index: nfs_vfsops.c
===================================================================
RCS file: /cvsroot/syssrc/sys/nfs/nfs_vfsops.c,v
retrieving revision 1.112
diff -u -p -r1.112 nfs_vfsops.c
--- nfs_vfsops.c 2001/12/04 18:38:08 1.112
+++ nfs_vfsops.c 2002/07/18 12:01:06
@@ -560,9 +560,9 @@ nfs_mount(mp, path, data, ndp, p)
struct nfs_args args;
struct mbuf *nam;
struct vnode *vp;
- char pth[MNAMELEN], hst[MNAMELEN];
+ char *pth=NULL, *hst=NULL;
size_t len;
- u_char nfh[NFSX_V3FHMAX];
+ u_char *nfh=NULL;
error = copyin(data, (caddr_t)&args, sizeof (struct nfs_args));
if (error)
@@ -591,25 +591,36 @@ nfs_mount(mp, path, data, ndp, p)
nfs_decode_args(nmp, &args);
return (0);
}
+ /* sockargs() call must be after above copyin() calls */
+ error = sockargs(&nam, (caddr_t)args.addr, args.addrlen, MT_SONAME);
+ if (error)
+ return (error);
if (args.fhsize < 0 || args.fhsize > NFSX_V3FHMAX)
return (EINVAL);
+ MALLOC(nfh, u_char *, NFSX_V3FHMAX, M_TEMP, M_WAITOK);
error = copyin((caddr_t)args.fh, (caddr_t)nfh, args.fhsize);
if (error)
- return (error);
+ goto out;
+ MALLOC(pth, char *, MNAMELEN, M_TEMP, M_WAITOK);
error = copyinstr(path, pth, MNAMELEN-1, &len);
if (error)
- return (error);
+ goto out;
memset(&pth[len], 0, MNAMELEN - len);
+ MALLOC(hst, char *, MNAMELEN, M_TEMP, M_WAITOK);
error = copyinstr(args.hostname, hst, MNAMELEN-1, &len);
if (error)
- return (error);
+ goto out;
memset(&hst[len], 0, MNAMELEN - len);
- /* sockargs() call must be after above copyin() calls */
- error = sockargs(&nam, (caddr_t)args.addr, args.addrlen, MT_SONAME);
- if (error)
- return (error);
args.fh = nfh;
error = mountnfs(&args, mp, nam, pth, hst, &vp, p);
+
+ out:
+ FREE(nfh, M_TEMP);
+ if (pth)
+ FREE(pth, M_TEMP);
+ if (hst)
+ FREE(hst, M_TEMP);
+
return (error);
}
@@ -628,7 +639,7 @@ mountnfs(argp, mp, nam, pth, hst, vpp, p
struct nfsmount *nmp;
struct nfsnode *np;
int error;
- struct vattr attrs;
+ struct vattr *attrs;
struct ucred *cr;
/*
@@ -727,15 +738,17 @@ mountnfs(argp, mp, nam, pth, hst, vpp, p
if (error)
goto bad;
*vpp = NFSTOV(np);
- VOP_GETATTR(*vpp, &attrs, p->p_ucred, p);
+ MALLOC(attrs, struct vattr *, sizeof(struct vattr), M_TEMP, M_WAITOK);
+ VOP_GETATTR(*vpp, attrs, p->p_ucred, p);
if ((nmp->nm_flag & NFSMNT_NFSV3) && ((*vpp)->v_type == VDIR)) {
cr = crget();
- cr->cr_uid = attrs.va_uid;
- cr->cr_gid = attrs.va_gid;
+ cr->cr_uid = attrs->va_uid;
+ cr->cr_gid = attrs->va_gid;
cr->cr_ngroups = 0;
nfs_cookieheuristic(*vpp, &nmp->nm_iflag, p, cr);
crfree(cr);
}
+ FREE(attrs, M_TEMP);
/*
* A reference count is needed on the nfsnode representing the
--ELM728330593-3077-0_--