diff --git a/EncodingC.c b/EncodingC.c
index a36eeccbf756ae2a6bb03216a07a05d48c697057..cda78e2896c45b3470ed8f61237ffcf28e0fe3de 100644
--- a/EncodingC.c
+++ b/EncodingC.c
@@ -68,7 +68,7 @@ size_t kwsysEncoding_wcstombs(char* dest, const wchar_t* str, size_t n)
 char* kwsysEncoding_DupToNarrow(const wchar_t* str)
 {
   char* ret = NULL;
-  size_t length = kwsysEncoding_wcstombs(0, str, 0);
+  size_t length = kwsysEncoding_wcstombs(0, str, 0) + 1;
   if(length > 0)
     {
     ret = malloc(length);
diff --git a/FStream.hxx.in b/FStream.hxx.in
index 8170fb37b58543dd1f6dc8f946de9056b9758bfc..c340c55a3cbe85dd2f1ed21493ff775c74141133 100644
--- a/FStream.hxx.in
+++ b/FStream.hxx.in
@@ -81,7 +81,7 @@ namespace @KWSYS_NAMESPACE@
 
     internal_buffer_type *rdbuf() const
     {
-      return buf_.get();
+      return buf_;
     }
 
     ~basic_ifstream()
diff --git a/ProcessUNIX.c b/ProcessUNIX.c
index b9af2f1f5e76533f28aadc71437405edcf1fe122..faeb9679366acc3ce7fe5affc1fc6f28981007ad 100644
--- a/ProcessUNIX.c
+++ b/ProcessUNIX.c
@@ -2449,6 +2449,7 @@ static void kwsysProcessKill(pid_t process_id)
           if(f)
             {
             size_t nread = fread(buffer, 1, KWSYSPE_PIPE_BUFFER_SIZE, f);
+            fclose(f);
             buffer[nread] = '\0';
             if(nread > 0)
               {
@@ -2463,7 +2464,6 @@ static void kwsysProcessKill(pid_t process_id)
                   }
                 }
               }
-            fclose(f);
             }
           }
         }
diff --git a/SystemInformation.cxx b/SystemInformation.cxx
index 2f6c949cd2c8a9c7679e9b7116f023bfbb572b9a..5f20853fb8bafb35c0945bb03be5dabba193eef4 100644
--- a/SystemInformation.cxx
+++ b/SystemInformation.cxx
@@ -3162,8 +3162,17 @@ bool SystemInformationImplementation::RetreiveInformationFromCpuInfoFile()
   kwsys_stl::string cores =
                         this->ExtractValueFromCpuInfoFile(buffer,"cpu cores");
   int numberOfCoresPerCPU=atoi(cores.c_str());
-  this->NumberOfPhysicalCPU=static_cast<unsigned int>(
-    numberOfCoresPerCPU*(maxId+1));
+  if (maxId > 0)
+    {
+    this->NumberOfPhysicalCPU=static_cast<unsigned int>(
+      numberOfCoresPerCPU*(maxId+1));
+    }
+  else
+    {
+    // Linux Sparc: get cpu count
+    this->NumberOfPhysicalCPU=
+            atoi(this->ExtractValueFromCpuInfoFile(buffer,"ncpus active").c_str());
+    }
 
 #else // __CYGWIN__
   // does not have "physical id" entries, neither "cpu cores"
@@ -3185,7 +3194,19 @@ bool SystemInformationImplementation::RetreiveInformationFromCpuInfoFile()
 
   // CPU speed (checking only the first processor)
   kwsys_stl::string CPUSpeed = this->ExtractValueFromCpuInfoFile(buffer,"cpu MHz");
-  this->CPUSpeedInMHz = static_cast<float>(atof(CPUSpeed.c_str()));
+  if(!CPUSpeed.empty())
+    {
+    this->CPUSpeedInMHz = static_cast<float>(atof(CPUSpeed.c_str()));
+    }
+#ifdef __linux
+  else
+    {
+    // Linux Sparc: CPU speed is in Hz and encoded in hexadecimal
+    CPUSpeed = this->ExtractValueFromCpuInfoFile(buffer,"Cpu0ClkTck");
+    this->CPUSpeedInMHz = static_cast<float>(
+                                 strtoull(CPUSpeed.c_str(),0,16))/1000000.0f;
+    }
+#endif
 
   // Chip family
   kwsys_stl::string familyStr =
@@ -4991,7 +5012,12 @@ bool SystemInformationImplementation::QueryHPUXProcessor()
     case CPU_PA_RISC2_0:
       this->ChipID.Vendor = "Hewlett-Packard";
       this->ChipID.Family = 0x200;
+#  ifdef CPU_HP_INTEL_EM_1_0
+    case CPU_HP_INTEL_EM_1_0:
+#  endif
+#  ifdef CPU_IA64_ARCHREV_0
     case CPU_IA64_ARCHREV_0:
+#  endif
       this->ChipID.Vendor = "GenuineIntel";
       this->Features.HasIA64 = true;
       break;
diff --git a/SystemTools.cxx b/SystemTools.cxx
index 4649f3b23451b5d0237b783cd2748f5c904acdb6..f4a443f98ce5b64819c6b0dadfd50422d66785f5 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -2115,10 +2115,10 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination)
   SystemTools::RemoveFile(destination);
 
 #if defined(_WIN32) || defined(__CYGWIN__)
-  kwsys_ios::ofstream fout(destination,
+  kwsys::ofstream fout(destination,
                      kwsys_ios::ios::binary | kwsys_ios::ios::out | kwsys_ios::ios::trunc);
 #else
-  kwsys_ios::ofstream fout(destination,
+  kwsys::ofstream fout(destination,
                      kwsys_ios::ios::out | kwsys_ios::ios::trunc);
 #endif
   if(!fout)
diff --git a/testEncoding.cxx b/testEncoding.cxx
index 8e74a504764d2d8e00e947ce61a1443c4383face..a65c430b994b64e1c6291e457e8061a9e17348ec 100644
--- a/testEncoding.cxx
+++ b/testEncoding.cxx
@@ -16,14 +16,18 @@
 #endif
 
 #include KWSYS_HEADER(Encoding.hxx)
+#include KWSYS_HEADER(Encoding.h)
 #include KWSYS_HEADER(ios/iostream)
 
 #include <locale.h>
+#include <string.h>
+#include <stdlib.h>
 
 // Work-around CMake dependency scanning limitation.  This must
 // duplicate the above list of headers.
 #if 0
 # include "Encoding.hxx.in"
+# include "Encoding.h.in"
 # include "kwsys_ios_iostream.h.in"
 #endif
 
@@ -68,11 +72,16 @@ static int testHelloWorldEncoding()
     std::cout << str << std::endl;
     std::wstring wstr = kwsys::Encoding::ToWide(str);
     std::string str2 = kwsys::Encoding::ToNarrow(wstr);
-    if(!wstr.empty() && str != str2)
+    wchar_t* c_wstr = kwsysEncoding_DupToWide(str.c_str());
+    char* c_str2 = kwsysEncoding_DupToNarrow(c_wstr);
+    if(!wstr.empty() && (str != str2 || strcmp(c_str2, str.c_str())))
       {
       std::cout << "converted string was different: " << str2 << std::endl;
+      std::cout << "converted string was different: " << c_str2 << std::endl;
       ret++;
       }
+    free(c_wstr);
+    free(c_str2);
     }
   return ret;
 }