Security fix on DLT pipes.
[profile/ivi/dlt-daemon.git] / src / lib / dlt_user.c
index 9c40a30..867031c 100644 (file)
@@ -171,6 +171,7 @@ int dlt_init(void)
 
     dlt_user.dlt_is_file = 0;
     dlt_user.overflow = 0;
+    dlt_user.overflow_counter = 0;
 #ifdef DLT_SHM_ENABLE
        memset(&(dlt_user.dlt_shm),0,sizeof(DltShm));
 #endif
@@ -181,7 +182,7 @@ int dlt_init(void)
     /* Try to delete existing pipe, ignore result of unlink */
     unlink(filename);
     
-    ret=mkfifo(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH  | S_IWOTH );
+    ret=mkfifo(filename, S_IRUSR | S_IWUSR | S_IWGRP | S_IRGRP );
     if (ret==-1)
     {
         sprintf(str,"Loging disabled, FIFO user %s cannot be created!\n",filename);
@@ -189,6 +190,15 @@ int dlt_init(void)
         /* return 0; */ /* removed to prevent error, when FIFO already exists */
     }
 
+    // S_IWGRP cannot be set by mkfifo (???), let's reassign right bits
+    ret=chmod(filename, S_IRUSR | S_IWUSR | S_IWGRP | S_IRGRP );
+    if (ret==-1)
+    {
+        sprintf(str,"FIFO user %s cannot be chmoded!\n", DLT_USER_DIR);
+        dlt_log(LOG_ERR, str);
+        return -1;
+    }
+
     dlt_user.dlt_user_handle = open(filename, O_RDWR | O_CLOEXEC);
     if (dlt_user.dlt_user_handle == DLT_FD_INIT)
     {
@@ -326,8 +336,9 @@ int dlt_init_message_queue(void)
                dlt_log(LOG_WARNING, "Old message queue exists, trying to delete.\n");
                if(mq_unlink(queue_name) < 0)
                {
-                       dlt_log(LOG_CRIT, "Could not delete existing message queue!\n");
-                       dlt_log(LOG_CRIT, strerror(errno));
+                char str[256];
+                snprintf(str,255,"Could not delete existing message queue!: %s \n",strerror(errno));
+                dlt_log(LOG_CRIT, str);
                }
                else // Retry
                {
@@ -337,8 +348,9 @@ int dlt_init_message_queue(void)
        }
        if(dlt_user.dlt_segmented_queue_read_handle < 0)
        {
-               dlt_log(LOG_CRIT, "Can't create message queue read handle!\n");
-               dlt_log(LOG_CRIT, strerror(errno));
+            char str[256];
+            snprintf(str,255,"Can't create message queue read handle!: %s \n",strerror(errno));
+            dlt_log(LOG_CRIT, str);
                pthread_mutex_unlock(&mq_mutex);
                return -1;
        }
@@ -347,8 +359,10 @@ int dlt_init_message_queue(void)
     dlt_user.dlt_segmented_queue_write_handle = mq_open(queue_name, O_WRONLY|O_NONBLOCK);
     if(dlt_user.dlt_segmented_queue_write_handle < 0)
     {
-       dlt_log(LOG_CRIT, "Can't open message queue write handle!\n");
-       dlt_log(LOG_CRIT, strerror(errno));
+
+        char str[256];
+        snprintf(str,255,"Can't open message queue write handle!: %s \n",strerror(errno));
+        dlt_log(LOG_CRIT, str);
        pthread_mutex_unlock(&mq_mutex);
        return -1;
     }
@@ -406,6 +420,7 @@ int dlt_init_common(void)
     }
 
     /* Initialize LogLevel/TraceStatus field */
+    DLT_SEM_LOCK();
     dlt_user.dlt_ll_ts = 0;
     dlt_user.dlt_ll_ts_max_num_entries = 0;
     dlt_user.dlt_ll_ts_num_entries = 0;
@@ -413,8 +428,10 @@ int dlt_init_common(void)
     if (dlt_buffer_init_dynamic(&(dlt_user.startup_buffer), DLT_USER_RINGBUFFER_MIN_SIZE, DLT_USER_RINGBUFFER_MAX_SIZE, DLT_USER_RINGBUFFER_STEP_SIZE)==-1)
     {
                dlt_user_initialised = 0;
+        DLT_SEM_FREE();
         return -1;
     }
+    DLT_SEM_FREE();
 
     signal(SIGPIPE,SIG_IGN);                  /* ignore pipe signals */
 
@@ -431,6 +448,10 @@ int dlt_init_common(void)
 
 void dlt_user_atexit_handler(void)
 {
+    if (dlt_user_initialised==0)
+    {
+        return;
+    }
 
        /* Try to resend potential log messages in the user buffer */
        int count = dlt_user_atexit_blow_out_user_buffer();
@@ -519,6 +540,7 @@ int dlt_free(void)
        /* Ignore return value */
     dlt_buffer_free_dynamic(&(dlt_user.startup_buffer));
 
+    DLT_SEM_LOCK();
     if (dlt_user.dlt_ll_ts)
     {
         for (i=0;i<dlt_user.dlt_ll_ts_max_num_entries;i++)
@@ -536,6 +558,7 @@ int dlt_free(void)
         dlt_user.dlt_ll_ts_max_num_entries = 0;
         dlt_user.dlt_ll_ts_num_entries = 0;
     }
+    DLT_SEM_FREE();
 
     if (dlt_user.dlt_segmented_nwt_handle)
     {
@@ -774,6 +797,9 @@ int dlt_register_context_ll_ts(DltContext *handle, const char *contextid, const
                 dlt_user.dlt_ll_ts[i].log_level    = DLT_USER_INITIAL_LOG_LEVEL;
                 dlt_user.dlt_ll_ts[i].trace_status = DLT_USER_INITIAL_TRACE_STATUS;
 
+                dlt_user.dlt_ll_ts[i].log_level_ptr    = 0;
+                dlt_user.dlt_ll_ts[i].trace_status_ptr = 0;
+
                 dlt_user.dlt_ll_ts[i].context_description = 0;
 
                 dlt_user.dlt_ll_ts[i].injection_table = 0;
@@ -815,6 +841,9 @@ int dlt_register_context_ll_ts(DltContext *handle, const char *contextid, const
                     dlt_user.dlt_ll_ts[i].log_level    = DLT_USER_INITIAL_LOG_LEVEL;
                     dlt_user.dlt_ll_ts[i].trace_status = DLT_USER_INITIAL_TRACE_STATUS;
 
+                    dlt_user.dlt_ll_ts[i].log_level_ptr    = 0;
+                    dlt_user.dlt_ll_ts[i].trace_status_ptr = 0;
+
                     dlt_user.dlt_ll_ts[i].context_description = 0;
 
                     dlt_user.dlt_ll_ts[i].injection_table = 0;
@@ -849,6 +878,25 @@ int dlt_register_context_ll_ts(DltContext *handle, const char *contextid, const
             dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].context_description[desc_len]='\0';
         }
 
+        if(dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].log_level_ptr == 0)
+        {
+               dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].log_level_ptr = malloc(sizeof(int8_t));
+               if(dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].log_level_ptr == 0)
+               {
+               DLT_SEM_FREE();
+               return -1;
+               }
+        }
+        if(dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].trace_status_ptr == 0)
+        {
+               dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].trace_status_ptr = malloc(sizeof(int8_t));
+               if(dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].trace_status_ptr == 0)
+               {
+               DLT_SEM_FREE();
+               return -1;
+               }
+        }
+
         if (loglevel!=DLT_USER_LOG_LEVEL_NOT_SET)
         {
             dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].log_level = loglevel;
@@ -864,8 +912,14 @@ int dlt_register_context_ll_ts(DltContext *handle, const char *contextid, const
         dlt_set_id(handle->contextID, contextid);
         handle->log_level_pos = dlt_user.dlt_ll_ts_num_entries;
 
+        handle->log_level_ptr = dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].log_level_ptr;
+        handle->trace_status_ptr = dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].trace_status_ptr;
+
         log.context_description = dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].context_description;
 
+        *(dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].log_level_ptr) = dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].log_level;
+        *(dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].trace_status_ptr) = dlt_user.dlt_ll_ts[dlt_user.dlt_ll_ts_num_entries].trace_status = tracestatus;
+
         if (loglevel!=DLT_USER_LOG_LEVEL_NOT_SET)
         {
             log.log_level = loglevel;
@@ -946,6 +1000,9 @@ int dlt_unregister_context(DltContext *handle)
 
     DLT_SEM_LOCK();
 
+    handle->log_level_ptr = 0;
+    handle->trace_status_ptr = 0;
+
     if (dlt_user.dlt_ll_ts)
     {
         /* Clear and free local stored context information */
@@ -959,6 +1016,18 @@ int dlt_unregister_context(DltContext *handle)
             free(dlt_user.dlt_ll_ts[handle->log_level_pos].context_description);
         }
 
+        if (dlt_user.dlt_ll_ts[handle->log_level_pos].log_level_ptr!=0)
+        {
+            free(dlt_user.dlt_ll_ts[handle->log_level_pos].log_level_ptr);
+            dlt_user.dlt_ll_ts[handle->log_level_pos].log_level_ptr = 0;
+        }
+
+        if (dlt_user.dlt_ll_ts[handle->log_level_pos].trace_status_ptr!=0)
+        {
+            free(dlt_user.dlt_ll_ts[handle->log_level_pos].trace_status_ptr);
+            dlt_user.dlt_ll_ts[handle->log_level_pos].trace_status_ptr = 0;
+        }
+
         dlt_user.dlt_ll_ts[handle->log_level_pos].context_description = 0;
 
         if (dlt_user.dlt_ll_ts[handle->log_level_pos].injection_table)
@@ -1017,6 +1086,10 @@ int dlt_set_application_ll_ts_limit(DltLogLevelType loglevel, DltTraceStatusType
     {
         dlt_user.dlt_ll_ts[i].log_level = loglevel;
         dlt_user.dlt_ll_ts[i].trace_status = tracestatus;
+        if(dlt_user.dlt_ll_ts[i].log_level_ptr)
+               *(dlt_user.dlt_ll_ts[i].log_level_ptr) = loglevel;
+        if(dlt_user.dlt_ll_ts[i].trace_status_ptr)
+               *(dlt_user.dlt_ll_ts[i].trace_status_ptr) = tracestatus;
     }
 
     DLT_SEM_FREE();
@@ -1072,12 +1145,13 @@ int dlt_forward_msg(void *msgdata,size_t size)
         /* Reattach to daemon if neccesary */
         dlt_user_log_reattach_to_daemon();
 
-        if (dlt_user.overflow)
+        if (dlt_user.overflow_counter)
         {
             if (dlt_user_log_send_overflow()==0)
             {
-                dlt_user.overflow=0;
-            }
+                               sprintf(str,"Buffer full! %u messages discarded!\n",dlt_user.overflow_counter);
+                               dlt_log(LOG_ERR, str);
+                dlt_user.overflow_counter=0;            }
         }
 
         /* log to FIFO */
@@ -1094,23 +1168,32 @@ int dlt_forward_msg(void *msgdata,size_t size)
                                 (unsigned char *)&(userheader), sizeof(DltUserHeader),
                                  msgdata, size, 0, 0)==-1)
                        {
-                               dlt_log(LOG_ERR,"Storing message to history buffer failed! Message discarded.\n");
+                if(dlt_user.overflow_counter==0)
+                {
+                       dlt_log(LOG_ERR,"Buffer full! First message discarded!\n");
+                }
+                ret = DLT_RETURN_BUFFER_FULL;
                        }
 
             DLT_SEM_FREE();
 
             if(dlt_user_queue_resend() < 0 && dlt_user.dlt_log_handle >= 0)
             {
-               dlt_log(LOG_WARNING, "Failed to queue resending.\n");
+                ;//dlt_log(LOG_WARNING, "dlt_forward_msg: Failed to queue resending.\n");
             }
         }
 
         switch (ret)
         {
+        case DLT_RETURN_BUFFER_FULL:
+        {
+               /* Buffer full */
+            dlt_user.overflow_counter += 1;
+               return -1;
+        }
         case DLT_RETURN_PIPE_FULL:
         {
             /* data could not be written */
-            dlt_user.overflow = 1;
             return -1;
         }
         case DLT_RETURN_PIPE_ERROR:
@@ -1172,11 +1255,8 @@ int dlt_user_log_write_start_id(DltContext *handle, DltContextData *log,DltLogLe
         return -1;
     }
 
-    DLT_SEM_LOCK();
-
-    if ((loglevel<=(int)(dlt_user.dlt_ll_ts[handle->log_level_pos].log_level) ) && (loglevel!=0))
+    if (handle->log_level_ptr && (loglevel<=(int)*(handle->log_level_ptr) ) && (loglevel!=0))
     {
-        DLT_SEM_FREE();
                log->args_num = 0;
        log->log_level = loglevel;
 
@@ -1197,11 +1277,6 @@ int dlt_user_log_write_start_id(DltContext *handle, DltContextData *log,DltLogLe
         else log->size=0;
         return 1;
     }
-    else
-    {
-        DLT_SEM_FREE();
-        return 0;
-    }
 
     return -1;
 }
@@ -1755,7 +1830,50 @@ int dlt_user_log_write_string(DltContextData *log, const char *text)
             return -1;
         }
 
-        type_info = DLT_TYPE_INFO_STRG;
+        type_info = DLT_TYPE_INFO_STRG | DLT_SCOD_ASCII;
+
+        memcpy((log->buffer)+log->size,&(type_info),sizeof(uint32_t));
+        log->size += sizeof(uint32_t);
+    }
+
+    arg_size = strlen(text) + 1;
+
+    memcpy((log->buffer)+log->size,&(arg_size),sizeof(uint16_t));
+    log->size += sizeof(uint16_t);
+
+    memcpy((log->buffer)+log->size,text,arg_size);
+    log->size += arg_size;
+
+    log->args_num ++;
+
+    return 0;
+}
+
+int dlt_user_log_write_utf8_string(DltContextData *log, const char *text)
+{
+    uint16_t arg_size;
+    uint32_t type_info;
+
+    if ((log==0) || (text==0))
+    {
+        return -1;
+    }
+
+    arg_size = strlen(text)+1;
+
+    if ((log->size+arg_size+sizeof(uint16_t))>DLT_USER_BUF_MAX_SIZE)
+    {
+        return -1;
+    }
+
+    if (dlt_user.verbose_mode)
+    {
+        if ((log->size+arg_size+sizeof(uint32_t)+sizeof(uint16_t))>DLT_USER_BUF_MAX_SIZE)
+        {
+            return -1;
+        }
+
+        type_info = DLT_TYPE_INFO_STRG | DLT_SCOD_UTF8;
 
         memcpy((log->buffer)+log->size,&(type_info),sizeof(uint32_t));
         log->size += sizeof(uint32_t);
@@ -1906,17 +2024,14 @@ int dlt_user_trace_network_segmented_start(uint16_t *id, DltContext *handle, Dlt
                return -1;
     }
 
-    DLT_SEM_LOCK();
 
     if (dlt_user.dlt_ll_ts==0)
     {
-        DLT_SEM_FREE();
         return -1;
     }
 
-    if (dlt_user.dlt_ll_ts[handle->log_level_pos].trace_status==DLT_TRACE_STATUS_ON)
+    if (handle->trace_status_ptr && *(handle->trace_status_ptr)==DLT_TRACE_STATUS_ON)
     {
-        DLT_SEM_FREE();
 
         log.args_num = 0;
         log.trace_status = nw_trace_type;
@@ -1972,10 +2087,6 @@ int dlt_user_trace_network_segmented_start(uint16_t *id, DltContext *handle, Dlt
         /* Send log */
         return dlt_user_log_send_log(&log, DLT_TYPE_NW_TRACE);
     }
-    else
-    {
-        DLT_SEM_FREE();
-    }
     return 0;
 }
 
@@ -1999,17 +2110,13 @@ int dlt_user_trace_network_segmented_segment(uint16_t id, DltContext *handle, Dl
                return -1;
     }
 
-    DLT_SEM_LOCK();
-
     if (dlt_user.dlt_ll_ts==0)
     {
-        DLT_SEM_FREE();
         return -1;
     }
 
-    if (dlt_user.dlt_ll_ts[handle->log_level_pos].trace_status==DLT_TRACE_STATUS_ON)
+    if (handle->trace_status_ptr && *(handle->trace_status_ptr)==DLT_TRACE_STATUS_ON)
     {
-        DLT_SEM_FREE();
 
         log.args_num = 0;
         log.trace_status = nw_trace_type;
@@ -2042,10 +2149,6 @@ int dlt_user_trace_network_segmented_segment(uint16_t id, DltContext *handle, Dl
         /* Send log */
         return dlt_user_log_send_log(&log, DLT_TYPE_NW_TRACE);
     }
-    else
-    {
-        DLT_SEM_FREE();
-    }
 
     /* Allow other threads to log between chunks */
        pthread_yield();
@@ -2068,17 +2171,13 @@ int dlt_user_trace_network_segmented_end(uint16_t id, DltContext *handle, DltNet
 
 
 
-    DLT_SEM_LOCK();
-
     if (dlt_user.dlt_ll_ts==0)
     {
-        DLT_SEM_FREE();
         return -1;
     }
 
-    if (dlt_user.dlt_ll_ts[handle->log_level_pos].trace_status==DLT_TRACE_STATUS_ON)
+    if (handle->trace_status_ptr && *(handle->trace_status_ptr)==DLT_TRACE_STATUS_ON)
     {
-        DLT_SEM_FREE();
 
         log.args_num = 0;
         log.trace_status = nw_trace_type;
@@ -2099,10 +2198,6 @@ int dlt_user_trace_network_segmented_end(uint16_t id, DltContext *handle, DltNet
         /* Send log */
         return dlt_user_log_send_log(&log, DLT_TYPE_NW_TRACE);
     }
-    else
-    {
-        DLT_SEM_FREE();
-    }
     return 0;
 }
 
@@ -2129,8 +2224,10 @@ void dlt_user_trace_network_segmented_thread(void *unused)
 
                 if(read != sizeof(s_segmented_data *))
                 {
-                        dlt_log(LOG_ERR, "NWTSegmented: Error while reading queue.\n");
-                        dlt_log(LOG_ERR, strerror(errno));
+
+                        char str[255];
+                        snprintf(str,254,"NWTSegmented: Error while reading queue: %s \n",strerror(errno));
+                        dlt_log(LOG_CRIT, str);
                         continue;
                 }
 
@@ -2142,7 +2239,10 @@ void dlt_user_trace_network_segmented_thread(void *unused)
                         if(dlt_user_log_resend_buffer() < 0)
                         {
                                 // Requeue if still not empty
-                                dlt_user_queue_resend();
+                                if ( dlt_user_queue_resend() < 0 )
+                                {
+                                    //dlt_log(LOG_WARNING, "Failed to queue resending in dlt_user_trace_network_segmented_thread.\n");
+                                }
                         }
                         free(data);
                         continue;
@@ -2269,9 +2369,10 @@ int dlt_user_trace_network_segmented(DltContext *handle, DltNetworkTraceType nw_
                }
                free(thread_data->header);
                free(thread_data->payload);
-               free(thread_data);
-               dlt_log(LOG_ERR, "NWTSegmented: Could not write into queue.\n");
-               dlt_log(LOG_ERR, strerror(errno));
+               free(thread_data);              
+        char str[256];
+        snprintf(str,255,"NWTSegmented: Could not write into queue: %s \n",strerror(errno));
+        dlt_log(LOG_CRIT, str);
                return -1;
        }
 
@@ -2316,17 +2417,13 @@ int dlt_user_trace_network_truncated(DltContext *handle, DltNetworkTraceType nw_
 
     */
 
-    DLT_SEM_LOCK();
-
     if (dlt_user.dlt_ll_ts==0)
     {
-        DLT_SEM_FREE();
         return -1;
     }
 
-    if (dlt_user.dlt_ll_ts[handle->log_level_pos].trace_status==DLT_TRACE_STATUS_ON)
+    if (handle->trace_status_ptr && *(handle->trace_status_ptr)==DLT_TRACE_STATUS_ON)
     {
-        DLT_SEM_FREE();
 
         log.args_num = 0;
         log.trace_status = nw_trace_type;
@@ -2394,10 +2491,6 @@ int dlt_user_trace_network_truncated(DltContext *handle, DltNetworkTraceType nw_
         /* Send log */
         return dlt_user_log_send_log(&log, DLT_TYPE_NW_TRACE);
     }
-    else
-    {
-        DLT_SEM_FREE();
-    }
 
     return 0;
 }
@@ -2680,6 +2773,8 @@ int dlt_user_log_init(DltContext *handle, DltContextData *log)
 
 int dlt_user_queue_resend(void)
 {
+       static unsigned char dlt_user_queue_resend_error_counter = 0;
+
        if(dlt_user.dlt_log_handle < 0)
        {
                // Fail silenty. FIFO is not open yet
@@ -2703,19 +2798,32 @@ int dlt_user_queue_resend(void)
     /* Open queue if it is not open */
        if(dlt_init_message_queue() < 0)
        {
-               dlt_log(LOG_ERR, "NWTSegmented: Could not open queue.\n");
-                free(resend_data);
+       if(!dlt_user_queue_resend_error_counter)
+       {
+               // log error only when problem occurred first time
+               dlt_log(LOG_ERR, "NWTSegmented: Could not open queue.\n");
+       }
+       dlt_user_queue_resend_error_counter = 1;
+       free(resend_data);
                return -1;
        }
 
     if(mq_send(dlt_user.dlt_segmented_queue_write_handle, (char *)&resend_data, sizeof(s_segmented_data *), 1) < 0)
     {
-       dlt_log(LOG_ERR,"Could not request resending.\n");
-       dlt_log(LOG_ERR, strerror(errno));
+       if(!dlt_user_queue_resend_error_counter)
+       {
+               // log error only when problem occurred first time
+                       char str[255];
+                       snprintf(str,254,"Could not request resending.: %s \n",strerror(errno));
+                       dlt_log(LOG_CRIT, str);
+       }
+       dlt_user_queue_resend_error_counter = 1;
        free(resend_data);
-       DLT_SEM_FREE();
        return -1;
     }
+
+    dlt_user_queue_resend_error_counter = 0;
+
     //thread_data will be freed by the receiver function
     //coverity[leaked_storage]
     return 0;
@@ -2885,11 +2993,13 @@ DltReturnValue dlt_user_log_send_log(DltContextData *log, int mtype)
         /* Reattach to daemon if neccesary */
         dlt_user_log_reattach_to_daemon();
 
-        if (dlt_user.overflow)
+        if (dlt_user.overflow_counter)
         {
             if (dlt_user_log_send_overflow()==0)
             {
-                dlt_user.overflow=0;
+                               sprintf(str,"%u messages discarded!\n",dlt_user.overflow_counter);
+                               dlt_log(LOG_ERR, str);
+                dlt_user.overflow_counter=0;
             }
         }
 
@@ -2940,8 +3050,12 @@ DltReturnValue dlt_user_log_send_log(DltContextData *log, int mtype)
                                 msg.headerbuffer+sizeof(DltStorageHeader), msg.headersize-sizeof(DltStorageHeader),
                                 log->buffer, log->size)==-1)
                        {
-                               dlt_log(LOG_ERR,"Storing message to history buffer failed! Message discarded.\n");
-                               ret = DLT_RETURN_BUFFER_FULL;
+                if(dlt_user.overflow_counter==0)
+                {
+
+                       dlt_log(LOG_ERR,"Buffer full! Messages will be discarded.\n");
+                }
+                ret = DLT_RETURN_BUFFER_FULL;
                        }
 
             DLT_SEM_FREE();
@@ -2949,7 +3063,7 @@ DltReturnValue dlt_user_log_send_log(DltContextData *log, int mtype)
                // Fail silenty if FIFO is not open
             if(dlt_user_queue_resend() < 0 && dlt_user.dlt_log_handle >= 0)
             {
-               dlt_log(LOG_WARNING, "Failed to queue resending.\n");
+                ;//dlt_log(LOG_WARNING, "dlt_user_log_send_log: Failed to queue resending.\n");
             }
         }
 
@@ -2958,12 +3072,12 @@ DltReturnValue dlt_user_log_send_log(DltContextData *log, int mtype)
         case DLT_RETURN_BUFFER_FULL:
         {
                /* Buffer full */
+            dlt_user.overflow_counter += 1;
                return DLT_RETURN_BUFFER_FULL;
         }
         case DLT_RETURN_PIPE_FULL:
         {
             /* data could not be written */
-            dlt_user.overflow = 1;
             return DLT_RETURN_PIPE_FULL;
         }
         case DLT_RETURN_PIPE_ERROR:
@@ -3062,7 +3176,7 @@ int dlt_user_log_send_register_application(void)
 
         if(dlt_user_queue_resend() < 0 && dlt_user.dlt_log_handle >= 0)
         {
-               dlt_log(LOG_WARNING, "Failed to queue resending.\n");
+            ;//dlt_log(LOG_WARNING, "dlt_user_log_send_register_application: Failed to queue resending.\n");
         }
     }
 
@@ -3173,7 +3287,7 @@ int dlt_user_log_send_register_context(DltContextData *log)
 
         if(dlt_user_queue_resend() < 0 && dlt_user.dlt_log_handle >= 0)
         {
-               dlt_log(LOG_WARNING, "Failed to queue resending.\n");
+            ;//dlt_log(LOG_WARNING, "dlt_user_log_send_register_context: Failed to queue resending.\n");
         }
     }
 
@@ -3395,7 +3509,8 @@ int dlt_user_log_check_user_message(void)
                 while ((int32_t)(sizeof(DltUserHeader)+offset)<=receiver->bytesRcvd);
 
                 /* Check for user header pattern */
-                if (dlt_user_check_userheader(userheader)==0)
+                if (dlt_user_check_userheader(userheader)<0 ||
+                    dlt_user_check_userheader(userheader)==0)
                 {
                     break;
                 }
@@ -3431,6 +3546,10 @@ int dlt_user_log_check_user_message(void)
                             {
                                 dlt_user.dlt_ll_ts[usercontextll->log_level_pos].log_level = usercontextll->log_level;
                                 dlt_user.dlt_ll_ts[usercontextll->log_level_pos].trace_status = usercontextll->trace_status;
+                                if(dlt_user.dlt_ll_ts[usercontextll->log_level_pos].log_level_ptr)
+                                       *(dlt_user.dlt_ll_ts[usercontextll->log_level_pos].log_level_ptr) = usercontextll->log_level;
+                                if(dlt_user.dlt_ll_ts[usercontextll->log_level_pos].trace_status_ptr)
+                                       *(dlt_user.dlt_ll_ts[usercontextll->log_level_pos].trace_status_ptr) = usercontextll->trace_status;
                             }
                         }
 
@@ -3682,6 +3801,7 @@ void dlt_user_log_reattach_to_daemon(void)
 int dlt_user_log_send_overflow(void)
 {
     DltUserHeader userheader;
+    DltUserControlMsgBufferOverflow userpayload;
     DltReturnValue ret;
 
     /* set userheader */
@@ -3695,8 +3815,13 @@ int dlt_user_log_send_overflow(void)
         return 0;
     }
 
+    /* set user message parameters */
+    userpayload.overflow_counter = dlt_user.overflow_counter;
+    dlt_set_id(userpayload.apid,dlt_user.appID);
+
     /* log to FIFO */
-    ret=dlt_user_log_out2(dlt_user.dlt_log_handle, &(userheader), sizeof(DltUserHeader), 0, 0);
+    ret=dlt_user_log_out2(dlt_user.dlt_log_handle, &(userheader), sizeof(DltUserHeader),
+                             &(userpayload), sizeof(DltUserControlMsgBufferOverflow));
     return ((ret==DLT_RETURN_OK)?0:-1);
 }