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