[PATCH 1/4] support: Add resolv_response_set_buffer
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Tue Jul 28 18:09:21 GMT 2026
On 03/07/26 11:52, Florian Weimer wrote:
> This can be used to mangle the response data to exercise the
> DNS client with corrupted packets.
>
> Also change resolv_response_buffer not to allocate. Instead,
> just return a pointer to the internal buffer. The function is
> currently unused.
LGTM, just a suggestion below.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> support/resolv_test.c | 17 +++++++++++++----
> support/resolv_test.h | 15 +++++++++++++++
> 2 files changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/support/resolv_test.c b/support/resolv_test.c
> index ec406b281a..4bb642f439 100644
> --- a/support/resolv_test.c
> +++ b/support/resolv_test.c
> @@ -429,11 +429,20 @@ resolv_response_length (const struct resolv_response_builder *b)
> }
>
> unsigned char *
> -resolv_response_buffer (const struct resolv_response_builder *b)
> +resolv_response_buffer (struct resolv_response_builder *b)
> {
> - unsigned char *result = xmalloc (b->offset);
> - memcpy (result, b->buffer, b->offset);
> - return result;
> + return b->buffer;
> +}
> +
> +void
> +resolv_response_set_buffer (struct resolv_response_builder *b,
> + const unsigned char *data, size_t length)
> +{
> + if (length > max_response_length)
> + FAIL_EXIT1 ("resolv_response_set_buffer: length %zu exceeds maximum %d",
> + length, max_response_length);
> + memmove (b->buffer, data, length);
> + b->offset = length;
This does not update section, current_rdata_offset, or the compression_offsets so
the resolv_response_builder is left in an inconsistent state. Maybe either
document it or fail for subsequent resolv_response_add_data.
> }
>
> struct resolv_response_builder *
> diff --git a/support/resolv_test.h b/support/resolv_test.h
> index 7a81c1c513..c10c523eb4 100644
> --- a/support/resolv_test.h
> +++ b/support/resolv_test.h
> @@ -206,6 +206,21 @@ void resolv_response_close (struct resolv_response_builder *);
> /* The size of the response packet built so far. */
> size_t resolv_response_length (const struct resolv_response_builder *);
>
> +/* Return a pointer to the internal response buffer. The pointer is
> + only valid until the next call that modifies the builder. The
> + length of the byte array can be obtained using
> + resolv_response_length. */
> +unsigned char *resolv_response_buffer (struct resolv_response_builder *)
> + __attribute_nonnull__ ((1));
> +
> +/* Replace the contents of the response buffer contents with a copy of
> + LENGTH bytes starting at DATA. Passing the pointer returned by
> + resolv_response_buffer is valid. If LENGTH is larger than the
> + maximum support packet size, fail the process. */
> +void resolv_response_set_buffer (struct resolv_response_builder *,
> + const unsigned char *data, size_t length)
> + __attribute_nonnull__ ((1, 2));
> +
> /* Allocates a response builder tied to a specific query packet,
> starting at QUERY_BUFFER, containing QUERY_LENGTH bytes. */
> struct resolv_response_builder *
More information about the Libc-alpha
mailing list