summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/shared/dlt_shm.c60
-rwxr-xr-xsrc/system/dlt-system.c34
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) {