diff --git a/archival/tar.c b/archival/tar.c index 4ab38db29..4f2564813 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -297,7 +297,8 @@ static void writeLongname(int fd, int type, const char *name, int dir) header.typeflag = type; strcpy(header.name, "././@LongLink"); /* This sets mode/uid/gid/mtime to "00...00" strings */ - memset(header.mode, '0', sizeof(struct prefilled)); + memset((char*)&header + offsetof(struct tar_header_t, mode), /* make gcc-9.x happy */ + '0', sizeof(struct prefilled)); header.mode [sizeof(header.mode ) - 1] = '\0'; header.uid [sizeof(header.uid ) - 1] = '\0'; header.gid [sizeof(header.gid ) - 1] = '\0'; diff --git a/include/libbb.h b/include/libbb.h index df7e45404..3e23b5bbd 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -818,7 +818,7 @@ ssize_t recv_from_to(int fd, void *buf, size_t len, int flags, struct sockaddr *to, socklen_t sa_size) FAST_FUNC; -uint16_t inet_cksum(uint16_t *addr, int len) FAST_FUNC; +uint16_t inet_cksum(const void *addr, int len) FAST_FUNC; int parse_pasv_epsv(char *buf) FAST_FUNC; /* 0 if argv[0] is NULL: */ diff --git a/libbb/inet_cksum.c b/libbb/inet_cksum.c index 3d5dc3adf..fee8648f3 100644 --- a/libbb/inet_cksum.c +++ b/libbb/inet_cksum.c @@ -6,8 +6,10 @@ #include "libbb.h" -uint16_t FAST_FUNC inet_cksum(uint16_t *addr, int nleft) +uint16_t FAST_FUNC inet_cksum(const void *ptr, int nleft) { + const uint16_t *addr = ptr; + /* * Our algorithm is simple, using a 32 bit accumulator, * we add sequential 16 bit words to it, and at the end, fold diff --git a/networking/ping.c b/networking/ping.c index 47b6ab1b2..5f7e5b9b5 100644 --- a/networking/ping.c +++ b/networking/ping.c @@ -217,7 +217,7 @@ static void ping4(len_and_sockaddr *lsa) /*memset(pkt, 0, sizeof(G.packet)); already is */ pkt->icmp_type = ICMP_ECHO; pkt->icmp_id = G.myid; - pkt->icmp_cksum = inet_cksum((uint16_t *) pkt, sizeof(G.packet)); + pkt->icmp_cksum = inet_cksum(pkt, sizeof(G.packet)); xsendto(pingsock, G.packet, DEFDATALEN + ICMP_MINLEN, &lsa->u.sa, lsa->len); @@ -529,7 +529,7 @@ static void sendping4(int junk UNUSED_PARAM) /* No hton: we'll read it back on the same machine */ *(uint32_t*)&pkt->icmp_dun = G.cur_us = monotonic_us(); - pkt->icmp_cksum = inet_cksum((uint16_t *) pkt, datalen + ICMP_MINLEN); + pkt->icmp_cksum = inet_cksum(pkt, datalen + ICMP_MINLEN); sendping_tail(sendping4, ICMP_MINLEN); } diff --git a/networking/traceroute.c b/networking/traceroute.c index 5068f654b..1c4dc3e4a 100644 --- a/networking/traceroute.c +++ b/networking/traceroute.c @@ -468,7 +468,7 @@ send_probe(int seq, int ttl) /* Always calculate checksum for icmp packets */ outicmp->icmp_cksum = 0; outicmp->icmp_cksum = inet_cksum( - (uint16_t *)outicmp, + outicmp, ((char*)outip + packlen) - (char*)outicmp ); if (outicmp->icmp_cksum == 0) diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c index fc2d672b7..ac8af91d3 100644 --- a/networking/udhcp/d6_dhcpc.c +++ b/networking/udhcp/d6_dhcpc.c @@ -947,7 +947,7 @@ static NOINLINE int d6_recv_raw_packet(struct in6_addr *peer_ipv6, struct d6_pac // packet.ip.tot_len = packet.udp.len; /* yes, this is needed */ // check = packet.udp.check; // packet.udp.check = 0; -// if (check && check != inet_cksum((uint16_t *)&packet, bytes)) { +// if (check && check != inet_cksum(&packet, bytes)) { // log1("packet with bad UDP checksum received, ignoring"); // return -2; // } diff --git a/networking/udhcp/d6_packet.c b/networking/udhcp/d6_packet.c index 446497e15..167a813e3 100644 --- a/networking/udhcp/d6_packet.c +++ b/networking/udhcp/d6_packet.c @@ -103,7 +103,7 @@ int FAST_FUNC d6_send_raw_packet( */ packet.ip6.ip6_hlim = IPPROTO_UDP; packet.udp.check = inet_cksum( - (uint16_t *)&packet + 2, + (uint8_t *)&packet + 4, offsetof(struct ip6_udp_d6_packet, data) - 4 + d6_pkt_size ); /* fix 'hop limit' and 'next header' after UDP checksumming */ diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index e13eb3f9f..66aa38c20 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c @@ -935,7 +935,7 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd) /* verify IP checksum */ check = packet.ip.check; packet.ip.check = 0; - if (check != inet_cksum((uint16_t *)&packet.ip, sizeof(packet.ip))) { + if (check != inet_cksum(&packet.ip, sizeof(packet.ip))) { log1s("bad IP header checksum, ignoring"); return -2; } @@ -960,7 +960,7 @@ static NOINLINE int udhcp_recv_raw_packet(struct dhcp_packet *dhcp_pkt, int fd) packet.ip.tot_len = packet.udp.len; /* yes, this is needed */ check = packet.udp.check; packet.udp.check = 0; - if (check && check != inet_cksum((uint16_t *)&packet, bytes)) { + if (check && check != inet_cksum(&packet, bytes)) { log1s("packet with bad UDP checksum received, ignoring"); return -2; } diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c index 6d4375237..51374646d 100644 --- a/networking/udhcp/packet.c +++ b/networking/udhcp/packet.c @@ -164,14 +164,14 @@ int FAST_FUNC udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt, packet.udp.len = htons(UDP_DHCP_SIZE - padding); /* for UDP checksumming, ip.len is set to UDP packet len */ packet.ip.tot_len = packet.udp.len; - packet.udp.check = inet_cksum((uint16_t *)&packet, + packet.udp.check = inet_cksum(&packet, IP_UDP_DHCP_SIZE - padding); /* but for sending, it is set to IP packet len */ packet.ip.tot_len = htons(IP_UDP_DHCP_SIZE - padding); packet.ip.ihl = sizeof(packet.ip) >> 2; packet.ip.version = IPVERSION; packet.ip.ttl = IPDEFTTL; - packet.ip.check = inet_cksum((uint16_t *)&packet.ip, sizeof(packet.ip)); + packet.ip.check = inet_cksum(&packet.ip, sizeof(packet.ip)); udhcp_dump_packet(dhcp_pkt); result = sendto(fd, &packet, IP_UDP_DHCP_SIZE - padding, /*flags:*/ 0,