]> www.infradead.org Git - users/borneoa/openocd-next.git/commitdiff
rtos/linux: fix name overwrite in `linux_thread_extra_info()`
authorEvgeniy Naydanov <evgeniy.naydanov@syntacore.com>
Fri, 14 Feb 2025 16:31:38 +0000 (19:31 +0300)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 15 Mar 2025 10:18:11 +0000 (10:18 +0000)
commit 908ee4dc9641bd3df2eb00264575501867da539d ("build: remove clang
unused variable assignment warnings") introduced an error:
```
-            tmp_str_ptr += sprintf(tmp_str_ptr, "%s", name);
+            sprintf(tmp_str_ptr, "%s", name);
             sprintf(tmp_str_ptr, "%s", temp->name);
```
This results in `name` being overwritten by `temp->name`.
Fix this, adding OOM handling along the way.

Change-Id: Id41f73247c3f7e6194d7c92187ad3163a9ea6c89
Signed-off-by: Evgeniy Naydanov <evgeniy.naydanov@syntacore.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/8761
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
src/rtos/linux.c

index 91d9a39f24b90115ba611ff299f2b32db34d1c84..5efdc9f60979db646b8044895ccb8a61a8b5eb67 100644 (file)
@@ -1120,23 +1120,13 @@ static int linux_thread_extra_info(struct target *target,
 
        while (temp) {
                if (temp->threadid == threadid) {
-                       char *pid = " PID: ";
-                       char *pid_current = "*PID: ";
-                       char *name = "Name: ";
-                       int str_size = strlen(pid) + strlen(name);
-                       char *tmp_str = calloc(1, str_size + 50);
-                       char *tmp_str_ptr = tmp_str;
-
-                       /*  discriminate current task */
-                       if (temp->status == 3)
-                               tmp_str_ptr += sprintf(tmp_str_ptr, "%s",
-                                               pid_current);
-                       else
-                               tmp_str_ptr += sprintf(tmp_str_ptr, "%s", pid);
-
-                       tmp_str_ptr += sprintf(tmp_str_ptr, "%d, ", (int)temp->pid);
-                       sprintf(tmp_str_ptr, "%s", name);
-                       sprintf(tmp_str_ptr, "%s", temp->name);
+                       char *tmp_str = alloc_printf("%cPID: %" PRIu32 ", Name: %s",
+                                       temp->status == 3 ? '*' : ' ',
+                                       temp->pid, temp->name);
+                       if (!tmp_str) {
+                               LOG_ERROR("Out of memory");
+                               return ERROR_FAIL;
+                       }
                        char *hex_str = calloc(1, strlen(tmp_str) * 2 + 1);
                        size_t pkt_len = hexify(hex_str, (const uint8_t *)tmp_str,
                                strlen(tmp_str), strlen(tmp_str) * 2 + 1);