aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2015-05-10 12:45:21 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2015-05-10 12:45:21 +0000
commita998d1031cb739c15c8f09d95aeb0c3a0e0e6f49 (patch)
treee65195155c85b281f2a31f9d32aec91ecbb272f5
parentace157c3a9a5eccf7b2c42ab7f829bce88b9b459 (diff)
downloadsrc-a998d1031cb739c15c8f09d95aeb0c3a0e0e6f49.tar.gz
src-a998d1031cb739c15c8f09d95aeb0c3a0e0e6f49.zip
Put recycle pointer in own memory area which is not mmap'able.
Notes
Notes: svn path=/head/; revision=282725
-rw-r--r--sys/dev/usb/video/udl.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/sys/dev/usb/video/udl.c b/sys/dev/usb/video/udl.c
index 69e2429794db..0d7c504a6b00 100644
--- a/sys/dev/usb/video/udl.c
+++ b/sys/dev/usb/video/udl.c
@@ -203,12 +203,14 @@ udl_buffer_alloc(uint32_t size)
}
mtx_unlock(&udl_buffer_mtx);
if (buf != NULL) {
+ uint8_t *ptr = ((uint8_t *)buf) - size;
/* wipe and recycle buffer */
- memset(buf, 0, size);
- return (buf);
+ memset(ptr, 0, size);
+ /* return buffer pointer */
+ return (ptr);
}
/* allocate new buffer */
- return (malloc(size, M_USB_DL, M_WAITOK | M_ZERO));
+ return (malloc(size + sizeof(*buf), M_USB_DL, M_WAITOK | M_ZERO));
}
static void
@@ -216,9 +218,11 @@ udl_buffer_free(void *_buf, uint32_t size)
{
struct udl_buffer *buf;
- buf = (struct udl_buffer *)_buf;
- if (buf == NULL)
+ /* check for NULL pointer */
+ if (_buf == NULL)
return;
+ /* compute pointer to recycle list */
+ buf = (struct udl_buffer *)(((uint8_t *)_buf) + size);
/*
* Memory mapped buffers should never be freed.