[Devel] Re: [PATCH 1/3] Record and restore skb header marks (v2)

Oren Laadan orenl at librato.com
Thu Oct 29 13:10:34 PDT 2009



Dan Smith wrote:
> Save this information when we checkpoint an skb and provide a mechanism
> to restore that information on restart.  This will be used in the
> subsequent INET patch.
> 
> Signed-off-by: Dan Smith <danms at us.ibm.com>
> 
> Changes in v2:
>  - Add range checks to ensure that the header marks we restore
>    are within the data length of the skb

[...]

> +int sock_restore_header_info(struct sk_buff *skb,
> +			     struct ckpt_hdr_socket_buffer *h)
> +{
> +	if ((h->transport_header >= skb->len) ||
> +	    (h->network_header >= skb->len) ||
> +	    (h->mac_header >= skb->len) ||
> +	    (h->mac_len >= skb->len) ||
> +	    (h->hdr_len >= skb->len)) {

I wonder if the sanity test for mac_len and hdr_len are sufficient,
or whether a more constrained test is required.

For example, a quick grep shows that there are several places where:
	skb->mac_len = skb->network_header - skb->mac_header;

I think there is some code that relies on it without validating
that the value makes sense.

> +		ckpt_debug("skb header positions not within data length\n");
> +		return -EINVAL;
> +	}
> +
> +	skb->mac_len = h->mac_len;
> +	skb->hdr_len = h->hdr_len;
> +
> +	skb_set_transport_header(skb, h->transport_header);
> +	skb_set_network_header(skb, h->network_header);
> +	skb_set_mac_header(skb, h->mac_header);
> +
> +	memcpy(skb->cb, h->cb, sizeof(skb->cb));

The skb->cb holds can be used by any layer to put private variables.

Can the user mangle the data in there to create a disaster of some
sort ?

If the answer is "it's possible", and because this is per protocol
data, I suggest to add a per-protocol callback to sanitize the data
in this control buffer.

To not block this patchset infinitely, I guess you can put the
details of the sanity check in a separate patch(set). But I prefer
that the current set will at least mention and provision for such
a mechanism.

> +
> +	return 0;
> +}
> +
>  static int __sock_write_buffers(struct ckpt_ctx *ctx,
>  				struct sk_buff_head *queue,
>  				int dst_objref)
> @@ -123,6 +167,7 @@ static int __sock_write_buffers(struct ckpt_ctx *ctx,
>  			goto end;
>  		h->sk_objref = ret;
>  		h->pr_objref = dst_objref;
> +		sock_record_header_info(skb, h);
>  
>  		ret = ckpt_write_obj(ctx, (struct ckpt_hdr *) h);
>  		if (ret < 0)

Oren.
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers




More information about the Devel mailing list