This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 09/17] libdwfl: Minimize stack usage in dwfl_linux_kernel_report_offline.


Don't stack allocate module name. Also fixes a latent bug (if the module
file didn't have a suffix - which is very unlikely) and an inefficiency.
We only need to substitue chars up to the suffix.

Signed-off-by: Mark Wielaard <mjw@redhat.com>
---
 libdwfl/ChangeLog              |  5 +++++
 libdwfl/linux-kernel-modules.c | 25 +++++++++++++++++--------
 2 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 7fbb914..d06d34d 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -1,3 +1,8 @@
+2015-05-19  Mark Wielaard  <mjw@redhat.com>
+
+	* linux-kernel-modules.c (dwfl_linux_kernel_report_offline): Don't
+	stack allocate name. Only change chars up to suffix.
+
 2015-05-18  Mark Wielaard  <mjw@redhat.com>
 
 	* dwfl_module_getdwarf.c (find_prelink_address_sync): Allocate
diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c
index e4065d8..66b3ab6 100644
--- a/libdwfl/linux-kernel-modules.c
+++ b/libdwfl/linux-kernel-modules.c
@@ -1,5 +1,5 @@
 /* Standard libdwfl callbacks for debugging the running Linux kernel.
-   Copyright (C) 2005-2011, 2013, 2014 Red Hat, Inc.
+   Copyright (C) 2005-2011, 2013, 2014, 2015 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -379,13 +379,16 @@ dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
 		     names.  To handle that, we would have to look at the
 		     __this_module.name contents in the module's text.  */
 
-		  char name[f->fts_namelen - suffix + 1];
-		  for (size_t i = 0; i < f->fts_namelen - 3U; ++i)
-		    if (f->fts_name[i] == '-' || f->fts_name[i] == ',')
+		  char *name = strndup (f->fts_name, f->fts_namelen - suffix);
+		  if (name == NULL)
+		    {
+		      __libdwfl_seterrno (DWFL_E_NOMEM);
+		      result = -1;
+		      break;
+		    }
+		  for (size_t i = 0; i < f->fts_namelen - suffix; ++i)
+		    if (name[i] == '-' || name[i] == ',')
 		      name[i] = '_';
-		    else
-		      name[i] = f->fts_name[i];
-		  name[f->fts_namelen - suffix] = '\0';
 
 		  if (predicate != NULL)
 		    {
@@ -394,17 +397,23 @@ dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
 		      if (want < 0)
 			{
 			  result = -1;
+			  free (name);
 			  break;
 			}
 		      if (!want)
-			continue;
+			{
+			  free (name);
+			  continue;
+			}
 		    }
 
 		  if (dwfl_report_offline (dwfl, name, f->fts_path, -1) == NULL)
 		    {
+		      free (name);
 		      result = -1;
 		      break;
 		    }
+		  free (name);
 		}
 	      continue;
 
-- 
1.8.3.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]