aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/e1000
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2017-09-08 14:54:07 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2017-09-08 14:54:07 +0000
commitdc63dc00cbf037902c5bb481aad98a07b5489e2f (patch)
treeeaa96c13afd9613fdf6ecec34fb02988240c6503 /sys/dev/e1000
parent6ff9ce94ce52172581a61cb99be5e8f824a8d1ad (diff)
downloadsrc-dc63dc00cbf037902c5bb481aad98a07b5489e2f.tar.gz
src-dc63dc00cbf037902c5bb481aad98a07b5489e2f.zip
Fix malloc() uses in em_get_regs().
Do not use malloc(M_NOWAIT), wait is possible there, and the malloc failures where not checked. Do not forget to free malloced memory. Reported and tested by: pho Approved by: sbruno Sponsored by: The FreeBSD Foundation
Notes
Notes: svn path=/head/; revision=323312
Diffstat (limited to 'sys/dev/e1000')
-rw-r--r--sys/dev/e1000/if_em.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c
index 5bcb8abbcadf..e29891cd6de1 100644
--- a/sys/dev/e1000/if_em.c
+++ b/sys/dev/e1000/if_em.c
@@ -534,22 +534,26 @@ static int em_get_regs(SYSCTL_HANDLER_ARGS)
{
struct adapter *adapter = (struct adapter *)arg1;
struct e1000_hw *hw = &adapter->hw;
-
struct sbuf *sb;
- u32 *regs_buff = (u32 *)malloc(sizeof(u32) * IGB_REGS_LEN, M_DEVBUF, M_NOWAIT);
+ u32 *regs_buff;
int rc;
+ regs_buff = malloc(sizeof(u32) * IGB_REGS_LEN, M_DEVBUF, M_WAITOK);
memset(regs_buff, 0, IGB_REGS_LEN * sizeof(u32));
rc = sysctl_wire_old_buffer(req, 0);
MPASS(rc == 0);
- if (rc != 0)
+ if (rc != 0) {
+ free(regs_buff, M_DEVBUF);
return (rc);
+ }
sb = sbuf_new_for_sysctl(NULL, NULL, 32*400, req);
MPASS(sb != NULL);
- if (sb == NULL)
+ if (sb == NULL) {
+ free(regs_buff, M_DEVBUF);
return (ENOMEM);
+ }
/* General Registers */
regs_buff[0] = E1000_READ_REG(hw, E1000_CTRL);
@@ -605,6 +609,8 @@ static int em_get_regs(SYSCTL_HANDLER_ARGS)
sbuf_printf(sb, "\tTDFHS\t %08x\n", regs_buff[20]);
sbuf_printf(sb, "\tTDFPC\t %08x\n\n", regs_buff[21]);
+ free(regs_buff, M_DEVBUF);
+
#ifdef DUMP_DESCS
{
if_softc_ctx_t scctx = adapter->shared;