aboutsummaryrefslogtreecommitdiffstats
path: root/lib/megaco/src/flex
diff options
context:
space:
mode:
authorMicael Karlberg <[email protected]>2013-04-19 17:39:51 +0200
committerMicael Karlberg <[email protected]>2013-04-19 17:39:51 +0200
commit8613f8153a639ea88edeb9f7d89270072e8c2d8a (patch)
tree9cae243b4a29c9c131c4eb943af17e1075962cae /lib/megaco/src/flex
parente9ba299b0f6c53cce6fd7202d67c78800ba89fcf (diff)
parent0c0677a913d10b87dd4faa3fc932506f98adcc45 (diff)
downloadotp-8613f8153a639ea88edeb9f7d89270072e8c2d8a.tar.gz
otp-8613f8153a639ea88edeb9f7d89270072e8c2d8a.tar.bz2
otp-8613f8153a639ea88edeb9f7d89270072e8c2d8a.zip
Merge branch 'bmk/megaco/flex_buffer_overrun_while_scanning_prop_parms/OTP-10998/r15' into bmk/megaco/flex_buffer_overrun_while_scanning_prop_parms/OTP-10998/r16
Conflicts: lib/megaco/doc/src/notes.xml lib/megaco/src/flex/megaco_flex_scanner_drv.flex.src lib/megaco/test/megaco_codec_prev3a_test.erl lib/megaco/test/megaco_codec_prev3b_test.erl lib/megaco/test/megaco_codec_prev3c_test.erl lib/megaco/test/megaco_codec_v1_test.erl lib/megaco/test/megaco_codec_v2_test.erl lib/megaco/test/megaco_codec_v3_test.erl lib/megaco/vsn.mk
Diffstat (limited to 'lib/megaco/src/flex')
-rw-r--r--lib/megaco/src/flex/megaco_flex_scanner_drv.flex.src31
-rw-r--r--lib/megaco/src/flex/megaco_flex_scanner_handler.erl6
2 files changed, 26 insertions, 11 deletions
diff --git a/lib/megaco/src/flex/megaco_flex_scanner_drv.flex.src b/lib/megaco/src/flex/megaco_flex_scanner_drv.flex.src
index 3914a81b8c..90d5c2aae6 100644
--- a/lib/megaco/src/flex/megaco_flex_scanner_drv.flex.src
+++ b/lib/megaco/src/flex/megaco_flex_scanner_drv.flex.src
@@ -1,8 +1,8 @@
/*
* %CopyrightBegin%
- *
+ *
* Copyright Ericsson AB 2001-2013. All Rights Reserved.
- *
+ *
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
* compliance with the License. You should have received a copy of the
@@ -95,6 +95,13 @@ typedef struct {
int token_counter;
} MfsErlDrvData;
+/* IBL = In Buffer Length - the raw (un-decoded) message buffer length */
+#define TERM_SPEC_SIZE_INITIAL(IBL) (1024 + 2*(IBL))
+
+/* CTSS = Current term spec size - the current term spec length */
+/* S = Size - how many positions we need */
+#define TERM_SPEC_SIZE_NEXT(CTSS,S) ((CTSS) + 1024 + (S))
+
#if !defined(MEGACO_REENTRANT_FLEX_SCANNER)
static MfsErlDrvData mfs_drv_data;
#endif
@@ -737,7 +744,7 @@ v LOAD_TOKEN(mfs_VersionToken);
#endif
-/* #define MFS_DEBUG true */ /* temporary */
+// #define MFS_DEBUG true
#if defined(MFS_DEBUG)
# define DBG( proto ) printf proto
# define DBG_BUF(func, bufName, buf, bufSz) mfs_dbg_buf_print(func, bufName, buf, bufSz)
@@ -842,15 +849,20 @@ static void mfs_ensure_term_spec(MfsErlDrvData* dataP, int size)
"\n term_spec_size: %d\n",
dataP->term_spec_index, dataP->term_spec_size) );
- dataP->term_spec_size = (dataP->term_spec_size * 2) + size;
+ dataP->term_spec_size = TERM_SPEC_SIZE_NEXT(dataP->term_spec_size, size);
DBG( ("mfs_ensure_term_spec -> "
- "term_spec is at 0x%X, new term_spec_size is %d\n",
- (unsigned int) dataP->term_spec, dataP->term_spec_size) );
+ "term_spec is at 0x%X, new term_spec_size is %d (%lu)\n",
+ (unsigned int) dataP->term_spec,
+ dataP->term_spec_size,
+ dataP->term_spec_size * sizeof(ErlDrvTermData)) );
tmp = REALLOC(dataP->term_spec,
dataP->term_spec_size * sizeof(ErlDrvTermData));
+ DBG( ("mfs_ensure_term_spec -> "
+ "realloc result: 0x%X\n", (unsigned int) tmp) );
+
if (tmp == NULL) {
/*
* Ouch, we did'nt get any new memory.
@@ -942,6 +954,9 @@ static void mfs_octet_load_token(ErlDrvTermData TokenTag, int is_empty)
ASSIGN_TERM_SPEC(dataP, ERL_DRV_TUPLE);
ASSIGN_TERM_SPEC(dataP, 3);
+
+ DBG( ("mfs_octet_load_token -> done\n") );
+
}
#if defined(MEGACO_REENTRANT_FLEX_SCANNER)
@@ -1241,7 +1256,7 @@ static void mfs_load_property_groups(MfsErlDrvData* dataP)
} // if ((yytext[i] != SP)...
} // while ...
- mfs_ensure_term_spec(dataP, 4); // 2 + 2 just in case
+ mfs_ensure_term_spec(dataP, 6); // 3 + 3 just in case
/* Make sure we actually have some groups */
@@ -1727,7 +1742,7 @@ static ErlDrvSSizeT mfs_control(ErlDrvData handle,
dataP->text_buf = tmp;
dataP->text_ptr = tmp;
- dataP->term_spec_size = 1000 + buf_len; /* OTP-4237 */
+ dataP->term_spec_size = TERM_SPEC_SIZE_INITIAL(buf_len);
DBG( ("mfs_control -> allocate term-spec buffer: "
"\n term_spec_size: %d\n", dataP->term_spec_size) );
diff --git a/lib/megaco/src/flex/megaco_flex_scanner_handler.erl b/lib/megaco/src/flex/megaco_flex_scanner_handler.erl
index 420202134e..ad28e25c39 100644
--- a/lib/megaco/src/flex/megaco_flex_scanner_handler.erl
+++ b/lib/megaco/src/flex/megaco_flex_scanner_handler.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -181,11 +181,11 @@ terminate(_Reason, _S) ->
%% Returns: {ok, NewState}
%%----------------------------------------------------------------------
-code_change({down, _Vsn}, #state{conf = Conf} = State, downgrade_to_pre_3_13_1) ->
+code_change({down, _Vsn}, #state{conf = Conf} = State, downgrade_to_pre_3_17) ->
NewPorts = bump_flex_scanner(Conf),
{ok, State#state{conf = {flex, NewPorts}}};
-code_change(_Vsn, #state{conf = Conf} = State, upgrade_from_pre_3_13_1) ->
+code_change(_Vsn, #state{conf = Conf} = State, upgrade_from_pre_3_17) ->
NewPorts = bump_flex_scanner(Conf),
{ok, State#state{conf = {flex, NewPorts}}};