diff options
-rw-r--r-- | src/shared/dlt_shm.c | 60 | ||||
-rwxr-xr-x | src/system/dlt-system.c | 34 |
2 files changed, 72 insertions, 22 deletions
diff --git a/src/shared/dlt_shm.c b/src/shared/dlt_shm.c index 5859af1..5ad4775 100644 --- a/src/shared/dlt_shm.c +++ b/src/shared/dlt_shm.c @@ -184,29 +184,28 @@ int dlt_shm_init_client(DltShm *buf,int key) { // get the size of shm if (shmctl(buf->shmid, IPC_STAT, &shm_buf)) { - dlt_log(LOG_ERR,"SHM: shmctl"); - return -1; /* ERROR */ + dlt_log(LOG_ERR,"SHM: shmctl"); + return -1; /* ERROR */ } - // Now we attach the segment to our data space. - if ((buf->shm = shmat(buf->shmid, NULL, 0)) == (char *) -1) { - dlt_log(LOG_ERR,"shmat"); - return -1; /* ERROR */ - } + // Now we attach the segment to our data space. + if ((buf->shm = shmat(buf->shmid, NULL, 0)) == (char *) -1) { + dlt_log(LOG_ERR,"shmat"); + return -1; /* ERROR */ + } // Init semaphore if( (buf->semid = semget(DLT_SHM_SEM,0,0)) == -1 ) { - dlt_log(LOG_ERR,"SHM: semget"); - return -1; /* ERROR */ + dlt_log(LOG_ERR,"SHM: semget"); + return -1; /* ERROR */ } - DLT_SHM_SEM_FREE(buf->semid); // Init pointers - buf->mem = (char*)(&(((int*)(buf->shm))[3])); - buf->size = shm_buf.shm_segsz - (buf->mem - buf->shm); + buf->mem = (char*)(&(((int*)(buf->shm))[3])); + buf->size = shm_buf.shm_segsz - (buf->mem - buf->shm); //dlt_shm_status(buf); - //dlt_shm_info(buf); + //dlt_shm_info(buf); return 0; /* OK */ } @@ -252,9 +251,11 @@ int dlt_shm_get_used_size(DltShm *buf) { int write, read, count; + DLT_SHM_SEM_GET(buf->semid); write = ((int*)(buf->shm))[0]; read = ((int*)(buf->shm))[1]; count = ((int*)(buf->shm))[2]; + DLT_SHM_SEM_FREE(buf->semid); if(count == 0) return 0; @@ -342,9 +343,6 @@ int dlt_shm_push(DltShm *buf,const unsigned char *data1,unsigned int size1,const *((unsigned char*)(buf->mem+write)) = 1; // set write status *((int*)(buf->mem+write+sizeof(unsigned char))) = size1+size2+size3+sizeof(head); // set write size - // free semaphore - DLT_SHM_SEM_FREE(buf->semid); - // write data memcpy(buf->mem+write+sizeof(unsigned char)+sizeof(int),head,sizeof(head)); if(data1) @@ -357,6 +355,9 @@ int dlt_shm_push(DltShm *buf,const unsigned char *data1,unsigned int size1,const // update write status *((unsigned char*)(buf->mem+write)) = 2; + // free semaphore + DLT_SHM_SEM_FREE(buf->semid); + return 0; // OK } @@ -381,7 +382,6 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size) write = ((int*)(buf->shm))[0]; read = ((int*)(buf->shm))[1]; count = ((int*)(buf->shm))[2]; - DLT_SHM_SEM_FREE(buf->semid); // check if data is in there if(count<=0) { @@ -389,6 +389,7 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size) { dlt_shm_reset(buf); } + DLT_SHM_SEM_FREE(buf->semid); return -1; // ERROR } @@ -411,12 +412,15 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size) // check status if(status != 2 ) { + //printf("Buffer is not fully written\n"); + DLT_SHM_SEM_FREE(buf->semid); dlt_log(LOG_ERR,"Buffer is not fully written\n"); return -1; // ERROR } // plausibility check of buffer size if( (read+size) > buf->size) { + DLT_SHM_SEM_FREE(buf->semid); dlt_log(LOG_ERR,"SHM: Buffers size bigger than shm buffer\n"); dlt_shm_reset(buf); return -1; // ERROR @@ -424,6 +428,7 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size) // check max read size if(size > max_size) { + DLT_SHM_SEM_FREE(buf->semid); dlt_log(LOG_ERR,"SHM: Buffer is bigger than max size\n"); dlt_shm_reset(buf); return -1; // ERROR @@ -443,6 +448,8 @@ int dlt_shm_pull(DltShm *buf,unsigned char *data, int max_size) ((int*)(buf->shm))[1] = read+sizeof(unsigned char)+sizeof(int)+size; // set new read pointer ((int*)(buf->shm))[2] -= 1; // decrease counter + DLT_SHM_SEM_FREE(buf->semid); + return size-sizeof(head); // OK } @@ -460,7 +467,6 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size) dlt_log(LOG_ERR,"SHM: SHM not initialised\n"); return -1; /* ERROR */ } - DLT_SHM_SEM_FREE(buf->semid); // get current write pointer DLT_SHM_SEM_GET(buf->semid); @@ -474,6 +480,7 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size) { dlt_shm_reset(buf); } + DLT_SHM_SEM_FREE(buf->semid); return -1; // ERROR } @@ -497,12 +504,14 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size) // check status if(status != 2 ) { + DLT_SHM_SEM_FREE(buf->semid); dlt_log(LOG_ERR,"Buffer is not fully written\n"); return -1; // ERROR } // plausibility check of buffer size if( (read+size) > buf->size) { + DLT_SHM_SEM_FREE(buf->semid); dlt_log(LOG_ERR,"SHM: Buffers size bigger than shm buffer\n"); dlt_shm_reset(buf); return -1; // ERROR @@ -510,6 +519,7 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size) // check max read size if((size-sizeof(head)) > max_size) { + DLT_SHM_SEM_FREE(buf->semid); dlt_log(LOG_ERR,"SHM: Buffer is bigger than max size\n"); dlt_shm_reset(buf); return -1; // ERROR @@ -518,6 +528,8 @@ int dlt_shm_copy(DltShm *buf,unsigned char *data, int max_size) // copy data memcpy(data,buf->mem+read+sizeof(unsigned char)+sizeof(int)+sizeof(head),size-sizeof(head)); + DLT_SHM_SEM_FREE(buf->semid); + return size-sizeof(head); // OK } @@ -537,7 +549,6 @@ int dlt_shm_remove(DltShm *buf) write = ((int*)(buf->shm))[0]; read = ((int*)(buf->shm))[1]; count = ((int*)(buf->shm))[2]; - DLT_SHM_SEM_FREE(buf->semid); // check if data is in there if(count<=0) { @@ -545,6 +556,7 @@ int dlt_shm_remove(DltShm *buf) { dlt_shm_reset(buf); } + DLT_SHM_SEM_FREE(buf->semid); return -1; // ERROR } @@ -568,12 +580,14 @@ int dlt_shm_remove(DltShm *buf) // check status if(status != 2 ) { + DLT_SHM_SEM_FREE(buf->semid); dlt_log(LOG_ERR,"Buffer is not fully written\n"); return -1; // ERROR } // plausibility check of buffer size if( (read+size) > buf->size) { + DLT_SHM_SEM_FREE(buf->semid); dlt_log(LOG_ERR,"SHM: Buffers size bigger than shm buffer\n"); dlt_shm_reset(buf); return -1; // ERROR @@ -583,6 +597,8 @@ int dlt_shm_remove(DltShm *buf) ((int*)(buf->shm))[1] = read+sizeof(unsigned char)+sizeof(int)+size; // set new read pointer ((int*)(buf->shm))[2] -= 1; // decrease counter + DLT_SHM_SEM_FREE(buf->semid); + return size; // OK } @@ -592,9 +608,9 @@ int dlt_shm_reset(DltShm *buf) { /* reset pointers and counters */ DLT_SHM_SEM_GET(buf->semid); - ((int*)(buf->shm))[0] = 0; // pointer to write memory - ((int*)(buf->shm))[1] = 0; // pointer to read memory - ((int*)(buf->shm))[2] = 0; // number of packets + ((int*)(buf->shm))[0] = 0; // pointer to write memory + ((int*)(buf->shm))[1] = 0; // pointer to read memory + ((int*)(buf->shm))[2] = 0; // number of packets DLT_SHM_SEM_FREE(buf->semid); return 0; /* OK */ diff --git a/src/system/dlt-system.c b/src/system/dlt-system.c index fc45e1e..2040aab 100755 --- a/src/system/dlt-system.c +++ b/src/system/dlt-system.c @@ -82,6 +82,7 @@ #include <ctype.h> #include <fcntl.h> #include <pthread.h> +#include <unistd.h> #include <sys/timerfd.h> #include <sys/stat.h> @@ -101,6 +102,7 @@ DLT_DECLARE_CONTEXT(syslogContext); DLT_DECLARE_CONTEXT(processesContext); DLT_DECLARE_CONTEXT(filetransferContext); +DLT_DECLARE_CONTEXT(shellContext); DltContext logFileContext[DLT_SYSTEM_LOG_FILE_MAX]; DltSystemOptions options; @@ -463,6 +465,8 @@ void dlt_system_cleanup() if(options.LogProcessesEnable) DLT_UNREGISTER_CONTEXT(processesContext); + + DLT_UNREGISTER_CONTEXT(shellContext); DLT_UNREGISTER_APP(); } @@ -492,6 +496,34 @@ void dlt_system_signal_handler(int sig) } /* switch */ } /* dlt_system_signal_handler() */ +int dlt_user_injection_callback(uint32_t service_id, void *data, uint32_t length) +{ + char text[1024]; + + strncpy(text,data,length); + + switch(service_id) + { + case 0x1001: + /* Execute shell command */ + //DLT_LOG(shellContext, DLT_LOG_INFO, DLT_STRING("Execute command:"), DLT_STRING(text)); + printf("Execute command: %s\n",text); + system(text); + break; + default: + //DLT_LOG(shellContext, DLT_LOG_WARN, DLT_STRING("Unknown command received! Service ID:"), DLT_UINT32(service_id),DLT_STRING("Command:"),DLT_STRING(text)); + printf("Unknown command received! Service ID: %u Command: %s\n",service_id,text); + break; + } + + printf("Injection %d, Length=%d \n",service_id,length); + if (length>0) + { + } + + return 0; +} + int main(int argc, char* argv[]) { int sock; @@ -551,6 +583,8 @@ int main(int argc, char* argv[]) runtime.timeLogProcessDelay[num]=0; } } + DLT_REGISTER_CONTEXT(shellContext,"CMD","Execute Shell commands"); + DLT_REGISTER_INJECTION_CALLBACK(shellContext, 0x1001, dlt_user_injection_callback); /* create systemd socket */ if(options.SyslogEnable) { |