Print this page
12976 system panics with error in IP module
Reviewed by: Andy Fiddaman <andy@omniosce.org>
Reviewed by: Paul Winder <p.winder@me.com>
*** 19,28 ****
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2020 Joyent, Inc.
*/
/*
* IP PACKET CLASSIFIER
*
*** 2743,2753 ****
if ((connp->conn_state_flags & CONN_CLOSING)) {
mutex_exit(&connp->conn_lock);
return (NULL);
}
! mutex_exit(&connp->conn_lock);
if (connp->conn_upper_handle != NULL) {
vn = (*connp->conn_upcalls->su_get_vnode)
(connp->conn_upper_handle);
} else if (!IPCL_IS_NONSTR(connp) && connp->conn_rq != NULL) {
--- 2744,2758 ----
if ((connp->conn_state_flags & CONN_CLOSING)) {
mutex_exit(&connp->conn_lock);
return (NULL);
}
! /*
! * Continue to hold conn_lock because we don't want to race with an
! * in-progress close, which will have set-to-NULL (and destroyed
! * upper_handle, aka sonode (and vnode)) BEFORE setting CONN_CLOSING.
! */
if (connp->conn_upper_handle != NULL) {
vn = (*connp->conn_upcalls->su_get_vnode)
(connp->conn_upper_handle);
} else if (!IPCL_IS_NONSTR(connp) && connp->conn_rq != NULL) {
*** 2755,2764 ****
--- 2760,2771 ----
if (vn != NULL)
VN_HOLD(vn);
flags |= MIB2_SOCKINFO_STREAM;
}
+ mutex_exit(&connp->conn_lock);
+
if (vn == NULL || VOP_GETATTR(vn, &attr, 0, CRED(), NULL) != 0) {
if (vn != NULL)
VN_RELE(vn);
return (NULL);
}