summaryrefslogtreecommitdiff
blob: 1119bdf510b92351733f09db79fdd745ad78113a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
From d54c86abfba35f48cad78bb99b1d199afe8c2095 Mon Sep 17 00:00:00 2001
From: Jeff McCune <jeff@puppetlabs.com>
Date: Tue, 16 Apr 2013 11:27:30 -0400
Subject: [PATCH] (#14522) Force /proc/self/status encoding to valid UTF-8 (try
 2)

Without this patch the previous attempt to fix issue 14522 is
insufficient because the String#encode method is a no-op when the source
and destination encodings are the same encoding, even if there are
invalid byte sequences.

This is a problem because we're still getting unhandled `invalid byte
sequence in UTF-8` errors running the specs.

This patch addresses the problem by changing encoding from UTF-8 to
UTF-16, replacing all invalid byte sequences with the default unicode
string of "uFFFD"  We then convert back to UTF-8 to guarantee only valid
byte sequences remain.
---
 lib/facter/util/virtual.rb | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/facter/util/virtual.rb b/lib/facter/util/virtual.rb
index 8223b41..65cf58a 100644
--- a/lib/facter/util/virtual.rb
+++ b/lib/facter/util/virtual.rb
@@ -63,7 +63,8 @@ def self.vserver?
     return false unless FileTest.exists?("/proc/self/status")
     txt = File.open("/proc/self/status", "rb").read
     if txt.respond_to?(:encode!)
-      txt.encode!('UTF-8', 'UTF-8', :invalid => :replace)
+      txt.encode!('UTF-16', 'UTF-8', :invalid => :replace)
+      txt.encode!('UTF-8', 'UTF-16')
     end
     return true if txt =~ /^(s_context|VxID):[[:blank:]]*[0-9]/
     return false
-- 
1.8.1.6