diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2018-12-07 17:17:43 +0100 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2018-12-14 08:59:54 +0000 |
commit | 97a08a7e37835f0e8619d22c83243bee26a2bff2 (patch) | |
tree | 66a44a6c977c9fe16311ec031204cb82aa84e6ca /low-can-binding/utils/socketcan-bcm.cpp | |
parent | e190b7b3069d86fce25831c366bb0cd3fa615289 (diff) |
Smalls improvements
- Improve robustness reading a BCM socket
Adding checks on system calls and remove the initialization of the
struct that will hold the received message, not so much needed in
that case.
- More accurate log message at subscription/unsubscription step whether
this is a FD CAN messages or not and if this a subscription or an
unsubscription that is requested.
- Initialize the full struct of vehicle message to avoid memory warning
about conditionnal jump based on uninitialized bytes.
- Memleak: Free raw pointer on active diagnostic requests
Change-Id: I4bbf4d851c0fa1efdb6fa6034fac3d1dcafa1a73
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'low-can-binding/utils/socketcan-bcm.cpp')
-rw-r--r-- | low-can-binding/utils/socketcan-bcm.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/low-can-binding/utils/socketcan-bcm.cpp b/low-can-binding/utils/socketcan-bcm.cpp index d1fd8e0a..3f3a0968 100644 --- a/low-can-binding/utils/socketcan-bcm.cpp +++ b/low-can-binding/utils/socketcan-bcm.cpp @@ -74,14 +74,22 @@ namespace utils { struct utils::bcm_msg msg; - ::memset(&msg, 0, sizeof(msg)); const struct sockaddr_can& addr = s.get_tx_address(); socklen_t addrlen = sizeof(addr); struct ifreq ifr; ssize_t nbytes = ::recvfrom(s.socket(), &msg, sizeof(msg), 0, (struct sockaddr*)&addr, &addrlen); + if(nbytes < 0) + { + AFB_ERROR("Can't read the next message from socket '%d'. '%s'", s.socket(), strerror(errno)); + return s; + } ifr.ifr_ifindex = addr.can_ifindex; - ioctl(s.socket(), SIOCGIFNAME, &ifr); + if(ioctl(s.socket(), SIOCGIFNAME, &ifr) < 0) + { + AFB_ERROR("Can't read the interface name. '%s'", strerror(errno)); + return s; + } long unsigned int frame_size = nbytes-sizeof(struct bcm_msg_head); AFB_DEBUG("Data available: %li bytes read. BCM head, opcode: %i, can_id: %i, nframes: %i", frame_size, msg.msg_head.opcode, msg.msg_head.can_id, msg.msg_head.nframes); |