On Tue, 30 Sep 2008, Max Laier wrote:

On Tuesday 30 September 2008 00:02:04 Robert Watson wrote:
On Mon, 29 Sep 2008, Max Laier wrote:
Please help testing. It's been confirmed to work for IPFW, let's make sure pf is in good shape, too. Thanks.

A casual glance at pf.c suggests that pf(4) doesn't suffer from the "look up the inpcb even though it's passed down if the socket pointer is NULL" bug that ipfw(4) did, but confirmation that things work properly would definitely be good.

http://www.freebsd.org/cgi/query-pr.cgi?pr=127439 looks like it could be related. I think I see what's happening there, but unfortunately I don't have any time to look into it myself at the moment. Might be a while before I get to it so additional eyes are certainly appreciated!

There are a number of LOR's in this PR; some are harmless. Here's a quick and casual run-down:

  1st 0xc0907fcc pf task mtx (pf task mtx) @
  /usr/src/sys/contrib/pf/net/pf_ioctl.c:1394
  2nd 0xc0973488 ifnet (ifnet) @ /usr/src/sys/net/if.c:1558

I don't know anything about this.

  1st 0xc097830c tcp (tcp) @ /usr/src/sys/netinet/tcp_input.c:400
  2nd 0xc09775d8 PFil hook read/write mutex (PFil hook read/write mutex) @
  /usr/src/sys/net/pfil.c:73

This should be fixed by one of my recent TCP changes -- TCP wasn't passing down the inpcb in a situation where it should have been.

  1st 0xc4013d44 udpinp (udpinp) @ /usr/src/sys/netinet/udp_usrreq.c:878
  2nd 0xc09775d8 PFil hook read/write mutex (PFil hook read/write mutex) @
  /usr/src/sys/net/pfil.c:73

This is the correct order.

  1st 0xc423f150 tcpinp (tcpinp) @ /usr/src/sys/netinet/tcp_usrreq.c:472
  2nd 0xc09775d8 PFil hook read/write mutex (PFil hook read/write mutex) @
  /usr/src/sys/net/pfil.c:73

This is the correct order.

  1st 0xc09786cc udp (udp) @ /usr/src/sys/netinet/udp_usrreq.c:395
  2nd 0xc09775d8 PFil hook read/write mutex (PFil hook read/write mutex) @
  /usr/src/sys/net/pfil.c:73

This is the correct order.

  panic: _rw_rlock (tcp): wlock already held @
  /usr/src/sys/contrib/pf/net/pf.c:3016
  cpuid = 0
  KDB: stack backtrace:
  db_trace_self_wrapper(c088cf61,e6846220,c05ae7df,c08b659d,0,...) at
  db_trace_self_wrapper+0x26
  kdb_backtrace(c08b659d,0,c0889c7e,e684622c,0,...) at kdb_backtrace+0x29
  panic(c0889c7e,c085a754,c088f55e,c087092d,bc8,...) at panic+0x10f
  _rw_rlock(c097830c,c087092d,bc8,c08d9624,c087092d,...) at _rw_rlock+0x73
  pf_socket_lookup(2,e68463dc,0,cc4,3,...) at pf_socket_lookup+0x208
  pf_test_tcp(e6846444,e6846440,2,c3efee00,c3c8e900,...) at pf_test_tcp+0x142
  pf_test6(2,c3d44000,e68464a0,0,0,...) at pf_test6+0x8a0
  pf_check6_out(0,e68464a0,c3d44000,2,0,...) at pf_check6_out+0x47
  pfil_run_hooks(c097ad00,e6846638,c3d44000,2,0,...) at pfil_run_hooks+0x88
  ip6_output(c3c8e900,0,e6846618,0,0,...) at ip6_output+0x122e
  pf_send_tcp(c4fcfe00,c41259b4,1c,c4fcfe5c,c4fcfe4c,...) at pf_send_tcp+0x6dd
  pf_test_tcp(e68468e8,e68468e4,2,c3f20900,c4fcfe00,...) at pf_test_tcp+0xcef
  pf_test6(2,c3f06400,e6846944,0,c446b7bc,...) at pf_test6+0x8a0
  pf_check6_out(0,e6846944,c3f06400,2,c446b7bc,...) at pf_check6_out+0x47
  pfil_run_hooks(c097ad00,e6846adc,c3f06400,2,c446b7bc,...) at
  pfil_run_hooks+0x88
  ip6_output(c4fcfe00,0,e6846abc,0,0,...) at ip6_output+0x122e
  tcp_output(c45553a0,c447e7c0,201,c446b858,c45553a0,...) at tcp_output+0x137e
  tcp6_usr_connect(c50cd340,c447e7c0,c4eed690,25,e6846c64,...) at
  tcp6_usr_connect+0x171
  soconnect(c50cd340,c447e7c0,c4eed690,1c,16,...) at soconnect+0x52
  kern_connect(c4eed690,3,c447e7c0,c447e7c0,0,...) at kern_connect+0x59
  connect(c4eed690,e6846cfc,c,c08a288e,c08d3a50,...) at connect+0x46
  syscall(e6846d38) at syscall+0x274

This looks like a recursion bug in pf(4) -- you can't look up sockets in that output context because youre already running in a context where connection locks are held. If it's for the same TCP connection, you need to pass down the inpcb into ip6_output(), but if it's for a different one, you ned to run the output code in a deferred context so that it can recurse safely back into the inpcb code.

Robert N M Watson
Computer Laboratory
University of Cambridge


Thanks,

Robert N M Watson
Computer Laboratory
University of Cambridge

----------  Forwarded Message  ----------

Subject: Please test ipfw and pf uid/gid/jail rules
Date: Monday 29 September 2008
From: Robert Watson <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]


Dear all:

Although it didn't show up in 8.x testing to date, it turned out there
was a serious stability regression in the ipfw uid/gid/jail rule
implementation as a result of moving to rwlocks for inpcbinfo and inpcb.
I think I've corrected the sources of the problem in 8.x and 7.x now, but
it would be very helpful if people who use ipfw and pf could do some
extra testing of these rules with invariants and witness enabled to see
if we can't shake out any remaining problems.

Thanks,

Robert N M Watson
Computer Laboratory
University of Cambridge
-------------------------------------------------------
--
/"\  Best regards,                      | [EMAIL PROTECTED]
\ /  Max Laier                          | ICQ #67774661
X   http://pf4freebsd.love2party.net/  | [EMAIL PROTECTED]
/ \  ASCII Ribbon Campaign              | Against HTML Mail and News

--
/"\  Best regards,                      | [EMAIL PROTECTED]
\ /  Max Laier                          | ICQ #67774661
X   http://pf4freebsd.love2party.net/  | [EMAIL PROTECTED]
/ \  ASCII Ribbon Campaign              | Against HTML Mail and News

_______________________________________________
freebsd-pf@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-pf
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to