Blame SOURCES/0001-Fix-few-memory-leaks.patch

e9b09d
From 71cf63b7bb7bb212580cc7c8e6c75a4f645d79f1 Mon Sep 17 00:00:00 2001
e9b09d
From: Shivaprasad G Bhat <sbhat@linux.ibm.com>
e9b09d
Date: Wed, 20 May 2020 06:27:05 -0500
e9b09d
Subject: [PATCH 01/18] Fix few memory leaks
e9b09d
e9b09d
Valgrind showed some leaks with scandir usage in sysfs.cc.
e9b09d
Patch audits all the scandir usage and fixes where required.
e9b09d
e9b09d
Signed-off-by: Shivaprasad G Bhat <sbhat@linux.ibm.com>
e9b09d
---
e9b09d
 src/core/parisc.cc | 10 ++++++----
e9b09d
 src/core/spd.cc    |  4 ++++
e9b09d
 src/core/sysfs.cc  | 32 ++++++++++++++++++++++++++++----
e9b09d
 3 files changed, 38 insertions(+), 8 deletions(-)
e9b09d
e9b09d
diff --git a/src/core/parisc.cc b/src/core/parisc.cc
e9b09d
index 80344d28c6ba..1e531e32bbc2 100644
e9b09d
--- a/src/core/parisc.cc
e9b09d
+++ b/src/core/parisc.cc
e9b09d
@@ -561,11 +561,13 @@ static bool scan_device(hwNode & node, string name = "")
e9b09d
   else
e9b09d
   {
e9b09d
     for (int i = 0; i < n; i++)
e9b09d
-      if(matches(namelist[i]->d_name, "^[0-9]+(:[0-9]+)*$"))
e9b09d
     {
e9b09d
-      pushd(namelist[i]->d_name);
e9b09d
-      scan_device(curnode?*curnode:node, namelist[i]->d_name);
e9b09d
-      popd();
e9b09d
+      if(matches(namelist[i]->d_name, "^[0-9]+(:[0-9]+)*$"))
e9b09d
+      {
e9b09d
+        pushd(namelist[i]->d_name);
e9b09d
+        scan_device(curnode?*curnode:node, namelist[i]->d_name);
e9b09d
+        popd();
e9b09d
+      }
e9b09d
       free(namelist[i]);
e9b09d
     }
e9b09d
     free(namelist);
e9b09d
diff --git a/src/core/spd.cc b/src/core/spd.cc
e9b09d
index 061d0fd3e186..a304d061a008 100644
e9b09d
--- a/src/core/spd.cc
e9b09d
+++ b/src/core/spd.cc
e9b09d
@@ -192,8 +192,12 @@ static bool scan_eeproms(hwNode & memory)
e9b09d
     return false;
e9b09d
 
e9b09d
   for (int i = 0; i < n; i++)
e9b09d
+  {
e9b09d
     if (scan_eeprom(memory, namelist[i]->d_name))
e9b09d
       current_bank++;
e9b09d
+    free(namelist[i]);
e9b09d
+  }
e9b09d
+  free(namelist);
e9b09d
 
e9b09d
   return true;
e9b09d
 }
e9b09d
diff --git a/src/core/sysfs.cc b/src/core/sysfs.cc
e9b09d
index ee8b1da06c78..4e2df1c9cb09 100644
e9b09d
--- a/src/core/sysfs.cc
e9b09d
+++ b/src/core/sysfs.cc
e9b09d
@@ -83,7 +83,7 @@ static string sysfs_getbustype(const string & path)
e9b09d
 {
e9b09d
   struct dirent **namelist;
e9b09d
   int i, n;
e9b09d
-  string devname;
e9b09d
+  string bustype = "";
e9b09d
 
e9b09d
 /*
e9b09d
   to determine to which kind of bus a device is connected:
e9b09d
@@ -96,17 +96,28 @@ static string sysfs_getbustype(const string & path)
e9b09d
   n = scandir(".", &namelist, selectdir, alphasort);
e9b09d
   popd();
e9b09d
 
e9b09d
+  if (n <= 0)
e9b09d
+    return "";
e9b09d
+
e9b09d
   for (i = 0; i < n; i++)
e9b09d
   {
e9b09d
-    devname =
e9b09d
+    string devname =
e9b09d
       string(fs.path + "/bus/") + string(namelist[i]->d_name) +
e9b09d
       "/devices/" + basename(path.c_str());
e9b09d
 
e9b09d
     if (samefile(devname, path))
e9b09d
-      return string(namelist[i]->d_name);
e9b09d
+    {
e9b09d
+      bustype = string(namelist[i]->d_name);
e9b09d
+      break;
e9b09d
+    }
e9b09d
+    free(namelist[i]);
e9b09d
   }
e9b09d
 
e9b09d
-  return "";
e9b09d
+  for (int j = i; j < n; j++)
e9b09d
+    free(namelist[j]);
e9b09d
+  free(namelist);
e9b09d
+
e9b09d
+  return bustype;
e9b09d
 }
e9b09d
 
e9b09d
 
e9b09d
@@ -405,7 +416,11 @@ vector < entry > entry::devices() const
e9b09d
     entry e = sysfs::entry(This->devpath + "/" + string(namelist[i]->d_name));
e9b09d
     if(e.hassubdir("subsystem"))
e9b09d
 	    result.push_back(e);
e9b09d
+    free(namelist[i]);
e9b09d
   }
e9b09d
+  if (namelist)
e9b09d
+    free(namelist);
e9b09d
+
e9b09d
   if(pushd("block"))
e9b09d
   {
e9b09d
     int count = scandir(".", &namelist, selectdir, alphasort);
e9b09d
@@ -414,7 +429,10 @@ vector < entry > entry::devices() const
e9b09d
       entry e = sysfs::entry(This->devpath + "/block/" + string(namelist[i]->d_name));
e9b09d
       if(e.hassubdir("subsystem"))
e9b09d
 	      result.push_back(e);
e9b09d
+      free(namelist[i]);
e9b09d
     }
e9b09d
+    if (namelist)
e9b09d
+      free(namelist);
e9b09d
     popd();
e9b09d
   }
e9b09d
   popd();
e9b09d
@@ -435,8 +453,11 @@ vector < entry > sysfs::entries_by_bus(const string & busname)
e9b09d
   {
e9b09d
     entry e = sysfs::entry::byBus(busname, namelist[i]->d_name);
e9b09d
     result.push_back(e);
e9b09d
+    free(namelist[i]);
e9b09d
   }
e9b09d
   popd();
e9b09d
+  if (namelist)
e9b09d
+    free(namelist);
e9b09d
   return result;
e9b09d
 }
e9b09d
 
e9b09d
@@ -454,8 +475,11 @@ vector < entry > sysfs::entries_by_class(const string & classname)
e9b09d
   {
e9b09d
     entry e = sysfs::entry::byClass(classname, namelist[i]->d_name);
e9b09d
     result.push_back(e);
e9b09d
+    free(namelist[i]);
e9b09d
   }
e9b09d
   popd();
e9b09d
+  if (namelist)
e9b09d
+    free(namelist);
e9b09d
   return result;
e9b09d
 }
e9b09d
 
e9b09d
-- 
e9b09d
2.17.1
e9b09d