diff options
author | Simon Brandner <simon.brandner@partner.bmw.de> | 2012-12-06 10:18:12 +0100 |
---|---|---|
committer | Alexander Wenzel <Alexander.AW.Wenzel@bmw.de> | 2013-07-19 16:54:05 +0200 |
commit | be9c3bf964295883ff086dfb8c2ece38f833b355 (patch) | |
tree | 9faf2962efc5b7c24c98f5082d8afd4c2f7a2907 /src/daemon/dlt-daemon.c | |
parent | 311b8896c144c5ff8c10dbc0d4c7832720292608 (diff) | |
download | DLT-daemon-be9c3bf964295883ff086dfb8c2ece38f833b355.tar.gz |
appended null termination to version string
adding closure of socket in syslog_thread and read_socket
fixed missing free of filepath in compressed file transfer
fixed missing closedir in added in send_one error case
fixed missing fclose of src_file in ferror case
dlt-daemon.c fixed missing fclose in ferror case
dlt_common.c using snprintf for filename instead sprintf in dlt_file_open
modified some magix numbers - replaced by limits.h values. added strncpy instead strcpy to make cp more safe. split up a function to avoid coverity complaint when computing size of a write buffer length
dlt_daemon_common: added strncpy instead strcpy to make cp more safe.
Fixes some more Coverity issues in dlt-daemon.c dlt_user.c dlt_common.c and dlt_offline_trace.c.
Conflicts:
src/daemon/dlt-daemon.c
src/lib/dlt_user.c
Signed-off-by: Alexander Wenzel <Alexander.AW.Wenzel@bmw.de>
Diffstat (limited to 'src/daemon/dlt-daemon.c')
-rw-r--r-- | src/daemon/dlt-daemon.c | 82 |
1 files changed, 38 insertions, 44 deletions
diff --git a/src/daemon/dlt-daemon.c b/src/daemon/dlt-daemon.c index 7e9b6ba..059afe8 100644 --- a/src/daemon/dlt-daemon.c +++ b/src/daemon/dlt-daemon.c @@ -159,7 +159,7 @@ int option_handling(DltDaemonLocal *daemon_local,int argc, char* argv[]) } case 'c': { - strncpy(daemon_local->flags.cvalue,optarg,sizeof(daemon_local->flags.cvalue)); + strncpy(daemon_local->flags.cvalue,optarg,NAME_MAX); break; } case 'h': @@ -203,9 +203,10 @@ int option_handling(DltDaemonLocal *daemon_local,int argc, char* argv[]) int option_file_parser(DltDaemonLocal *daemon_local) { FILE * pFile; - char line[1024]; - char token[1024]; - char value[1024]; + int value_length = 1024; + char line[value_length-1]; + char token[value_length]; + char value[value_length]; char *pch; const char *filename; @@ -234,7 +235,7 @@ int option_file_parser(DltDaemonLocal *daemon_local) while(1) { /* fetch line from configuration file */ - if ( fgets (line , 1024 , pFile) != NULL ) + if ( fgets (line , value_length - 1 , pFile) != NULL ) { pch = strtok (line," =\r\n"); token[0]=0; @@ -247,11 +248,11 @@ int option_file_parser(DltDaemonLocal *daemon_local) if(token[0]==0) { - strncpy(token,pch,sizeof(token)); + strncpy(token,pch,sizeof(token) - 1); } else { - strncpy(value,pch,sizeof(value)); + strncpy(value,pch,sizeof(value) - 1); break; } @@ -308,22 +309,22 @@ int option_file_parser(DltDaemonLocal *daemon_local) } else if(strcmp(token,"RS232DeviceName")==0) { - strncpy(daemon_local->flags.yvalue,value,sizeof(daemon_local->flags.yvalue)); + strncpy(daemon_local->flags.yvalue,value,NAME_MAX); //printf("Option: %s=%s\n",token,value); } else if(strcmp(token,"RS232Baudrate")==0) { - strncpy(daemon_local->flags.bvalue,value,sizeof(daemon_local->flags.bvalue)); + strncpy(daemon_local->flags.bvalue,value,NAME_MAX); //printf("Option: %s=%s\n",token,value); } else if(strcmp(token,"ECUId")==0) { - strncpy(daemon_local->flags.evalue,value,sizeof(daemon_local->flags.evalue)); + strncpy(daemon_local->flags.evalue,value,NAME_MAX); //printf("Option: %s=%s\n",token,value); } else if(strcmp(token,"PersistanceStoragePath")==0) { - strncpy(daemon_local->flags.ivalue,value,sizeof(daemon_local->flags.ivalue)); + strncpy(daemon_local->flags.ivalue,value,NAME_MAX); //printf("Option: %s=%s\n",token,value); } else if(strcmp(token,"LoggingMode")==0) @@ -338,7 +339,7 @@ int option_file_parser(DltDaemonLocal *daemon_local) } else if(strcmp(token,"LoggingFilename")==0) { - strncpy(daemon_local->flags.loggingFilename,value,sizeof(daemon_local->flags.loggingFilename)); + strncpy(daemon_local->flags.loggingFilename,value,sizeof(daemon_local->flags.loggingFilename) - 1); //printf("Option: %s=%s\n",token,value); } else if(strcmp(token,"SharedMemorySize")==0) @@ -348,7 +349,7 @@ int option_file_parser(DltDaemonLocal *daemon_local) } else if(strcmp(token,"OfflineTraceDirectory")==0) { - strncpy(daemon_local->flags.offlineTraceDirectory,value,sizeof(daemon_local->flags.offlineTraceDirectory)); + strncpy(daemon_local->flags.offlineTraceDirectory,value,sizeof(daemon_local->flags.offlineTraceDirectory) - 1); //printf("Option: %s=%s\n",token,value); } else if(strcmp(token,"OfflineTraceFileSize")==0) @@ -368,7 +369,7 @@ int option_file_parser(DltDaemonLocal *daemon_local) } else if(strcmp(token,"PathToECUSoftwareVersion")==0) { - strncpy(daemon_local->flags.pathToECUSoftwareVersion,value,sizeof(daemon_local->flags.pathToECUSoftwareVersion)); + strncpy(daemon_local->flags.pathToECUSoftwareVersion,value,sizeof(daemon_local->flags.pathToECUSoftwareVersion) - 1); //printf("Option: %s=%s\n",token,value); } @@ -995,25 +996,13 @@ void dlt_daemon_daemonize(int verbose) /* Open standard descriptors stdin, stdout, stderr */ i=open("/dev/null",O_RDWR); /* open stdin */ ret=dup(i); /* stdout */ - if (0 > ret){ - dlt_log(LOG_CRIT, "can't open standard descriptor stdout\n"); - exit(-1); /* can not open */ - } ret=dup(i); /* stderr */ - if (0 > ret){ - dlt_log(LOG_CRIT, "can't open standard descriptor stderr"); - exit(-1); /* can not open */ - } /* Set umask */ umask(DLT_DAEMON_UMASK); /* Change to known directory */ ret=chdir(DLT_USER_DIR); - if (0 > ret){ - dlt_log(LOG_CRIT, "Can't change to known directory"); - exit(-1); /* Can't change to known directory */ - } /* Ensure single copy of daemon; run only one instance at a time */ @@ -1032,9 +1021,6 @@ void dlt_daemon_daemonize(int verbose) sprintf(str,"%d\n",getpid()); bytes_written=write(lfp,str,strlen(str)); /* record pid to lockfile */ - if (0 > bytes_written){ - dlt_log(LOG_CRIT, "write pid to lockfile failed:"); - } /* Catch signals */ signal(SIGCHLD,SIG_IGN); /* ignore child */ @@ -1932,21 +1918,24 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo if (daemon_local->flags.lflag) { ret=write(j,dltSerialHeader,sizeof(dltSerialHeader)); - if (0 > ret) + if (0 > ret) { - dlt_log(LOG_ERR,"write(j,daemon_local->msg.headerbuffer failed\n"); + dlt_log(LOG_ERR,"write(j,dltSerialHeader failed\n"); } } - - ret=write(j,daemon_local->msg.headerbuffer+sizeof(DltStorageHeader),daemon_local->msg.headersize-sizeof(DltStorageHeader)); - if (0 > ret) - { - dlt_log(LOG_ERR,"write(j,dltSerialHeader failed\n"); - } - ret=write(j,daemon_local->msg.databuffer,daemon_local->msg.datasize); - if (0 > ret) - { - dlt_log(LOG_ERR,"write(j,daemon_local->msg.databuffer failed\n"); + int32_t diff = daemon_local->msg.headersize-sizeof(DltStorageHeader); + //extra calculation for coverity + if ( 0 <= diff ){ + ret=write(j,daemon_local->msg.headerbuffer+sizeof(DltStorageHeader),diff); + if (0 > ret) + { + dlt_log(LOG_ERR,"write(j,daemon_local->msg.headerbuffer failed\n"); + } + ret=write(j,daemon_local->msg.databuffer,daemon_local->msg.datasize); + if (0 > ret) + { + dlt_log(LOG_ERR,"write(j,daemon_local->msg.databuffer failed\n"); + } } DLT_DAEMON_SEM_FREE(); @@ -2443,14 +2432,18 @@ void dlt_daemon_ecu_version_thread(void *ptr) while(!feof(f)) { - char buf[DLT_DAEMON_TEXTBUFSIZE]; - read = fread(buf, 1, DLT_DAEMON_TEXTBUFSIZE, f); + char buf[DLT_DAEMON_TEXTBUFSIZE]; + read = fread(buf, 1, DLT_DAEMON_TEXTBUFSIZE - 1, f); + buf [read] = '\0';//append null termination at end of version string. Read is definitely max: DLT_DAEMON_TEXTBUFSIZE - 1 + read++;//Include the appended null termination position + if(ferror(f)) { dlt_log(LOG_ERR, "Failed to read ECU Software version file.\n"); + fclose(f); return; } - if(bufpos + read > DLT_DAEMON_TEXTBUFSIZE) + if(bufpos + read > ( DLT_DAEMON_TEXTBUFSIZE - 1)) { dlt_log(LOG_ERR, "Too long file for ecu version info.\n"); fclose(f); @@ -2459,6 +2452,7 @@ void dlt_daemon_ecu_version_thread(void *ptr) strncpy(version+bufpos, buf, read); bufpos += read; } + version[bufpos] = '\0';//append null termination at end of version string fclose(f); } |