diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-19 09:35:50 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-19 09:35:50 +0200 |
| commit | e4c32963e5fdf1d00fd4ac9fc21425fdea318739 (patch) | |
| tree | 97e768b9766345612df07497ba2321f13c1f5d5a | |
| parent | 2e73e8906e5ba3f81578f1700f7478c94c92acb8 (diff) | |
fix: preserve final capture tokens in parser (task 465)
| -rw-r--r-- | ioriot/src/utils/utils.c | 25 | ||||
| -rw-r--r-- | systemtap/src/ioriot.stp | 2 | ||||
| -rw-r--r-- | systemtap/src/javaioriot.stp | 2 | ||||
| -rw-r--r-- | systemtap/src/targetedioriot.stp | 2 |
4 files changed, 26 insertions, 5 deletions
diff --git a/ioriot/src/utils/utils.c b/ioriot/src/utils/utils.c index ae3549f..8ae52a3 100644 --- a/ioriot/src/utils/utils.c +++ b/ioriot/src/utils/utils.c @@ -46,8 +46,16 @@ char* strtok2_r(char *str, char *delim, char **saveptr) { int len = strlen(delim); - if (str == NULL) + if (str == NULL) { + if (*saveptr == NULL) + return NULL; str = *saveptr; + } + + if (str[0] == '\0') { + *saveptr = NULL; + return NULL; + } char *next = strstr(str, delim); if (next) { @@ -58,7 +66,8 @@ char* strtok2_r(char *str, char *delim, char **saveptr) return str; } - return NULL; + *saveptr = NULL; + return str; } void chreplace(char *str, char replace, char with) @@ -173,6 +182,18 @@ void start_pthread(pthread_t *thread, void*(*cb)(void*), void *data) void utils_test(void) { + char tokens_without_trailer[] = "t=1;:,c=2"; + char *saveptr = NULL; + assert(Eq("t=1", strtok2_r(tokens_without_trailer, ";:,", &saveptr))); + assert(Eq("c=2", strtok2_r(NULL, ";:,", &saveptr))); + assert(NULL == strtok2_r(NULL, ";:,", &saveptr)); + + char tokens_with_trailer[] = "t=1;:,c=2;:,"; + saveptr = NULL; + assert(Eq("t=1", strtok2_r(tokens_with_trailer, ";:,", &saveptr))); + assert(Eq("c=2", strtok2_r(NULL, ";:,", &saveptr))); + assert(NULL == strtok2_r(NULL, ";:,", &saveptr)); + if (getuid() == 0) { set_limits_drop_root("nobody"); struct rlimit rl; diff --git a/systemtap/src/ioriot.stp b/systemtap/src/ioriot.stp index 307aae5..1e12574 100644 --- a/systemtap/src/ioriot.stp +++ b/systemtap/src/ioriot.stp @@ -368,7 +368,7 @@ probe syscall.readahead { probe syscall.readahead.return { if(execname() != "stapio") { ns = gettimeofday_ns() - printf("t=%ld;:,D=%ld;:,i=%d:%d;:,o=%s;:,d=%d;:,b=%ld;:,O=%ld;:,c=%ld\n", + printf("t=%ld;:,D=%ld;:,i=%d:%d;:,o=%s;:,d=%d;:,b=%ld;:,O=%ld;:,c=%ld;:,\n", ns, ns-PROBE_ENTRY_TIMES[tid(),name], pid(), tid(), name, ENTRY_FD[tid(),name], diff --git a/systemtap/src/javaioriot.stp b/systemtap/src/javaioriot.stp index 0f8dd09..3d54b19 100644 --- a/systemtap/src/javaioriot.stp +++ b/systemtap/src/javaioriot.stp @@ -368,7 +368,7 @@ probe syscall.readahead { probe syscall.readahead.return { if(execname() == "java") { ns = gettimeofday_ns() - printf("t=%ld;:,D=%ld;:,i=%d:%d;:,o=%s;:,d=%d;:,b=%ld;:,O=%ld;:,c=%ld\n", + printf("t=%ld;:,D=%ld;:,i=%d:%d;:,o=%s;:,d=%d;:,b=%ld;:,O=%ld;:,c=%ld;:,\n", ns, ns-PROBE_ENTRY_TIMES[tid(),name], pid(), tid(), name, ENTRY_FD[tid(),name], diff --git a/systemtap/src/targetedioriot.stp b/systemtap/src/targetedioriot.stp index e383757..b93b21c 100644 --- a/systemtap/src/targetedioriot.stp +++ b/systemtap/src/targetedioriot.stp @@ -368,7 +368,7 @@ probe syscall.readahead { probe syscall.readahead.return { if(pid() == target()) { ns = gettimeofday_ns() - printf("t=%ld;:,D=%ld;:,i=%d:%d;:,o=%s;:,d=%d;:,b=%ld;:,O=%ld;:,c=%ld\n", + printf("t=%ld;:,D=%ld;:,i=%d:%d;:,o=%s;:,d=%d;:,b=%ld;:,O=%ld;:,c=%ld;:,\n", ns, ns-PROBE_ENTRY_TIMES[tid(),name], pid(), tid(), name, ENTRY_FD[tid(),name], |
