diff options
author | Joachim Nilsson <troglobit@gmail.com> | 2019-09-23 23:01:21 +0200 |
---|---|---|
committer | Joachim Nilsson <troglobit@gmail.com> | 2019-09-24 21:07:30 +0200 |
commit | cc5dbddcb994b2130eef683c2992e075bf279f20 (patch) | |
tree | 6a5978d81788932cc2fb829bc06ce0df62145de3 /src/libnet_link_dlpi.c | |
parent | b4063cc67ced0e59233f7ab7f2fe95166542cbcc (diff) | |
download | libnet-cc5dbddcb994b2130eef683c2992e075bf279f20.tar.gz |
Add link_addr member to libnet_t for use with libnet_get_hwaddr()
This patch adds a `struct libnet_ether_addr` member to libnet_t which
libnet_get_hwaddr() can safely return for each call.
Also, some of the backends returned a malloc()'ed pointer instead of a
pointer to a static stack variable. That has been purged but should
probably be mentioned in the ChangeLog.
Fixes https://github.com/libnet/libnet/issues/1
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
Diffstat (limited to 'src/libnet_link_dlpi.c')
-rw-r--r-- | src/libnet_link_dlpi.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/libnet_link_dlpi.c b/src/libnet_link_dlpi.c index 46323e5..5ff7ba1 100644 --- a/src/libnet_link_dlpi.c +++ b/src/libnet_link_dlpi.c @@ -771,16 +771,23 @@ libnet_write_link(libnet_t *l, const uint8_t *packet, uint32_t size) struct libnet_ether_addr * libnet_get_hwaddr(libnet_t *l) { - /* This implementation is not-reentrant. */ - static int8_t buf[2048]; union DL_primitives *dlp; - struct libnet_ether_addr *eap; + int8_t *buf; + int8_t *mac; if (l == NULL) { return (NULL); } + buf = (int8_t *)malloc(2048); + if (buf == NULL) + { + snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, "%s(): malloc(): %s", + __func__, strerror(errno)); + return (NULL); + } + dlp = (union DL_primitives *)buf; dlp->physaddr_req.dl_primitive = DL_PHYS_ADDR_REQ; @@ -789,17 +796,21 @@ libnet_get_hwaddr(libnet_t *l) if (send_request(l->fd, (int8_t *)dlp, DL_PHYS_ADDR_REQ_SIZE, "physaddr", l->err_buf, 0) < 0) { + free(buf); return (NULL); } if (recv_ack(l->fd, DL_PHYS_ADDR_ACK_SIZE, "physaddr", (int8_t *)dlp, l->err_buf) < 0) { + free(buf); return (NULL); } - eap = (struct libnet_ether_addr *) - ((int8_t *) dlp + dlp->physaddr_ack.dl_addr_offset); - return (eap); + mac = (int8_t *)dlp + dlp->physaddr_ack.dl_addr_offset; + memcpy(l->link_addr.ether_addr_octet, mac, ETHER_ADDR_LEN); + free(buf); + + return (&l->link_addr); } /* EOF */ |