summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/dlt_common.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c
index d15b1ce..615665c 100644
--- a/src/shared/dlt_common.c
+++ b/src/shared/dlt_common.c
@@ -2361,17 +2361,22 @@ void dlt_buffer_write_block(DltBuffer *buf, int *write, const unsigned char *dat
{
/* catch null pointer */
if ((buf != NULL) && (write != NULL) && (data != NULL)) {
- if ((int)(*write + size) <= buf->size) {
- /* write one block */
- memcpy(buf->mem + *write, data, size);
- *write += size;
- }
- else {
- /* write two blocks */
- memcpy(buf->mem + *write, data, buf->size - *write);
- memcpy(buf->mem, data + buf->size - *write, size - buf->size + *write);
- *write += size - buf->size;
- }
+ if (size <= buf->size){
+ if ((int)(*write + size) <= buf->size) {
+ /* write one block */
+ memcpy(buf->mem + *write, data, size);
+ *write += size;
+ }
+ else {
+ /* write two blocks */
+ memcpy(buf->mem + *write, data, buf->size - *write);
+ memcpy(buf->mem, data + buf->size - *write, size - buf->size + *write);
+ *write += size - buf->size;
+ }
+ }
+ else {
+ dlt_vlog(LOG_WARNING, "%s: Write error: ring buffer to small\n", __func__);
+ }
}
else {
dlt_vlog(LOG_WARNING, "%s: Wrong parameter: Null pointer\n", __func__);
@@ -2596,7 +2601,7 @@ int dlt_buffer_push3(DltBuffer *buf,
free_size = buf->size - write + read;
/* check size */
- if (free_size < (int)(sizeof(DltBufferBlockHead) + size1 + size2 + size3)) {
+ while (free_size < (int)(sizeof(DltBufferBlockHead) + size1 + size2 + size3)) {
/* try to increase size if possible */
if (dlt_buffer_increase_size(buf))
/* increase size is not possible */
@@ -2606,6 +2611,15 @@ int dlt_buffer_push3(DltBuffer *buf,
/* update pointers */
write = ((int *)(buf->shm))[0];
read = ((int *)(buf->shm))[1];
+
+ /* update free size */
+ if (read > write)
+ free_size = read - write;
+ else if (count && (write == read))
+ free_size = 0;
+ else
+ free_size = buf->size - write + read;
+
}
/* set header */