2012-06-29 05:18:28 +00:00
|
|
|
# -*- coding: binary -*-
|
2010-02-01 19:49:36 +00:00
|
|
|
require 'postgres_msf'
|
|
|
|
require 'postgres/binary_writer'
|
|
|
|
require 'postgres/binary_reader'
|
|
|
|
|
|
|
|
# Namespace for Metasploit branch.
|
|
|
|
module Msf
|
|
|
|
module Db
|
|
|
|
|
|
|
|
# Fixed size buffer.
|
|
|
|
class Buffer
|
|
|
|
|
|
|
|
class Error < RuntimeError; end
|
|
|
|
class EOF < Error; end
|
|
|
|
|
|
|
|
def self.from_string(str)
|
|
|
|
new(str)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.of_size(size)
|
|
|
|
raise ArgumentError if size < 0
|
|
|
|
new('#' * size)
|
|
|
|
end
|
|
|
|
|
|
|
|
def initialize(content)
|
|
|
|
@size = content.size
|
|
|
|
@content = content
|
|
|
|
@position = 0
|
|
|
|
end
|
|
|
|
|
|
|
|
def size
|
|
|
|
@size
|
|
|
|
end
|
|
|
|
|
|
|
|
def position
|
|
|
|
@position
|
|
|
|
end
|
|
|
|
|
|
|
|
def position=(new_pos)
|
|
|
|
raise ArgumentError if new_pos < 0 or new_pos > @size
|
|
|
|
@position = new_pos
|
|
|
|
end
|
|
|
|
|
|
|
|
def at_end?
|
|
|
|
@position == @size
|
|
|
|
end
|
|
|
|
|
|
|
|
def content
|
|
|
|
@content
|
|
|
|
end
|
|
|
|
|
|
|
|
def read(n)
|
|
|
|
raise EOF, 'cannot read beyond the end of buffer' if @position + n > @size
|
|
|
|
str = @content[@position, n]
|
|
|
|
@position += n
|
|
|
|
str
|
|
|
|
end
|
|
|
|
|
|
|
|
def write(str)
|
|
|
|
sz = str.size
|
|
|
|
raise EOF, 'cannot write beyond the end of buffer' if @position + sz > @size
|
|
|
|
@content[@position, sz] = str
|
|
|
|
@position += sz
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def copy_from_stream(stream, n)
|
|
|
|
raise ArgumentError if n < 0
|
|
|
|
while n > 0
|
|
|
|
str = stream.read(n)
|
|
|
|
write(str)
|
|
|
|
n -= str.size
|
|
|
|
end
|
|
|
|
raise if n < 0
|
|
|
|
end
|
|
|
|
|
|
|
|
NUL = "\000"
|
|
|
|
|
|
|
|
def write_cstring(cstr)
|
|
|
|
raise ArgumentError, "Invalid Ruby/cstring" if cstr.include?(NUL)
|
|
|
|
write(cstr)
|
|
|
|
write(NUL)
|
|
|
|
end
|
|
|
|
|
|
|
|
# returns a Ruby string without the trailing NUL character
|
|
|
|
def read_cstring
|
|
|
|
nul_pos = @content.index(NUL, @position)
|
|
|
|
raise Error, "no cstring found!" unless nul_pos
|
|
|
|
|
|
|
|
sz = nul_pos - @position
|
|
|
|
str = @content[@position, sz]
|
|
|
|
@position += sz + 1
|
|
|
|
return str
|
|
|
|
end
|
|
|
|
|
|
|
|
# read till the end of the buffer
|
|
|
|
def read_rest
|
|
|
|
read(self.size-@position)
|
|
|
|
end
|
|
|
|
|
|
|
|
include BinaryWriterMixin
|
|
|
|
include BinaryReaderMixin
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|