From adbdc04747c6e335c51ec4e091cae6c75e3a31f1 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Wed, 23 Feb 2022 08:06:33 -0500 Subject: [PATCH] Move away from pickle for cache Bump the cache version and just move away from pickle. Upon closer thought, the data being retained doesn't warrant a generic format. Change-Id: I3ba2b17eb2202cf64c8c0cdbf91addaf1325b5f0 --- pyghmi/ipmi/sdr.py | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/pyghmi/ipmi/sdr.py b/pyghmi/ipmi/sdr.py index 31dd9984..24163bba 100644 --- a/pyghmi/ipmi/sdr.py +++ b/pyghmi/ipmi/sdr.py @@ -41,23 +41,6 @@ import six import pyghmi.constants as const import pyghmi.exceptions as exc -try: - import cPickle as pickle - - def restricted_load(s): - unp = pickle.Unpickler(s) - unp.find_global = None - return unp.load() -except ImportError: - import pickle - - class Unpickler(pickle.Unpickler): - def find_class(self, module, name): - raise Exception("Code forbidden") - - def restricted_load(s): - return Unpickler(s).load() - TYPE_UNKNOWN = 0 TYPE_SENSOR = 1 @@ -753,15 +736,17 @@ class SDR(object): cachefilename = None self.broken_sensor_ids = {} if self.cachedir: - cachefilename = 'sdrcache.{0}.{1}.{2}.{3}.{4}.{5}'.format( + cachefilename = 'sdrcache-2.{0}.{1}.{2}.{3}.{4}.{5}'.format( self.mfg_id, self.prod_id, self.device_id, self.fw_major, self.fw_minor, modtime) cachefilename = os.path.join(self.cachedir, cachefilename) if cachefilename and os.path.isfile(cachefilename): with open(cachefilename, 'rb') as cfile: - csdrs = restricted_load(cfile) - for sdrdata in csdrs: - self.add_sdr(sdrdata) + csdrlen = cfile.read(2) + while csdrlen: + csdrlen = struct.unpack('!H', csdrlen)[0] + self.add_sdr(cfile.read(csdrlen)) + csdrlen = cfile.read(2) for sid in self.broken_sensor_ids: try: del self.sensors[sid] @@ -820,7 +805,7 @@ class SDR(object): size = currlen - offset self.add_sdr(sdrdata) if sdrraw is not None: - sdrraw.append(sdrdata) + sdrraw.append(bytes(sdrdata)) offset = 0 if size != 0xff: size = 5 @@ -841,7 +826,9 @@ class SDR(object): suffix = ''.join( random.choice(string.ascii_lowercase) for _ in range(12)) with open(cachefilename + '.' + suffix, 'wb') as cfile: - pickle.dump(sdrraw, cfile) + for csdr in sdrraw: + cfile.write(struct.pack('!H', len(csdr))) + cfile.write(csdr) os.rename(cachefilename + '.' + suffix, cachefilename) def get_sensor_numbers(self):