diff options
| author | F. Aragon <paco@voltanet.io> | 2018-07-03 12:11:19 +0200 |
|---|---|---|
| committer | F. Aragon <paco@voltanet.io> | 2018-07-06 01:09:00 +0200 |
| commit | 09ed14e887237e2d974741d31036064bfb53fa43 (patch) | |
| tree | 90de2f88eb50b7733232935134bf0ff608d98da3 | |
| parent | 732c8da3483d4e09fcfe260454092acef3280086 (diff) | |
pimd: standard library usage (PVS-Studio)
fread() function was not used properly.
Signed-off-by: F. Aragon <paco@voltanet.io>
| -rw-r--r-- | pimd/mtracebis_netlink.c | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/pimd/mtracebis_netlink.c b/pimd/mtracebis_netlink.c index a66da87e1b..b4bf6bada3 100644 --- a/pimd/mtracebis_netlink.c +++ b/pimd/mtracebis_netlink.c @@ -489,7 +489,6 @@ int rtnl_listen(struct rtnl_handle *rtnl, rtnl_filter_t handler, void *jarg) int rtnl_from_file(FILE *rtnl, rtnl_filter_t handler, void *jarg) { - int status; struct sockaddr_nl nladdr; char buf[8192]; struct nlmsghdr *h = (void *)buf; @@ -500,37 +499,43 @@ int rtnl_from_file(FILE *rtnl, rtnl_filter_t handler, void *jarg) nladdr.nl_groups = 0; while (1) { - int err, len; - int l; + int err; + size_t l, rl, arl; - status = fread(&buf, 1, sizeof(*h), rtnl); + rl = sizeof(*h); + arl = fread(&buf, 1, rl, rtnl); - if (status < 0) { - if (errno == EINTR) - continue; - perror("rtnl_from_file: fread"); + if (arl != rl) { + if (arl == 0) + return 0; + + if (ferror(rtnl)) + fprintf(stderr, "%s: header read failed\n", + __func__); + else + fprintf(stderr, "%s: truncated header\n", + __func__); return -1; } - if (status == 0) - return 0; - len = h->nlmsg_len; - l = len - sizeof(*h); + l = h->nlmsg_len > rl ? h->nlmsg_len - rl : 0; - if (l < 0 || len > (int)sizeof(buf)) { - fprintf(stderr, "!!!malformed message: len=%d @%lu\n", - len, ftell(rtnl)); + if (l == 0 || (l + (size_t)NLMSG_HDRLEN) > sizeof(buf)) { + fprintf(stderr, "%s: malformed message: len=%zu @%lu\n", + __func__, (size_t)h->nlmsg_len, ftell(rtnl)); return -1; } - status = fread(NLMSG_DATA(h), 1, NLMSG_ALIGN(l), rtnl); + rl = NLMSG_ALIGN(l); + arl = fread(NLMSG_DATA(h), 1, rl, rtnl); - if (status < 0) { - perror("rtnl_from_file: fread"); - return -1; - } - if (status < l) { - fprintf(stderr, "rtnl-from_file: truncated message\n"); + if (arl != rl) { + if (ferror(rtnl)) + fprintf(stderr, "%s: msg read failed\n", + __func__); + else + fprintf(stderr, "%s: truncated message\n", + __func__); return -1; } |
