[stgt] [PATCH 02/13] mem_copy_n32: safe memcpy, accumulates copied count, tracks remaining space
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Mon Feb 11 01:07:22 CET 2013
On Wed, 16 Jan 2013 11:01:42 +0200
nezhinsky at gmail.com wrote:
> From: Alexander Nezhinsky <nezhinsky at gmail.com>
>
> To assist safe generation of data-in buffer for SPC-type read commands
> two new utility functions are defined:
>
> int mem_copy_n32(uint8_t *dst, uint8_t *src, uint32_t src_len,
> uint32_t *avail_len, uint32_t *remain_len)
>
> Copies up to src_len bytes from src, making sure
> not to exceed *remain_len bytes available at dst.
> Returns actually copied length, updates remaining space
> in *remain_len (mandatory parameter),
> accumulate copied length in *avail_len (optional parameter).
>
> void set_byte_n32(int val, uint8_t *dst, uint32_t index, uint32_t max_len)
>
> Sets a byte at the given index within dst buffer to val,
> making sure not to exceed max_len bytes available at dst.
>
> Signed-off-by: Alexander Nezhinsky <nezhinsky at gmail.com>
> ---
> usr/util.c | 31 +++++++++++++++++++++++++++++++
> usr/util.h | 4 ++++
> 2 files changed, 35 insertions(+)
>
> diff --git a/usr/util.c b/usr/util.c
> index 6c9bad7..3392b0b 100644
> --- a/usr/util.c
> +++ b/usr/util.c
> @@ -196,3 +196,34 @@ int get_blk_shift(unsigned int size)
> return shift;
> }
>
> +/*
> + * Copy up to src_len bytes from src,
> + * not exceeding *remain_len bytes available at dst.
> + * Return actually copied length.
> + * Reflect decreased space in *remain_len (mandatory).
> + * Accumulate copied length in *avail_len (optional).
> + */
> +int mem_copy_n32(uint8_t *dst, uint8_t *src, uint32_t src_len,
> + uint32_t *avail_len, uint32_t *remain_len)
> +{
Something like the following looks more reasonable?
scsi_memcpy(dst, str_len, src, src_len)
I'm not sure about 'avail_len'. src_len is const so it doesn't make
sense to calculate avail_len inside this function.
> + int copy_len = min_t(uint32_t, *remain_len, src_len);
> +
> + if (copy_len) {
> + memcpy(dst, src, copy_len);
> + *remain_len -= copy_len;
> + }
> + if (avail_len)
> + *avail_len += src_len;
> + return copy_len;
> +}
> +
> +/*
> + * Set a byte at the given index within dst buffer to val,
> + * not exceeding max_len bytes available at dst.
> + */
> +void set_byte_n32(int val, uint8_t *dst, uint32_t index, uint32_t max_len)
> +{
> + if (index < max_len)
> + dst[index] = (uint8_t)val;
> +}
This function could be used by other than mod_sense? If not, I prefer
to have more explicit function name in spc.c
> +
> diff --git a/usr/util.h b/usr/util.h
> index 76cff2a..d4c7d59 100644
> --- a/usr/util.h
> +++ b/usr/util.h
> @@ -67,6 +67,10 @@ extern int backed_file_open(char *path, int oflag, uint64_t *size,
> extern int set_non_blocking(int fd);
> extern int str_to_open_flags(char *buf);
> extern char *open_flags_to_str(char *dest, int flags);
> +extern int mem_copy_n32(uint8_t *dst, uint8_t *src, uint32_t src_len,
> + uint32_t *avail_len, uint32_t *remain_len);
> +extern void set_byte_n32(int val, uint8_t *dst, uint32_t index,
> + uint32_t max_len);
>
> #define zalloc(size) \
> ({ \
> --
> 1.7.9.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe stgt" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list