diff options
author | Hans Petter Selasky <hselasky@FreeBSD.org> | 2015-05-10 12:45:21 +0000 |
---|---|---|
committer | Hans Petter Selasky <hselasky@FreeBSD.org> | 2015-05-10 12:45:21 +0000 |
commit | a998d1031cb739c15c8f09d95aeb0c3a0e0e6f49 (patch) | |
tree | e65195155c85b281f2a31f9d32aec91ecbb272f5 | |
parent | ace157c3a9a5eccf7b2c42ab7f829bce88b9b459 (diff) | |
download | src-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.c | 14 |
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. |