Skip to content

Commit 261ef51

Browse files
committed
Add Rex::Java::Serialization exceptions
1 parent 2e52817 commit 261ef51

23 files changed

+139
-113
lines changed

lib/rex/java/serialization.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,7 @@ module Serialization
5151
end
5252
end
5353

54+
require 'rex/java/serialization/decode_error'
55+
require 'rex/java/serialization/encode_error'
5456
require 'rex/java/serialization/model'
5557
require 'rex/java/serialization/builder'
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# -*- coding: binary -*-
2+
3+
module Rex
4+
module Java
5+
module Serialization
6+
class DecodeError < ::RuntimeError
7+
8+
end
9+
end
10+
end
11+
end
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# -*- coding: binary -*-
2+
3+
module Rex
4+
module Java
5+
module Serialization
6+
class EncodeError < ::RuntimeError
7+
8+
end
9+
end
10+
end
11+
end

lib/rex/java/serialization/model/annotation.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def initialize(stream = nil)
2424
#
2525
# @param io [IO] the io to read from
2626
# @return [self] if deserialization succeeds
27-
# @raise [RuntimeError] if deserialization doesn't succeed
27+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
2828
def decode(io)
2929
loop do
3030
content = decode_content(io, stream)
@@ -38,9 +38,9 @@ def decode(io)
3838
# Serializes the Rex::Java::Serialization::Model::Annotation
3939
#
4040
# @return [String] if serialization suceeds
41-
# @raise [RuntimeError] if serialization doesn't succeed
41+
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
4242
def encode
43-
raise ::RuntimeError, 'Failed to serialize Annotation with empty contents' if contents.empty?
43+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize Annotation with empty contents' if contents.empty?
4444

4545
encoded = ''
4646

lib/rex/java/serialization/model/block_data.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,18 @@ def initialize(stream = nil, contents = '')
2626
#
2727
# @param io [IO] the io to read from
2828
# @return [self] if deserialization succeeds
29-
# @raise [RuntimeError] if deserialization doesn't succeed
29+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
3030
def decode(io)
3131
raw_length = io.read(1)
32-
raise RuntimeError, 'Failed to unserialize BlockData' if raw_length.nil?
32+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize BlockData' if raw_length.nil?
3333
self.length = raw_length.unpack('C')[0]
3434

3535
if length == 0
3636
self.contents = ''
3737
else
3838
self.contents = io.read(length)
3939
if contents.nil? || contents.length != length
40-
raise RuntimeError, 'Failed to unserialize BlockData'
40+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize BlockData'
4141
end
4242
end
4343

lib/rex/java/serialization/model/block_data_long.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ def initialize(stream = nil, contents = '')
2626
#
2727
# @param io [IO] the io to read from
2828
# @return [self] if deserialization succeeds
29-
# @raise [RuntimeError] if deserialization doesn't succeed
29+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
3030
def decode(io)
3131
raw_length = io.read(4)
3232
if raw_length.nil? || raw_length.length != 4
33-
raise ::RuntimeError, 'Failed to unserialize BlockDataLong'
33+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize BlockDataLong'
3434
end
3535
self.length = raw_length.unpack('N')[0]
3636

@@ -39,7 +39,7 @@ def decode(io)
3939
else
4040
self.contents = io.read(length)
4141
if contents.nil? || contents.length != length
42-
raise ::RuntimeError, 'Failed to unserialize BlockData'
42+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize BlockData'
4343
end
4444
end
4545

lib/rex/java/serialization/model/class_desc.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ def initialize(stream = nil)
2121
#
2222
# @param io [IO] the io to read from
2323
# @return [self] if deserialization succeeds
24-
# @raise [RuntimeError] if deserialization doesn't succeed
24+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
2525
def decode(io)
2626
content = decode_content(io, stream)
2727
allowed_contents = [NullReference, NewClassDesc, Reference, ProxyClassDesc]
2828

2929
unless allowed_contents.include?(content.class)
30-
raise ::RuntimeError, 'ClassDesc unserialize failed'
30+
raise Rex::Java::Serialization::DecodeError, 'ClassDesc unserialize failed'
3131
end
3232

3333
self.description = content
@@ -37,13 +37,13 @@ def decode(io)
3737
# Serializes the Rex::Java::Serialization::Model::ClassDesc
3838
#
3939
# @return [String] if serialization succeeds
40-
# @raise [RuntimeError] if serialization doesn't succeed
40+
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
4141
def encode
4242
encoded = ''
4343
allowed_contents = [NullReference, NewClassDesc, Reference, ProxyClassDesc]
4444

4545
unless allowed_contents.include?(description.class)
46-
raise ::RuntimeError, 'Failed to serialize ClassDesc'
46+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize ClassDesc'
4747
end
4848

4949
encoded << encode_content(description)

lib/rex/java/serialization/model/contents.rb

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ module Contents
1111
#
1212
# @param io [IO] the io to read from
1313
# @return [Rex::Java::Serialization::Model::Element] if deserialization succeeds
14-
# @raise [RuntimeError] if deserialization doesn't succeed or unsupported content
14+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed or unsupported content
1515
def decode_content(io, stream)
1616
opcode = io.read(1)
17-
raise ::RuntimeError, 'Failed to unserialize content' if opcode.nil?
17+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize content' if opcode.nil?
1818
opcode = opcode.unpack('C')[0]
1919
content = nil
2020

@@ -48,11 +48,11 @@ def decode_content(io, stream)
4848
when TC_NULL
4949
content = NullReference.decode(io, stream)
5050
when TC_EXCEPTION
51-
raise ::RuntimeError, 'Failed to unserialize unsupported TC_EXCEPTION content'
51+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize unsupported TC_EXCEPTION content'
5252
when TC_RESET
5353
content = Reset.decode(io, stream)
5454
else
55-
raise ::RuntimeError, 'Failed to unserialize content'
55+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize content'
5656
end
5757

5858
content
@@ -62,7 +62,7 @@ def decode_content(io, stream)
6262
#
6363
# @param content [Rex::Java::Serialization::Model::Element] the content to serialize
6464
# @return [String] if serialization succeeds
65-
# @raise [RuntimeError] if serialization doesn't succeed
65+
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
6666
def encode_content(content)
6767
encoded = ''
6868

@@ -96,7 +96,7 @@ def encode_content(content)
9696
when Reference
9797
encoded << [TC_REFERENCE].pack('C')
9898
else
99-
raise ::RuntimeError, 'Failed to serialize content'
99+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize content'
100100
end
101101

102102
encoded << content.encode
@@ -107,6 +107,7 @@ def encode_content(content)
107107
#
108108
# @param content [Rex::Java::Serialization::Model::Element] the content to print
109109
# @return [String]
110+
# @raise [Rex::Java::Serialization::EncodeError] if the content is unknown
110111
def print_content(content)
111112
str = ''
112113

@@ -140,7 +141,7 @@ def print_content(content)
140141
when Reference
141142
str << "#{print_class(content)} { #{content.to_s} }"
142143
else
143-
raise ::RuntimeError, 'Failed to serialize content'
144+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize content'
144145
end
145146

146147
str

lib/rex/java/serialization/model/field.rb

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ def initialize(stream = nil)
3232
#
3333
# @param io [IO] the io to read from
3434
# @return [self] if deserialization succeeds
35-
# @raise [RuntimeError] if deserialization doesn't succeed
35+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
3636
def decode(io)
3737
code = io.read(1)
3838

3939
unless code && is_valid?(code)
40-
raise ::RuntimeError, 'Failed to unserialize Field'
40+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Field'
4141
end
4242

4343
self.type = TYPE_CODES[code]
@@ -53,14 +53,14 @@ def decode(io)
5353
# Serializes the Rex::Java::Serialization::Model::Field
5454
#
5555
# @return [String] if serialization succeeds
56-
# @raise [RuntimeError] if serialization doesn't succeed
56+
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
5757
def encode
5858
unless name.kind_of?(Rex::Java::Serialization::Model::Utf)
59-
raise ::RuntimeError, 'Failed to serialize Field'
59+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize Field'
6060
end
6161

6262
unless is_type_valid?
63-
raise ::RuntimeError, 'Failed to serialize Field'
63+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize Field'
6464
end
6565

6666
encoded = ''
@@ -138,11 +138,12 @@ def is_valid?(code)
138138
# Serializes the `field_type` attribute.
139139
#
140140
# @return [String]
141+
# @raise [Rex::Java::Serialization::EncodeError] if serialization fails
141142
def encode_field_type
142143
allowed_contents = [Utf, Reference]
143144

144145
unless allowed_contents.include?(field_type.class)
145-
raise ::RuntimeError, 'Failed to serialize Field'
146+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize Field'
146147
end
147148

148149
encoded = encode_content(field_type)
@@ -154,13 +155,13 @@ def encode_field_type
154155
#
155156
# @param io [IO] the io to read from
156157
# @return [Java::Serialization::Model::Utf]
157-
# @raise [RuntimeError] if unserialization doesn't succeed
158+
# @raise [Rex::Java::Serialization::DecodeError] if unserialization doesn't succeed
158159
def decode_field_type(io)
159160
allowed_contents = [Utf, Reference]
160161
type = decode_content(io, stream)
161162

162163
unless allowed_contents.include?(type.class)
163-
raise ::RuntimeError, 'Failed to unserialize Field field_type'
164+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Field field_type'
164165
end
165166

166167
type

lib/rex/java/serialization/model/long_utf.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ class LongUtf < Utf
1111
#
1212
# @param io [IO] the io to read from
1313
# @return [self] if deserialization succeeds
14-
# @return [nil] if deserialization doesn't succeed
14+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
1515
def decode(io)
1616
raw_length = io.read(8)
1717
if raw_length.nil? || raw_length.length != 8
18-
raise ::RuntimeError, 'Failed to unserialize LongUtf'
18+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize LongUtf'
1919
end
2020
self.length = raw_length.unpack('Q>')[0]
2121

@@ -24,7 +24,7 @@ def decode(io)
2424
else
2525
self.contents = io.read(length)
2626
if contents.nil? || contents.length != length
27-
raise ::RuntimeError, 'Failed to unserialize LongUtf'
27+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize LongUtf'
2828
end
2929
end
3030

0 commit comments

Comments
 (0)