Adding an integer to a void pointer works fine with gcc but not with MSVC. Hence convert the expressions that add an integer to a void pointer into a construct that is standard C. --- snmplib/transports/snmpIPXDomain.c | 16 ++++++++++------ snmplib/transports/snmpIPv4BaseDomain.c | 12 ++++++++---- snmplib/transports/snmpIPv6BaseDomain.c | 12 ++++++++---- 3 files changed, 26 insertions(+), 14 deletions(-)
diff --git a/snmplib/transports/snmpIPXDomain.c b/snmplib/transports/snmpIPXDomain.c index 55070476ce1e..f5753f5a788a 100644 --- a/snmplib/transports/snmpIPXDomain.c +++ b/snmplib/transports/snmpIPXDomain.c @@ -78,9 +78,11 @@ static void netsnmp_ipx_get_taddr(struct netsnmp_transport_s *t, netsnmp_assert(t->remote_length == sizeof(*sa)); *addr_len = 12; if ((*addr = malloc(*addr_len))) { - memcpy(*addr + 0, &sa->sipx_network, 4); - memcpy(*addr + 4, &sa->sipx_node, 6); - memcpy(*addr + 10, &sa->sipx_port, 2); + unsigned char *p = *addr; + + memcpy(p + 0, &sa->sipx_network, 4); + memcpy(p + 4, &sa->sipx_node, 6); + memcpy(p + 10, &sa->sipx_port, 2); } } @@ -447,14 +449,16 @@ netsnmp_ipx_create_tstring(const char *str, int local, static int netsnmp_ipx_ostring_to_sockaddr(struct sockaddr_ipx *sa, const void *o, size_t o_len) { + const char *p = o; + if (o_len != 12) return 0; memset(sa, 0, sizeof(*sa)); sa->sipx_family = AF_IPX; - memcpy(&sa->sipx_network, o + 0, 4); - memcpy(&sa->sipx_node, o + 4, 6); - memcpy(&sa->sipx_port, o + 10, 2); + memcpy(&sa->sipx_network, p + 0, 4); + memcpy(&sa->sipx_node, p + 4, 6); + memcpy(&sa->sipx_port, p + 10, 2); return 1; } diff --git a/snmplib/transports/snmpIPv4BaseDomain.c b/snmplib/transports/snmpIPv4BaseDomain.c index fafc1ab8045c..37ef72d4ed42 100644 --- a/snmplib/transports/snmpIPv4BaseDomain.c +++ b/snmplib/transports/snmpIPv4BaseDomain.c @@ -251,20 +251,24 @@ void netsnmp_ipv4_get_taddr(struct netsnmp_transport_s *t, void **addr, *addr_len = 6; if ((*addr = malloc(*addr_len))) { - memcpy(*addr, &sin->sin_addr, 4); - memcpy(*addr + 4, &sin->sin_port, 2); + unsigned char *p = *addr; + + memcpy(p, &sin->sin_addr, 4); + memcpy(p + 4, &sin->sin_port, 2); } } int netsnmp_ipv4_ostring_to_sockaddr(struct sockaddr_in *sin, const void *o, size_t o_len) { + const char *p = o; + if (o_len != 6) return 0; memset(sin, 0, sizeof(*sin)); sin->sin_family = AF_INET; - memcpy(&sin->sin_addr, o + 0, 4); - memcpy(&sin->sin_port, o + 4, 2); + memcpy(&sin->sin_addr, p + 0, 4); + memcpy(&sin->sin_port, p + 4, 2); return 1; } diff --git a/snmplib/transports/snmpIPv6BaseDomain.c b/snmplib/transports/snmpIPv6BaseDomain.c index c4a801f87228..46f70c028cda 100644 --- a/snmplib/transports/snmpIPv6BaseDomain.c +++ b/snmplib/transports/snmpIPv6BaseDomain.c @@ -160,21 +160,25 @@ void netsnmp_ipv6_get_taddr(struct netsnmp_transport_s *t, void **addr, *addr_len = 18; if ((*addr = malloc(*addr_len))) { - memcpy(*addr, &sin6->sin6_addr, 16); - memcpy(*addr + 16, &sin6->sin6_port, 2); + unsigned char *p = *addr; + + memcpy(p, &sin6->sin6_addr, 16); + memcpy(p + 16, &sin6->sin6_port, 2); } } int netsnmp_ipv6_ostring_to_sockaddr(struct sockaddr_in6 *sin6, const void *o, size_t o_len) { + const char *p = o; + if (o_len != 18) return 0; memset(sin6, 0, sizeof(*sin6)); sin6->sin6_family = AF_INET6; - memcpy(&sin6->sin6_addr, o + 0, 16); - memcpy(&sin6->sin6_port, o + 16, 2); + memcpy(&sin6->sin6_addr, p + 0, 16); + memcpy(&sin6->sin6_port, p + 16, 2); return 1; } -- 2.17.1 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Net-snmp-coders mailing list Net-snmp-coders@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/net-snmp-coders