[CRIU] [PATCH] proc_parse: parse_smaps -- Use @file_path instead of strstr helper, v2

Cyrill Gorcunov gorcunov at gmail.com
Fri Oct 10 07:22:11 PDT 2014


On Fri, Oct 10, 2014 at 06:08:27PM +0400, Pavel Emelyanov wrote:
> On 10/10/2014 03:36 PM, Cyrill Gorcunov wrote:
> > strstr is a really heavy one, lets use already defined
> > and filled @file_path variable instead.
> > 
> > Reported-by: Pavel Emelyanov <xemul at parallels.com>
> > Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>

update
-------------- next part --------------
>From 4587b852b1e76aeab4c592978f45322cec3ca50c Mon Sep 17 00:00:00 2001
From: Cyrill Gorcunov <gorcunov at openvz.org>
Date: Fri, 10 Oct 2014 15:35:36 +0400
Subject: [PATCH] proc_parse: parse_smaps -- Use @file_path instead of strstr
 helper

strstr is a really heavy one, lets use already defined
and filled @file_path variable instead.

Reported-by: Pavel Emelyanov <xemul at parallels.com>
Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 proc_parse.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/proc_parse.c b/proc_parse.c
index 98fef4add2e2..6a181a25fa8f 100644
--- a/proc_parse.c
+++ b/proc_parse.c
@@ -324,7 +324,7 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
 
 	while (1) {
 		int num;
-		char file_path[6];
+		char file_path[16];
 		bool eof;
 		char *str;
 
@@ -385,8 +385,8 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
 		if (!vma_area)
 			goto err;
 
-		memset(file_path, 0, 6);
-		num = sscanf(str, "%lx-%lx %c%c%c%c %lx %x:%x %lu %5s",
+		memset(file_path, 0, sizeof(file_path));
+		num = sscanf(str, "%lx-%lx %c%c%c%c %lx %x:%x %lu %15s",
 			     &start, &end, &r, &w, &x, &s, &pgoff,
 			     &vfi.dev_maj, &vfi.dev_min, &vfi.ino, file_path);
 		if (num < 10) {
@@ -420,9 +420,10 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
 
 		if (vma_area->e->status != 0) {
 			continue;
-		} else if (strstr(str, "[vsyscall]") || strstr(str, "[vectors]")) {
+		} else if (!strcmp(file_path, "[vsyscall]") ||
+			   !strcmp(file_path, "[vectors]")) {
 			vma_area->e->status |= VMA_AREA_VSYSCALL;
-		} else if (strstr(str, "[vdso]")) {
+		} else if (!strcmp(file_path, "[vdso]")) {
 #ifdef CONFIG_VDSO
 			vma_area->e->status |= VMA_AREA_REGULAR;
 			if ((vma_area->e->prot & VDSO_PROT) == VDSO_PROT)
@@ -431,7 +432,7 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
 			pr_warn_once("Found vDSO area without support\n");
 			goto err;
 #endif
-		} else if (strstr(str, "[vvar]")) {
+		} else if (!strcmp(file_path, "[vvar]")) {
 #ifdef CONFIG_VDSO
 			vma_area->e->status |= VMA_AREA_REGULAR;
 			if ((vma_area->e->prot & VVAR_PROT) == VVAR_PROT)
@@ -440,7 +441,7 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
 			pr_warn_once("Found VVAR area without support\n");
 			goto err;
 #endif
-		} else if (strstr(str, "[heap]")) {
+		} else if (!strcmp(file_path, "[heap]")) {
 			vma_area->e->status |= VMA_AREA_REGULAR | VMA_AREA_HEAP;
 		} else {
 			vma_area->e->status = VMA_AREA_REGULAR;
-- 
1.9.3



More information about the CRIU mailing list