summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-19 09:35:50 +0200
committerPaul Buetow <paul@buetow.org>2026-03-19 09:35:50 +0200
commite4c32963e5fdf1d00fd4ac9fc21425fdea318739 (patch)
tree97e768b9766345612df07497ba2321f13c1f5d5a
parent2e73e8906e5ba3f81578f1700f7478c94c92acb8 (diff)
fix: preserve final capture tokens in parser (task 465)
-rw-r--r--ioriot/src/utils/utils.c25
-rw-r--r--systemtap/src/ioriot.stp2
-rw-r--r--systemtap/src/javaioriot.stp2
-rw-r--r--systemtap/src/targetedioriot.stp2
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],