PERFORCE change 165382 for review

Gabor Pali pgj at FreeBSD.org
Mon Jun 29 09:52:51 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=165382

Change 165382 by pgj at petymeg-current on 2009/06/29 09:52:22

	Add some additional checks to spcblist routine.

Affected files ...

.. //depot/projects/soc2009/pgj_libstat/src/sys/kern/uipc_usrreq.c#5 edit

Differences ...

==== //depot/projects/soc2009/pgj_libstat/src/sys/kern/uipc_usrreq.c#5 (text+ko) ====

@@ -1514,17 +1514,18 @@
 	UNP_LIST_UNLOCK();
 
 	unp_list = malloc(us.us_count * sizeof(*unp_list), M_TEMP, M_WAITOK);
+	if (unp_list == NULL)
+		return (ENOMEM);
 
 	UNP_LIST_LOCK();
 	for (unp = LIST_FIRST(head), i = 0; (unp != NULL) && (i < us.us_count);
 	     unp = LIST_NEXT(unp, unp_link)) {
 		UNP_PCB_LOCK(unp);
-		if (unp->unp_gencnt <= us.us_gencnt) {
-			if (cr_cansee(req->td->td_ucred,
-			    unp->unp_socket->so_cred) == 0) {
-				unp_list[i++] = unp;
-				unp->unp_refcount++;
-			}
+		if (unp->unp_gencnt <= us.us_gencnt &&
+		    cr_cansee(req->td->td_ucred,
+		    unp->unp_socket->so_cred) == 0) {
+			unp_list[i++] = unp;
+			unp->unp_refcount++;
 		}
 		UNP_PCB_UNLOCK(unp);
 	}
@@ -1546,25 +1547,27 @@
 		unp->unp_refcount--;
 		if (unp->unp_refcount != 0 && unp->unp_gencnt <= us.us_gencnt) {
 			bzero(&ud, sizeof(ud));
+			ud.ud_gencnt = unp->unp_gencnt;
 			sock = unp->unp_socket;
-			ud.ud_gencnt = unp->unp_gencnt;
-			ud.ud_qlen = sock->so_qlen;
-			ud.ud_incqlen = sock->so_incqlen;
-			ud.ud_qlimit = sock->so_qlimit;
-			ud.ud_snd_cc = sock->so_snd.sb_cc;
-			ud.ud_snd_mcnt = sock->so_snd.sb_mcnt;
-			ud.ud_snd_ccnt = sock->so_snd.sb_ccnt;
-			ud.ud_snd_hiwat = sock->so_snd.sb_hiwat;
-			ud.ud_snd_lowat = sock->so_snd.sb_lowat;
-			ud.ud_snd_mbcnt = sock->so_snd.sb_mbcnt;
-			ud.ud_snd_mbmax = sock->so_snd.sb_mbmax;
-			ud.ud_rcv_cc = sock->so_rcv.sb_cc;
-			ud.ud_rcv_mcnt = sock->so_rcv.sb_mcnt;
-			ud.ud_rcv_ccnt = sock->so_rcv.sb_ccnt;
-			ud.ud_rcv_hiwat = sock->so_rcv.sb_hiwat;
-			ud.ud_rcv_lowat = sock->so_rcv.sb_lowat;
-			ud.ud_rcv_mbcnt = sock->so_rcv.sb_mbcnt;
-			ud.ud_rcv_mbmax = sock->so_rcv.sb_mbmax;
+			if (sock != NULL) {
+				ud.ud_qlen = sock->so_qlen;
+				ud.ud_incqlen = sock->so_incqlen;
+				ud.ud_qlimit = sock->so_qlimit;
+				ud.ud_snd_cc = sock->so_snd.sb_cc;
+				ud.ud_snd_mcnt = sock->so_snd.sb_mcnt;
+				ud.ud_snd_ccnt = sock->so_snd.sb_ccnt;
+				ud.ud_snd_hiwat = sock->so_snd.sb_hiwat;
+				ud.ud_snd_lowat = sock->so_snd.sb_lowat;
+				ud.ud_snd_mbcnt = sock->so_snd.sb_mbcnt;
+				ud.ud_snd_mbmax = sock->so_snd.sb_mbmax;
+				ud.ud_rcv_cc = sock->so_rcv.sb_cc;
+				ud.ud_rcv_mcnt = sock->so_rcv.sb_mcnt;
+				ud.ud_rcv_ccnt = sock->so_rcv.sb_ccnt;
+				ud.ud_rcv_hiwat = sock->so_rcv.sb_hiwat;
+				ud.ud_rcv_lowat = sock->so_rcv.sb_lowat;
+				ud.ud_rcv_mbcnt = sock->so_rcv.sb_mbcnt;
+				ud.ud_rcv_mbmax = sock->so_rcv.sb_mbmax;
+			}
 			ud.ud_pcb = (u_long)sock->so_pcb;
 			ud.ud_vnode = (u_long)unp->unp_vnode;
 			ud.ud_conn = (u_long)unp->unp_conn;
@@ -1580,7 +1583,7 @@
 			UNP_PCB_UNLOCK(unp);
 			if (sbuf_bcat(&sbuf, &ud, sizeof(ud)) < 0) {
 				error = ENOMEM;
-				goto uout;
+				goto out;
 			}
 		} else {
 			freeunp = (unp->unp_refcount == 0);
@@ -1593,9 +1596,8 @@
 	}
 	sbuf_finish(&sbuf);
 	error = SYSCTL_OUT(req, sbuf_data(&sbuf), sbuf_len(&sbuf));
-uout:
+out:
 	free(unp_list, M_TEMP);
-out:
 	free(buffer, M_TEMP);
 	return (error);
 }


More information about the p4-projects mailing list