util: kernel: Get the name of smaps entry with limited width 30/280230/2
authorDongwoo Lee <dwoo08.lee@samsung.com>
Thu, 25 Aug 2022 05:11:42 +0000 (14:11 +0900)
committerDongwoo Lee <dwlee08@gmail.com>
Tue, 30 Aug 2022 07:10:49 +0000 (00:10 -0700)
Since sscanf has no limitation for buffer width and thus it can cause
overflows for name buffer, this limits the number of reading
characters.

Change-Id: I83128e01d9b840d41bb14bfda022e27ee80dd78e
Signed-off-by: Dongwoo Lee <dwoo08.lee@samsung.com>
src/util/kernel.c

index 2171e01..996c83d 100644 (file)
@@ -439,28 +439,29 @@ static inline bool is_new_entry(const char *str)
        return ((*str >= '0' && *str <= '9') || (*str >= 'a' && *str <= 'f'));
 }
 
-static unsigned long get_gpu_mem_size(FILE *smaps_fd, char *entry)
+#define LEN_FORMAT(S) "%" #S "[^\n]"
+#define STR_LEN_FORMAT(S) LEN_FORMAT(S)
+
+static unsigned long get_gpu_mem_size(FILE *smaps_fd, char *buffer)
 {
        unsigned long mem_size = 0;
        char name[BUFF_MAX];
-       char buffer[BUFF_MAX];
 
        if (!gpu_mem_node)
                return 0;
 
 new_entry:
-       sscanf(entry, "%*s %*s %*s %*s %*s %[^\n]", name);
+       /* parsing name from entry line */
+       sscanf(buffer, "%*s %*s %*s %*s %*s" STR_LEN_FORMAT(BUFF_MAX), name);
 
-       if (strstr(name, gpu_mem_node->path)) {
-               while (fgets(buffer, sizeof(buffer), smaps_fd)) {
-                       if (strstr(buffer, gpu_mem_node->node))
-                               mem_size += strtol(buffer + strlen(gpu_mem_node->node), NULL, 10);
+       if (!strstr(name, gpu_mem_node->path))
+               return mem_size;
 
-                       if (is_new_entry(buffer)) {
-                               entry = buffer;
-                               goto new_entry;
-                       }
-               }
+       while (fgets(buffer, BUFF_MAX, smaps_fd)) {
+               if (strstr(buffer, gpu_mem_node->node))
+                       mem_size += strtol(buffer + strlen(gpu_mem_node->node), NULL, 10);
+               else if (is_new_entry(buffer))
+                       goto new_entry;
        }
 
        return mem_size;
@@ -487,8 +488,10 @@ int kernel_get_thread_group_map_info(struct proc_map_info *map_info,
        memset(map_info, 0, sizeof(struct proc_map_info));
 
        while (fgets(buffer, sizeof(buffer), smaps_fd)) {
-               if (include_gpu_mem && is_new_entry(buffer))
+               if (include_gpu_mem && is_new_entry(buffer)) {
                        map_info->gpu_mem += get_gpu_mem_size(smaps_fd, buffer);
+                       continue;
+               }
 
                if (strstart(buffer, "Rss:"))
                        map_info->rss += strtol(buffer + 4, NULL, 10);