{"record":{"id":"b9d6b4f4269ff77d","repo":"ruby/rubygems","slug":"attempting-to-set-unpermitted-ivar-symbol-inspec","errorCode":null,"errorMessage":"Attempting to set unpermitted ivar #{symbol.inspect} on object of class #{klass} @ #{stack.join(\".\")}","messagePattern":"Attempting to set unpermitted ivar #(.+?) on object of class #(.+?) @ #(.+?)","errorType":"exception","errorClass":"Gem::SafeMarshal::Visitors::ToRuby::UnpermittedIvarError","httpStatus":null,"severity":"error","filePath":"lib/rubygems/safe_marshal/visitors/to_ruby.rb","lineNumber":318,"sourceCode":"\n      class RationalCompat\n        def marshal_load(s)\n          num, den = s\n          raise ArgumentError, \"Expected 2 ints\" unless s.size == 2 && num.is_a?(Integer) && den.is_a?(Integer)\n          Rational(num, den)\n        end\n      end\n      private_constant :RationalCompat\n\n      COMPAT_CLASSES = {}.tap do |h|\n        h[Rational] = RationalCompat\n      end.compare_by_identity.freeze\n      private_constant :COMPAT_CLASSES\n\n      def resolve_ivar(klass, name)\n        to_s = resolve_symbol_name(name)\n\n        raise UnpermittedIvarError.new(symbol: to_s, klass: klass, stack: formatted_stack) unless @permitted_ivars.fetch(klass.name, [].freeze).include?(to_s)\n\n        visit_symbol_type(name)\n      end\n\n      def visit_symbol_type(element)\n        case element\n        when Elements::Symbol\n          sym = element.name.to_sym\n          @symbols << sym\n          sym\n        when Elements::SymbolLink\n          visit_Gem_SafeMarshal_Elements_SymbolLink(element)\n        end\n      end\n\n      # This is a hot method, so avoid respond_to? checks on every invocation\n      if :read.respond_to?(:name)\n        def resolve_symbol_name(element)","sourceCodeStart":300,"sourceCodeEnd":336,"githubUrl":"https://github.com/ruby/rubygems/blob/86cbb817a38ce8477b181c17467a703ded3f2be8/lib/rubygems/safe_marshal/visitors/to_ruby.rb#L300-L336","documentation":"Error \"Attempting to set unpermitted ivar #{symbol.inspect} on object of class #{klass} @ #{stack.join(\".\")}\" thrown in ruby/rubygems.","triggerScenarios":"Thrown at lib/rubygems/safe_marshal/visitors/to_ruby.rb:318 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Do not install the gem: its metadata tries to set a non-permitted instance variable","Fetch from the official source and report the package"],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"86cbb817a38ce8477b181c17467a703ded3f2be8","analyzedAt":"2026-08-23T06:27:48.159Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}