[SLOF] [PATCH 2/5] ipv6: Clear memory after malloc if necessary
Andrew Jones
drjones at redhat.com
Tue May 3 15:19:06 AEST 2016
On Mon, May 02, 2016 at 09:55:28PM +0200, Thomas Huth wrote:
> The IPv6 code uses malloc in a couple of places to allocate the memory
> for a struct. But it does not properly initializes all members of the
> struct after the allocation, so the uninitialized members might contain
> random data. So we should better clear the whole memory for those
> structs to make sure we do not run into some hard-to-reproduce random
> problems later.
>
> Reported-by: Andrew Jones <drjones at redhat.com>
> Signed-off-by: Thomas Huth <thuth at redhat.com>
> ---
> clients/net-snk/app/netlib/ipv6.c | 14 +++++++++++---
> clients/net-snk/app/netlib/ndp.c | 1 +
> 2 files changed, 12 insertions(+), 3 deletions(-)
I only reported the one I saw. I see you found many more. I wonder
if it'd be helpful for SLOF to add calloc?
Reviewed-by: Andrew Jones <drjones at redhat.com>
>
> diff --git a/clients/net-snk/app/netlib/ipv6.c b/clients/net-snk/app/netlib/ipv6.c
> index 6c041d6..baa5034 100644
> --- a/clients/net-snk/app/netlib/ipv6.c
> +++ b/clients/net-snk/app/netlib/ipv6.c
> @@ -68,7 +68,11 @@ void set_ipv6_address(int fd, ip6_addr_t *_own_ip6)
> {
> struct ip6addr_list_entry *ile;
>
> - own_ip6 = malloc (sizeof(struct ip6addr_list_entry));
> + ile = malloc(sizeof(struct ip6addr_list_entry));
> + if (!ile)
> + return;
> + memset(ile, 0, sizeof(struct ip6addr_list_entry));
> + own_ip6 = ile;
>
> /* If no address was passed as a parameter generate a link-local
> * address from our MAC address.*/
> @@ -263,6 +267,7 @@ struct prefix_info *ip6_create_prefix_info()
> prfx_info = malloc (sizeof(struct prefix_info));
> if (!prfx_info)
> return NULL;
> + memset(prfx_info, 0, sizeof(struct prefix_info));
>
> return prfx_info;
> }
> @@ -282,6 +287,7 @@ void *ip6_prefix2addr(ip6_addr_t prefix)
> new_address = malloc (sizeof(struct ip6addr_list_entry));
> if( !new_address )
> return NULL;
> + memset(new_address, 0, sizeof(struct ip6addr_list_entry));
>
> /* fill new addr struct */
> /* extract prefix from Router Advertisement */
> @@ -317,11 +323,10 @@ int8_t ip6addr_add(struct ip6addr_list_entry *new_address)
> * for its solicited-node multicast address.
> * See RFC 2373 - IP Version 6 Adressing Architecture */
> if (! ip6_is_multicast(&(new_address->addr))) {
> -
> -
> solicited_node = malloc(sizeof(struct ip6addr_list_entry));
> if (! solicited_node)
> return 0;
> + memset(solicited_node, 0, sizeof(struct ip6addr_list_entry));
>
> solicited_node->addr.part.prefix = IPV6_SOLIC_NODE_PREFIX;
> solicited_node->addr.part.interface_id = IPV6_SOLIC_NODE_IFACE_ID;
> @@ -541,6 +546,9 @@ int send_ipv6(int fd, void* buffer, int len)
> } else {
> mac_addr = null_mac;
> n = malloc(sizeof(struct neighbor));
> + if (!n)
> + return -1;
> + memset(n, 0, sizeof(struct neighbor));
> memcpy(&(n->ip.addr[0]), &ip_dst, 16);
> n->status = NB_PROBE;
> n->times_asked += 1;
> diff --git a/clients/net-snk/app/netlib/ndp.c b/clients/net-snk/app/netlib/ndp.c
> index 7a8dfda..263bee2 100644
> --- a/clients/net-snk/app/netlib/ndp.c
> +++ b/clients/net-snk/app/netlib/ndp.c
> @@ -140,6 +140,7 @@ neighbor_create (uint8_t *packet, struct packeth *headers)
> new_neighbor = malloc (sizeof(struct neighbor));
> if( !new_neighbor )
> return NULL;
> + memset(new_neighbor, 0, sizeof(struct neighbor));
>
> /* fill neighbor struct */
> memcpy (&(new_neighbor->mac),
> --
> 1.8.3.1
>
More information about the SLOF
mailing list