Module: MemoryIO::Util

Defined in:
lib/memory_io/util.rb

Overview

Defines utility methods.

Class Method Summary collapse

Class Method Details

.file_permission(file) ⇒ #readable?, ...

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns Struct with two boolean method. nil for file not exists or is inaccessible.

Parameters:

  • file (String)

    File name.

Returns:

  • (#readable?, #writable?, nil)

    Struct with two boolean method. nil for file not exists or is inaccessible.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/memory_io/util.rb', line 42

def file_permission(file)
  return nil unless File.file?(file)
  stat = File.stat(file)
  # we do a trick here because /proc/[pid]/mem might be marked as readable but fails at sysopen.
  os = OpenStruct.new(readable?: stat.readable_real?, writable?: stat.writable_real?)
  begin
    os.readable? && File.open(file, 'rb').close
  rescue Errno::EACCES
    os[:readable?] = false
  end
  begin
    os.writable? && File.open(file, 'wb').close
  rescue Errno::EACCES
    os[:writable?] = false
  end
  os
end

.safe_eval(str, **vars) ⇒ Integer

Evaluate string safely.

Examples:

Util.safe_eval('heap + 0x10 * pp', heap: 0xde00, pp: 8)
#=> 56960 # 0xde80

Parameters:

  • str (String)

    String to be evaluated.

  • vars ({Symbol => Integer})

    Predefined variables

Returns:

  • (Integer)

    Result.



73
74
75
76
77
78
# File 'lib/memory_io/util.rb', line 73

def safe_eval(str, **vars)
  return str if str.is_a?(Integer)
  # dentaku 2 doesn't support hex
  str = str.gsub(/0x[0-9a-zA-Z]+/) { |c| c.to_i(16) }
  Dentaku::Calculator.new.store(vars).evaluate(str)
end

.trim_libname(name) ⇒ String

Remove extension name (.so) and version in library name.

Examples:

Util.trim_libname('libc-2.24.so')
#=> 'libc'
Util.trim_libname('libcrypto.so.1.0.0')
#=> 'libcrypto'
Util.trim_libname('not_a_so')
#=> 'not_a_so'

Parameters:

  • name (String)

    Original library filename.

Returns:

  • (String)

    Name without version and ‘.so’.



95
96
97
98
99
# File 'lib/memory_io/util.rb', line 95

def trim_libname(name)
  type1 = '(-[\d.]+)?\.so$'
  type2 = '\.so.\d+[\d.]+$'
  name.sub(/#{type1}|#{type2}/, '')
end

.underscore(str) ⇒ String

Convert input into snake-case.

This method also removes strings before ‘::’ in str.

Examples:

Util.underscore('MemoryIO')
#=> 'memory_io'

Util.underscore('MyModule::MyClass')
#=> 'my_class'

Parameters:

  • str (String)

    String to be converted.

Returns:

  • (String)

    Converted string.



25
26
27
28
29
30
31
32
# File 'lib/memory_io/util.rb', line 25

def underscore(str)
  return '' if str.empty?
  str = str.split('::').last
  str.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
  str.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
  str.downcase!
  str
end