@@ -107,8 +107,12 @@ pack_int(N) when N > -32768 ->
107107pack_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
110113pack_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 ->
124128pack_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
127134pack_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
267280pack_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 ()}.
0 commit comments