if_tap unaligned access problem

John-Mark Gurney gurney_j at resnet.uoregon.edu
Mon May 2 11:09:14 PDT 2005


Maksim Yevmenkin wrote this message on Mon, May 02, 2005 at 09:38 -0700:
> >>>>>>i think we have few options here:
> >>>>>>
> >>>>>>1) revert back original tapwrite function that was changed in v. 
> >>>>>>1.48 and set offset to 2 bytes in top mbuf
> >>>>>>
> >>>>>>2) change current version of tapwrite so it would m_prepend and 
> >>>>>>m_pullup mbuf after m_uiotombuf
> >>>>>>
> >>>>>>3) change m_uiotombuf to accept one more parameter - mbuf offset at 
> >>>>>>which data should be copied. there are not that many users of 
> >>>>>>m_uiotombuf
> >>
> >>please find and review the attached patch (untested) that implements 
> >>option (3) above.
> 
> any objections to the attached (revised) patch? can i commit it?
> 
> thanks,
> max

> Index: sys/kern/uipc_mbuf.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/kern/uipc_mbuf.c,v
> retrieving revision 1.147
> diff -u -r1.147 uipc_mbuf.c
> --- sys/kern/uipc_mbuf.c	17 Mar 2005 19:34:57 -0000	1.147
> +++ sys/kern/uipc_mbuf.c	2 May 2005 16:33:41 -0000
> @@ -1333,7 +1333,7 @@
>  #endif
>  
>  struct mbuf *
> -m_uiotombuf(struct uio *uio, int how, int len)
> +m_uiotombuf(struct uio *uio, int how, int len, int align)
>  {
>  	struct mbuf *m_new = NULL, *m_final = NULL;
>  	int progress = 0, error = 0, length, total;
> @@ -1342,12 +1342,15 @@
>  		total = min(uio->uio_resid, len);
>  	else
>  		total = uio->uio_resid;
> -	if (total > MHLEN)
> +	if (align >= MHLEN)
> +		goto nospace;
> +	if (total + align > MHLEN)

I kinda noticed this a bit ago, but didn't think much of it till now...
do we want to allow align >= MHLEN if total requires a cluster?  since
if we use a cluster, we'd have enough space for a larger align...

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."


More information about the freebsd-net mailing list