Skip to content

Commit 4cab65d

Browse files
committed
Merge pull request #21 from mururu/limit
Consider limitations
2 parents 2f0768e + 24b4340 commit 4cab65d

2 files changed

Lines changed: 37 additions & 14 deletions

File tree

src/msgpack_packer.erl

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,12 @@ pack_int(N) when N > -32768 ->
107107
pack_int(N) when (N band 16#FFFFFFFF) =:= N ->
108108
<< 16#D2:8, N:32/big-signed-integer-unit:1 >>;
109109
%% int 64
110+
pack_int(N) when N >= -16#8000000000000000 ->
111+
<< 16#D3:8, N:64/big-signed-integer-unit:1 >>;
112+
%% too big int
110113
pack_int(N) ->
111-
<< 16#D3:8, N:64/big-signed-integer-unit:1 >>.
114+
throw({badarg, N}).
115+
112116

113117
-spec pack_uint(non_neg_integer()) -> binary().
114118
%% positive fixnum
@@ -124,8 +128,11 @@ pack_uint(N) when (N band 16#FFFF) =:= N ->
124128
pack_uint(N) when (N band 16#FFFFFFFF) =:= N->
125129
<< 16#CE:8, N:32/big-unsigned-integer-unit:1 >>;
126130
%% uint 64
131+
pack_uint(N) when (N band 16#FFFFFFFFFFFFFFFF) =:= N ->
132+
<< 16#CF:8, N:64/big-unsigned-integer-unit:1 >>;
133+
%% too big unit
127134
pack_uint(N) ->
128-
<< 16#CF:8, N:64/big-unsigned-integer-unit:1 >>.
135+
throw({badarg, N}).
129136

130137

131138
-spec pack_double(float()) -> binary().
@@ -145,8 +152,10 @@ pack_raw(Bin) ->
145152
<< 2#101:3, Len:5, Bin/binary >>;
146153
Len when Len < 16#10000 -> % 65536
147154
<< 16#DA:8, Len:16/big-unsigned-integer-unit:1, Bin/binary >>;
148-
Len ->
149-
<< 16#DB:8, Len:32/big-unsigned-integer-unit:1, Bin/binary >>
155+
Len when Len < 16#100000000 ->
156+
<< 16#DB:8, Len:32/big-unsigned-integer-unit:1, Bin/binary >>;
157+
_ ->
158+
throw({badarg, Bin})
150159
end.
151160

152161
-spec pack_raw2(binary()) -> binary().
@@ -157,8 +166,10 @@ pack_raw2(Bin) ->
157166
<< 16#C4:8, Len:8/big-unsigned-integer-unit:1, Bin/binary>>;
158167
Len when Len < 16#10000 -> % 65536
159168
<< 16#C5:8, Len:16/big-unsigned-integer-unit:1, Bin/binary >>;
160-
Len ->
161-
<< 16#C6:8, Len:32/big-unsigned-integer-unit:1, Bin/binary >>
169+
Len when Len < 16#100000000 ->
170+
<< 16#C6:8, Len:32/big-unsigned-integer-unit:1, Bin/binary >>;
171+
_ ->
172+
throw({badarg, Bin})
162173
end.
163174

164175
%% @doc String MAY be unicode. Or may be EUC-JP, SJIS, UTF-1024 or anything.
@@ -177,8 +188,10 @@ pack_string(String, _Opt) ->
177188
<< 16#D9:8, Len:8/big-unsigned-integer-unit:1, Bin/binary >>;
178189
Len when Len < 16#10000 -> % 65536
179190
<< 16#DA:8, Len:16/big-unsigned-integer-unit:1, Bin/binary >>;
180-
Len ->
181-
<< 16#DB:8, Len:32/big-unsigned-integer-unit:1, Bin/binary >>
191+
Len when Len < 16#100000000 ->
192+
<< 16#DB:8, Len:32/big-unsigned-integer-unit:1, Bin/binary >>;
193+
_ ->
194+
throw({badarg, String})
182195
end
183196
end.
184197

@@ -266,10 +279,12 @@ pack_array([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O], Opt) ->
266279

267280
pack_array(L, Opt) ->
268281
case length(L) of
269-
Len when Len < 16#10000 -> % 65536
282+
Len when Len < 16#10000 ->
270283
<<16#DC:8, Len:16/big-unsigned-integer-unit:1, (<< <<(pack(E, Opt))/binary>> || E <- L >>)/binary>>;
271-
Len ->
272-
<<16#DD:8, Len:32/big-unsigned-integer-unit:1, (<< <<(pack(E, Opt))/binary>> || E <- L >>)/binary>>
284+
Len when Len < 16#100000000 ->
285+
<<16#DD:8, Len:32/big-unsigned-integer-unit:1, (<< <<(pack(E, Opt))/binary>> || E <- L >>)/binary>>;
286+
_ ->
287+
throw({badarg, L})
273288
end.
274289

275290
-spec pack_map(msgpack:msgpack_map(), msgpack_option()) -> binary() | no_return().
@@ -303,9 +318,11 @@ pack_map(M, Opt)->
303318
Len when Len < 16#10000 -> % 65536
304319
<<16#DE:8, Len:16/big-unsigned-integer-unit:1,
305320
(<< <<(pack(K, Opt))/binary, (pack(V, Opt))/binary>> || {K, V} <- M >>)/binary>>;
306-
Len ->
321+
Len when Len < 16#100000000->
307322
<<16#DF:8, Len:32/big-unsigned-integer-unit:1,
308-
(<< <<(pack(K, Opt))/binary, (pack(V, Opt))/binary>> || {K, V} <- M >>)/binary>>
323+
(<< <<(pack(K, Opt))/binary, (pack(V, Opt))/binary>> || {K, V} <- M >>)/binary>>;
324+
_ ->
325+
throw({badarg, M})
309326
end.
310327

311328
-spec pack_ext(any(), msgpack_ext_packer(), msgpack:options()) -> {ok, binary()} | {error, any()}.

test/msgpack_test.erl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,13 @@ error_test_()->
250250
Term = {"hoge", "hage", atom},
251251
?assertEqual({error, {badarg, Term}},
252252
pack(Term))
253-
end}
253+
end},
254+
{"badarg too big int",
255+
?_assertEqual({error, {badarg, -16#8000000000000001}},
256+
pack(-16#8000000000000001))},
257+
{"badarg too big uint",
258+
?_assertEqual({error, {badarg, 16#10000000000000000}},
259+
pack(16#10000000000000000))}
254260
].
255261

256262
binary_test_() ->

0 commit comments

Comments
 (0)