Hi Bart,

I see that when it's a souce, you use "const char *", and when it's a
destination, you use "unsigned char *".  I understand the reason for the
constness difference, but is there a reason for the signedness difference?

  Bill


On Thu, Jun 21, 2018 at 10:23 PM Bart Van Assche <bvanass...@acm.org> wrote:

> 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
>
------------------------------------------------------------------------------
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

Reply via email to