Hi Pekka,

> ---
>  gdhcp/client.c |   14 +++++++-------
>  gdhcp/common.c |    2 +-
>  gdhcp/common.h |   17 +++++++----------
>  3 files changed, 15 insertions(+), 18 deletions(-)
> 
> diff --git a/gdhcp/client.c b/gdhcp/client.c
> index a7bd88a..ba43b85 100644
> --- a/gdhcp/client.c
> +++ b/gdhcp/client.c
> @@ -546,7 +546,7 @@ static int dhcp_recv_l2_packet(struct dhcp_packet 
> *dhcp_pkt, int fd)
>       if (bytes < (int) (sizeof(packet.ip) + sizeof(packet.udp)))
>               return -1;
>  
> -     if (bytes < ntohs(packet.ip.tot_len))
> +     if ((unsigned)bytes < ntohs(packet.ip.tot_len))
>               /* packet is bigger than sizeof(packet), we did partial read */
>               return -1;

this fix seems to be unrelated. And I prefer if we do this properly once
and for all and not keep casting around all the time. We not just makes
bytes unsigned in the first place.
 
> @@ -698,7 +698,7 @@ static uint32_t get_lease(struct dhcp_packet *packet)
>       if (option_u8 == NULL)
>               return 3600;
>  
> -     lease_seconds = dhcp_get_unaligned((uint32_t *) option_u8);
> +     lease_seconds = dhcp_get_unaligned(uint32_t, option_u8);
>       lease_seconds = ntohl(lease_seconds);
>       /* paranoia: must not be prone to overflows */
>       lease_seconds &= 0x0fffffff;
> @@ -857,14 +857,14 @@ static char *malloc_option_value_string(uint8_t 
> *option, GDHCPOptionType type)
>                       dest += sprint_nip(dest, "", option);
>                       break;
>               case OPTION_U16: {
> -                     uint16_t val_u16 = dhcp_get_unaligned(
> -                                             (uint16_t *) option);
> +                     uint16_t val_u16;
> +                     val_u16 = dhcp_get_unaligned(uint16_t, option);
>                       dest += sprintf(dest, "%u", ntohs(val_u16));
>                       break;
>               }
>               case OPTION_U32: {
> -                     uint32_t val_u32 = dhcp_get_unaligned(
> -                                             (uint32_t *) option);
> +                     uint32_t val_u32;
> +                     val_u32 = dhcp_get_unaligned(uint32_t, option);
>                       dest += sprintf(dest, type == OPTION_U32 ? "%lu" :
>                                       "%ld", (unsigned long) ntohl(val_u32));
>                       break;
> @@ -991,7 +991,7 @@ static gboolean listener_event(GIOChannel *channel, 
> GIOCondition condition,
>  
>               option_u8 = dhcp_get_option(&packet, DHCP_SERVER_ID);
>               dhcp_client->server_ip =
> -                             dhcp_get_unaligned((uint32_t *) option_u8);
> +                             dhcp_get_unaligned(uint32_t, option_u8);
>               dhcp_client->requested_ip = packet.yiaddr;
>  
>               dhcp_client->state = REQUESTING;
> diff --git a/gdhcp/common.c b/gdhcp/common.c
> index fc95881..dd3224b 100644
> --- a/gdhcp/common.c
> +++ b/gdhcp/common.c
> @@ -177,7 +177,7 @@ void dhcp_add_simple_option(struct dhcp_packet *packet, 
> uint8_t code,
>       data <<= 8 * (4 - len);
>  #endif
>  
> -     dhcp_put_unaligned(data, (uint32_t *) &option[OPT_DATA]);
> +     dhcp_put_unaligned(data, uint32_t, &option[OPT_DATA]);
>       dhcp_add_binary_option(packet, option);
>  
>       return;
> diff --git a/gdhcp/common.h b/gdhcp/common.h
> index ade49cd..221f4e6 100644
> --- a/gdhcp/common.h
> +++ b/gdhcp/common.h
> @@ -26,20 +26,17 @@
>  
>  #include "gdhcp.h"
>  
> -#define dhcp_get_unaligned(ptr)                      \
> +#define dhcp_get_unaligned(typ, ptr)         \
>  ({                                           \
> -     struct __attribute__((packed)) {        \
> -             typeof(*(ptr)) __v;             \
> -     } *__p = (void *) (ptr);                \
> -     __p->__v;                               \
> +     typ __v;                                \
> +     memcpy(&__v, ptr, sizeof(__v));         \
> +     __v;                                    \
>  })
>  
> -#define dhcp_put_unaligned(val, ptr)         \
> +#define dhcp_put_unaligned(val, typ, ptr)    \
>  do {                                         \
> -     struct __attribute__((packed)) {        \
> -             typeof(*(ptr)) __v;             \
> -     } *__p = (void *) (ptr);                \
> -     __p->__v = (val);                       \
> +     typ __v = (val);                        \
> +     memcpy((ptr), &__v, sizeof(__v));       \
>  } while (0)

I really need an explanation on why. We are using exactly the same in
BlueZ and it works just fine there. As I mentioned on IRC, these are GCC
guru approved ways of doing unaligned access.

Regards

Marcel


_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to