From c1c5ed931d6937c03e6c905ac337f94c3e0eb26d Mon Sep 17 00:00:00 2001 From: Guillaume Chazarain Date: Tue, 24 Jun 2008 23:21:39 +0200 Subject: [PATCH] Also handle invalid UTF-8 --- iotop/data.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/iotop/data.py b/iotop/data.py index 16c0588..0c480c7 100644 --- a/iotop/data.py +++ b/iotop/data.py @@ -112,6 +112,12 @@ def find_uids(options): if error: sys.exit(1) +def safe_utf8_decode(s): + try: + return s.decode('utf-8') + except UnicodeDecodeError: + return s.encode('string_escape') + class pinfo(object): def __init__(self, pid, options): self.mark = False @@ -134,7 +140,7 @@ class pinfo(object): # We check monitored PIDs only here self.check_if_valid(uid, options) try: - self.user = pwd.getpwuid(uid).pw_name.decode('utf-8') + self.user = safe_utf8_decode(pwd.getpwuid(uid).pw_name) except KeyError: self.user = str(uid) break @@ -149,7 +155,7 @@ class pinfo(object): # A process may exec, so we must always reread its cmdline try: proc_cmdline = open('/proc/%d/cmdline' % self.pid) - cmdline = proc_cmdline.read(4096).decode('utf-8') + cmdline = proc_cmdline.read(4096) except IOError: return '{no such process}' parts = cmdline.split('\0') @@ -157,7 +163,7 @@ class pinfo(object): first_command_char = parts[0].rfind('/') + 1 parts[0] = parts[0][first_command_char:] cmdline = ' '.join(parts).strip() - return cmdline or self.name + return safe_utf8_decode(cmdline or self.name) def did_some_io(self): for name in self.stats: -- 2.11.4.GIT