1

We had given a task and for which we written below code, while executing it showing an error. Hence issue in pickle need help for . Please let us know where we went wrong in coding-

import os
import builtins
import pickle
import sys
sys.tracebacklimit=0
import traceback
import io
from logging import Logger

safe_builtins = {
        'range',
        'complex',
        'set',
        'frozenset',
        }

class RestrictedUnpickler(pickle.Unpickler):

      def find_class(self, module, name):
      # Only allow safe classes from builtins.
       if module == "builtins" and name in safe_builtins:
           return getattr(builtins, name)
        # Forbid everything else.
       raise pickle.UnpicklingError("global '%s.%s' is forbidden" %
       (module, name))
    
    def restricted_loads(s):
        """Helper function analogous to pickle.loads()."""
        return RestrictedUnpickler(io.BytesIO(s)).load()
    
    def func1(a): 
      try: 
        x= restricted_loads(pickle.dumps(a))
          return x 
            except pickle.UnpicklingError : 
      s=traceback.format_exc()
         return s
    
    
    def func2(s):
      try:
        x=restricted_loads(pickle.dumps(s))
        return s[x]
      except pickle.UnpicklingError :
 s=traceback.format_exc()
        return s
    
       
    if __name__ == "__main__":
        a=range(int(input())) 
        b=func1(a)
        print(b)
        y=tuple(input())
        z=func2(y)
        print(z)

Getting, we assume issue is with function 2. Where we are not getting correct output. Function 1 is working perfectly seems that why we are getting some output. We had also attach a image for problem statement i.e. what we need to perform in the different function.

Please suggest where we went wrong.

TypeError: tuple indices must be integers or slices, not tuple

Input (stdin)
50 
"a", "b", "c", "d", "e", "f", "g", "h"

Your Output (stdout) 
range(0, 50)

Expected Output 
range(0, 50) 
Traceback (most recent call last): 
_pickle.UnpicklingError: global 'builtins.slice' is forbidden

Problem Statement

2 Answers2

1

In the func2, write x=restricted_loads(pickle.dumps(slice(s)))

0
#frescoplay pickle problem 
import os
import builtins
import pickle
import sys
sys.tracebacklimit=0
import traceback
import io
from logging import Logger

safe_builtins = {
        'range',
        'complex',
        'set',
        'frozenset',
        }

class RestrictedUnpickler(pickle.Unpickler):

   def find_class(self, module, name):
    # Only allow safe classes from builtins.
      if module == "builtins" and name in safe_builtins:
          return getattr(builtins, name)
    # Forbid everything else.
      raise pickle.UnpicklingError("global '%s.%s' is forbidden" %
      (module, name))
        
        

def restricted_loads(s):
        """Helper function analogous to pickle.loads()."""
        return RestrictedUnpickler(io.BytesIO(s)).load()

def func1(a): 
    try: 
        x= restricted_loads(pickle.dumps(a))
        return x 
    except pickle.UnpicklingError : 
        s=traceback.format_exc()
        return s
    
    
def func2(s):
    try:
        x=restricted_loads(pickle.dumps(slice(s)))
        return s[x]
    except pickle.UnpicklingError :
        s=traceback.format_exc()
        return s

    
if __name__ == "__main__":
       a=range(int(input`enter code here`())) 
       b=func1(a)
       print(b)
       y=tuple(input())
       z=func2(y)
       print(z)