X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fshared%2Fdlt_common.c;h=b7a865e66df12f211af50a8b6ed68d85aa0b6d98;hb=f524304ff10ce50259cc28ced0915ba47e294920;hp=033ea1feed9c8148e36ffd6b667a268196232d56;hpb=7348250fccdabfd4762dbae90637373f6585f4eb;p=profile%2Fivi%2Fdlt-daemon.git diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c index 033ea1f..b7a865e 100755 --- a/src/shared/dlt_common.c +++ b/src/shared/dlt_common.c @@ -1,37 +1,22 @@ -/* - * Dlt- Diagnostic Log and Trace console apps +/** * @licence app begin@ + * Copyright (C) 2012 BMW AG + * + * This file is part of GENIVI Project Dlt - Diagnostic Log and Trace console apps. + * + * Contributions are licensed to the GENIVI Alliance under one or more + * Contribution License Agreements. + * + * \copyright + * This Source Code Form is subject to the terms of the + * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with + * this file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * Copyright (C) 2011, BMW AG - Alexander Wenzel - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU Lesser General Public License, version 2.1, as published by the Free Software Foundation. - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General - * Public License, version 2.1, for more details. - * - * You should have received a copy of the GNU Lesser General Public License, version 2.1, along - * with this program; if not, see . - * - * Note that the copyright holders assume that the GNU Lesser General Public License, version 2.1, may - * also be applicable to programs even in cases in which the program is not a library in the technical sense. - * - * Linking DLT statically or dynamically with other modules is making a combined work based on DLT. You may - * license such other modules under the GNU Lesser General Public License, version 2.1. If you do not want to - * license your linked modules under the GNU Lesser General Public License, version 2.1, you - * may use the program under the following exception. - * - * As a special exception, the copyright holders of DLT give you permission to combine DLT - * with software programs or libraries that are released under any license unless such a combination is not - * permitted by the license of such a software program or library. You may copy and distribute such a - * system following the terms of the GNU Lesser General Public License, version 2.1, including this - * special exception, for DLT and the licenses of the other code concerned. - * - * Note that people who make modified versions of DLT are not obligated to grant this special exception - * for their modified versions; it is their choice whether to do so. The GNU Lesser General Public License, - * version 2.1, gives permission to release a modified version without this exception; this exception - * also makes it possible to release a modified version which carries forward this exception. * + * \author Alexander Wenzel BMW 2011-2012 + * + * \file dlt_common.c + * For further information see http://www.genivi.org/. * @licence end@ */ @@ -82,6 +67,7 @@ #include /* for malloc(), free() */ #include /* for strlen(), memcmp(), memmove() */ #include /* for localtime(), strftime() */ +#include /* for NAME_MAX */ #include "dlt_common.h" #include "dlt_common_cfg.h" @@ -117,7 +103,7 @@ char dltSerialHeaderChar[DLT_ID_SIZE] = { 'D','L','S',1 }; /* internal logging parameters */ static int logging_mode = 0; static int logging_level = 6; -static char logging_filename[256] = ""; +static char logging_filename[NAME_MAX + 1] = ""; static FILE *logging_handle = 0; char *message_type[] = {"log","app_trace","nw_trace","control","","","",""}; @@ -598,8 +584,10 @@ int dlt_filter_find(DltFilter *filter,const char *apid,const char *ctid, int ver /* apid matches, now check for ctid */ if (ctid==0) { - /* check if empty ctid matches */ - if (memcmp(filter->ctid[num],"",DLT_ID_SIZE)==0) + /* check if empty ctid matches */ + //if (memcmp(filter->ctid[num],"",DLT_ID_SIZE)==0)//coverity complains here about Out-of-bounds access. + char empty_ctid[DLT_ID_SIZE]=""; + if (memcmp(filter->ctid[num],empty_ctid,DLT_ID_SIZE)==0) { return num; } @@ -713,6 +701,7 @@ int dlt_message_init(DltMessage *msg,int verbose) msg->datasize = 0; msg->databuffer = 0; + msg->databuffersize = 0; msg->storageheader = 0; msg->standardheader = 0; @@ -735,8 +724,9 @@ int dlt_message_free(DltMessage *msg,int verbose) if (msg->databuffer) { free(msg->databuffer); + msg->databuffer = 0; + msg->databuffersize = 0; } - msg->databuffer = 0; return 0; } @@ -1256,11 +1246,16 @@ int dlt_message_read(DltMessage *msg,uint8_t *buffer,unsigned int length,int res /* free last used memory for buffer */ if (msg->databuffer) { - free(msg->databuffer); + if (msg->datasize>msg->databuffersize){ + free(msg->databuffer); + msg->databuffer=(uint8_t *)malloc(msg->datasize); + msg->databuffersize = msg->datasize; + } + }else{ + /* get new memory for buffer */ + msg->databuffer = (uint8_t *)malloc(msg->datasize); + msg->databuffersize = msg->datasize; } - - /* get new memory for buffer */ - msg->databuffer = (uint8_t *)malloc(msg->datasize); if (msg->databuffer == 0) { sprintf(str,"Cannot allocate memory for payload buffer of size %d!\n",msg->datasize); @@ -1489,7 +1484,8 @@ int dlt_file_read_header_raw(DltFile *file,int resync,int verbose) else { /* go back to last file position */ - fseek(file->handle,file->file_position,SEEK_SET); + if (0 != fseek(file->handle,file->file_position,SEEK_SET)) + return -1; } } @@ -1603,13 +1599,17 @@ int dlt_file_read_data(DltFile *file, int verbose) } /* free last used memory for buffer */ - if (file->msg.databuffer) + if (file->msg.databuffer && (file->msg.databuffersize < file->msg.datasize)) { free(file->msg.databuffer); + file->msg.databuffer=0; } - /* get new memory for buffer */ - file->msg.databuffer = (uint8_t *)malloc(file->msg.datasize); + if (file->msg.databuffer == 0){ + /* get new memory for buffer */ + file->msg.databuffer = (uint8_t *)malloc(file->msg.datasize); + file->msg.databuffersize = file->msg.datasize; + } if (file->msg.databuffer == 0) { @@ -1658,14 +1658,26 @@ int dlt_file_open(DltFile *file,const char *filename,int verbose) file->handle = fopen(filename,"rb"); if (file->handle == 0) { - sprintf(str,"File %s cannot be opened!\n",filename); + snprintf(str, DLT_COMMON_BUFFER_LENGTH - 1 ,"File %s cannot be opened!\n",filename); + dlt_log(LOG_ERR, str); return -1; } - fseek(file->handle,0,SEEK_END); + if (0 != fseek(file->handle,0,SEEK_END)) + { + sprintf(str,"dlt_file_open: Seek failed to 0,SEEK_END"); + dlt_log(LOG_ERR, str); + return -1; + } file->file_length = ftell(file->handle); - fseek(file->handle,0,SEEK_SET); + + if (0 != fseek(file->handle,0,SEEK_SET)) + { + sprintf(str,"dlt_file_open: Seek failed to 0,SEEK_SET"); + dlt_log(LOG_ERR, str); + return -1; + } if (verbose) { @@ -1711,7 +1723,12 @@ int dlt_file_read(DltFile *file,int verbose) } /* set to end of last succesful read message, because of conflicting calls to dlt_file_read and dlt_file_message */ - fseek(file->handle,file->file_position,SEEK_SET); + if (0 != fseek(file->handle,file->file_position,SEEK_SET)) + { + sprintf(str,"Seek failed to file_position %ld \n",file->file_position); + dlt_log(LOG_ERR, str); + return -1; + } /* get file position at start of DLT message */ if (verbose) @@ -1734,7 +1751,11 @@ int dlt_file_read(DltFile *file,int verbose) if (dlt_file_read_header_extended(file, verbose)<0) { /* go back to last position in file */ - fseek(file->handle,file->file_position,SEEK_SET); + if (0 != fseek(file->handle,file->file_position,SEEK_SET)) + { + sprintf(str,"Seek to last file pos failed!\n"); + dlt_log(LOG_ERR, str); + } return-1; } @@ -1754,9 +1775,15 @@ int dlt_file_read(DltFile *file,int verbose) if (fseek(file->handle,file->msg.datasize,SEEK_CUR)!=0) { /* go back to last position in file */ - fseek(file->handle,file->file_position,SEEK_SET); sprintf(str,"Seek failed to skip payload data of size %d!\n",file->msg.datasize); dlt_log(LOG_ERR, str); + + if (0 != fseek(file->handle,file->file_position,SEEK_SET)) + { + sprintf(str,"Seek back also failed!\n"); + dlt_log(LOG_ERR, str); + } + return -1; } } @@ -1766,11 +1793,16 @@ int dlt_file_read(DltFile *file,int verbose) /* skip additional header parameters and payload data */ if (fseek(file->handle,file->msg.headersize - sizeof(DltStorageHeader) - sizeof(DltStandardHeader) + file->msg.datasize,SEEK_CUR)) { - /* go back to last position in file */ - fseek(file->handle,file->file_position,SEEK_SET); + sprintf(str,"Seek failed to skip extra header and payload data from file of size %d!\n", file->msg.headersize - sizeof(DltStorageHeader) - sizeof(DltStandardHeader) + file->msg.datasize); dlt_log(LOG_ERR, str); + /* go back to last position in file */ + if (fseek(file->handle,file->file_position,SEEK_SET)) + { + sprintf(str,"Seek back also failed!\n"); + dlt_log(LOG_ERR, str); + } return -1; } @@ -1823,8 +1855,9 @@ int dlt_file_read_raw(DltFile *file,int resync, int verbose) file->index = ptr; } - /* set to end of last succesful read message, because of conflicting calls to dlt_file_read and dlt_file_message */ - fseek(file->handle,file->file_position,SEEK_SET); + /* set to end of last successful read message, because of conflicting calls to dlt_file_read and dlt_file_message */ + if (0 != fseek(file->handle,file->file_position,SEEK_SET)) + return -1; /* get file position at start of DLT message */ if (verbose) @@ -1837,7 +1870,11 @@ int dlt_file_read_raw(DltFile *file,int resync, int verbose) if (dlt_file_read_header_raw(file,resync,verbose)<0) { /* go back to last position in file */ - fseek(file->handle,file->file_position,SEEK_SET); + if (0!= fseek(file->handle,file->file_position,SEEK_SET)) + { + sprintf(str,"dlt_file_read_raw, fseek failed 1\n"); + dlt_log(LOG_ERR, str); + } return -1; } @@ -1845,14 +1882,22 @@ int dlt_file_read_raw(DltFile *file,int resync, int verbose) if (dlt_file_read_header_extended(file, verbose)<0) { /* go back to last position in file */ - fseek(file->handle,file->file_position,SEEK_SET); + if (0 != fseek(file->handle,file->file_position,SEEK_SET)) + { + sprintf(str,"dlt_file_read_raw, fseek failed 2\n"); + dlt_log(LOG_ERR, str); + } return-1; } if (dlt_file_read_data(file,verbose)<0) { /* go back to last position in file */ - fseek(file->handle,file->file_position,SEEK_SET); + if (0 != fseek(file->handle,file->file_position,SEEK_SET)) + { + sprintf(str,"dlt_file_read_raw, fseek failed 3\n"); + dlt_log(LOG_ERR, str); + } return-1; } @@ -1971,7 +2016,8 @@ void dlt_log_set_level(int level) void dlt_log_set_filename(const char *filename) { - strncpy(logging_filename,filename,sizeof(logging_filename)); + strncpy(logging_filename,filename,NAME_MAX); + } void dlt_log_init(int mode) @@ -2203,6 +2249,13 @@ int dlt_receiver_remove(DltReceiver *receiver,int size) return -1; } + if (size > receiver->bytesRcvd || size <= 0) + { + receiver->buf = receiver->buf + receiver->bytesRcvd; + receiver->bytesRcvd=0; + return -1; + } + receiver->bytesRcvd = receiver->bytesRcvd - size; receiver->buf = receiver->buf + size; @@ -2341,6 +2394,7 @@ int dlt_buffer_init_static_client(DltBuffer *buf, const unsigned char *ptr, uint int dlt_buffer_init_dynamic(DltBuffer *buf, uint32_t min_size, uint32_t max_size,uint32_t step_size) { + //Do not DLT_SEM_LOCK inside here! char str[256]; DltBufferHead *head; @@ -2368,8 +2422,8 @@ int dlt_buffer_init_dynamic(DltBuffer *buf, uint32_t min_size, uint32_t max_size // clear memory memset(buf->mem,0,buf->size); - snprintf(str,sizeof(str),"Buffer: Size %d bytes\n",buf->size); - dlt_log(LOG_INFO, str); + //snprintf(str,sizeof(str),"Buffer: Size %d bytes\n",buf->size); + //dlt_log(LOG_INFO, str); return 0; /* OK */ } @@ -2400,7 +2454,7 @@ int dlt_buffer_free_dynamic(DltBuffer *buf) void dlt_buffer_write_block(DltBuffer *buf,int *write, const unsigned char *data,unsigned int size) { - if((*write+size) <= buf->size) { + if((int)(*write+size) <= buf->size) { // write one block memcpy(buf->mem+*write,data,size); *write += size; @@ -2415,7 +2469,7 @@ void dlt_buffer_write_block(DltBuffer *buf,int *write, const unsigned char *data void dlt_buffer_read_block(DltBuffer *buf,int *read,unsigned char *data,unsigned int size) { - if((*read+size) <= buf->size) { + if((int)(*read+size) <= buf->size) { // read one block memcpy(data,buf->mem+*read,size); *read += size; @@ -2577,7 +2631,7 @@ int dlt_buffer_push3(DltBuffer *buf,const unsigned char *data1,unsigned int size free_size = buf->size - write + read; // check size - if(free_size < (sizeof(DltBufferBlockHead)+size1+size2+size3)) { + if(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 */ @@ -2651,7 +2705,7 @@ int dlt_buffer_get(DltBuffer *buf,unsigned char *data, int max_size,int delete) used_size = buf->size - read + write; // first check size - if(used_size < (sizeof(DltBufferBlockHead))) { + if(used_size < (int)(sizeof(DltBufferBlockHead))) { dlt_log(LOG_ERR,"Buffer: Size check 1 failed\n"); dlt_buffer_reset(buf); return -1; // ERROR @@ -2675,7 +2729,7 @@ int dlt_buffer_get(DltBuffer *buf,unsigned char *data, int max_size,int delete) } // second check size - if(used_size < (sizeof(DltBufferBlockHead)+head.size)) { + if(used_size < (int)(sizeof(DltBufferBlockHead)+head.size)) { dlt_log(LOG_ERR,"Buffer: Size check 2 failed\n"); dlt_buffer_reset(buf); return -1; // ERROR @@ -3043,8 +3097,8 @@ speed_t dlt_convert_serial_speed(int baudrate) void dlt_get_version(char *buf) { - sprintf(buf,"DLT Package Version: %s %s, Package Revision: %s, build on %s %s\n", - _DLT_PACKAGE_VERSION, _DLT_PACKAGE_VERSION_STATE, _DLT_PACKAGE_REVISION, __DATE__ , __TIME__ ); + sprintf(buf,"DLT Package Version: %s %s, Package Revision: %s, build on %s %s\n%s %s %s %s\n", + _DLT_PACKAGE_VERSION, _DLT_PACKAGE_VERSION_STATE, _DLT_PACKAGE_REVISION, __DATE__ , __TIME__,_DLT_SYSTEMD_ENABLE,_DLT_SYSTEMD_WATCHDOG_ENABLE,_DLT_TEST_ENABLE,_DLT_SHM_ENABLE ); } void dlt_get_major_version(char *buf) @@ -3069,8 +3123,8 @@ uint32_t dlt_uptime(void) struct timespec ts; if (clock_gettime(CLOCK_MONOTONIC,&ts)==0) - { - return (uint32_t)((((ts.tv_sec*1000000)+(ts.tv_nsec/1000)))/100); // in 0.1 ms = 100 us + { + return ( (uint32_t)ts.tv_sec*10000 + (uint32_t)ts.tv_nsec/100000 );// in 0.1 ms = 100 us } else { @@ -3174,7 +3228,7 @@ int dlt_message_argument_print(DltMessage *msg,uint32_t type_info,uint8_t **ptr, float64_t value64f=0,value64f_tmp=0; int64_t value64f_tmp_int64i=0,value64f_tmp_int64i_swaped=0; - uint32_t quantisation=0, quantisation_tmp=0; + uint32_t quantisation_tmp=0; if (type_info & DLT_TYPE_INFO_STRG) { @@ -3229,7 +3283,7 @@ int dlt_message_argument_print(DltMessage *msg,uint32_t type_info,uint8_t **ptr, return -1; sprintf(text+strlen(text),"%d",value8u); } - else if (type_info & DLT_TYPE_INFO_SINT || type_info & DLT_TYPE_INFO_UINT) + else if ((type_info & DLT_TYPE_INFO_SINT) || (type_info & DLT_TYPE_INFO_UINT)) { /* signed or unsigned argument received */ if (type_info & DLT_TYPE_INFO_VARI) @@ -3253,13 +3307,11 @@ int dlt_message_argument_print(DltMessage *msg,uint32_t type_info,uint8_t **ptr, } if (type_info & DLT_TYPE_INFO_FIXP) { - quantisation=0; - quantisation_tmp=0; + //compiler warning: variable ‘quantisation_tmp’ set but not used [-Wunused-but-set-variable], but: DLT_MSG_READ_VALUE wants a parameter, "0" does not work DLT_MSG_READ_VALUE(quantisation_tmp,*ptr,*datalength,uint32_t); + if((*datalength)<0) return -1; - quantisation=DLT_ENDIAN_GET_32(msg->standardheader->htyp, quantisation_tmp); - switch ( type_info & DLT_TYPE_INFO_TYLE) { case DLT_TYLE_8BIT: