summaryrefslogtreecommitdiff
path: root/src/libnet_link_dlpi.c
diff options
context:
space:
mode:
authorJoachim Nilsson <troglobit@gmail.com>2019-09-23 23:01:21 +0200
committerJoachim Nilsson <troglobit@gmail.com>2019-09-24 21:07:30 +0200
commitcc5dbddcb994b2130eef683c2992e075bf279f20 (patch)
tree6a5978d81788932cc2fb829bc06ce0df62145de3 /src/libnet_link_dlpi.c
parentb4063cc67ced0e59233f7ab7f2fe95166542cbcc (diff)
downloadlibnet-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.c23
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 */