From dc5f7190f16cf4552db74fba3f4e0f2d654e2594 Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Mon, 28 Nov 2011 15:14:14 +0100 Subject: erts: Remove truncation of http packet parsing and return error instead This is a slight modification of previous commit by Steve Vinoski For backward compatibility of old users of decode_packet, I think it's enough to return error instead of keeping the old line truncation behaviour. --- erts/doc/src/erlang.xml | 9 ++++++--- erts/emulator/beam/packet_parser.c | 22 +++++++++------------- erts/emulator/test/decode_packet_SUITE.erl | 6 ++---- lib/kernel/doc/src/inet.xml | 4 ++++ 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml index 42a4e6a999..1ea88a185f 100644 --- a/erts/doc/src/erlang.xml +++ b/erts/doc/src/erlang.xml @@ -724,9 +724,12 @@ false size limit.

{line_length, integer()} -

Applies only to line oriented protocols - (line, http). Lines longer than this - will be truncated.

+

For packet type line, truncate lines longer + than the indicated length.

+

Option line_length also applies to http* + packet types as an alias for option packet_size in the + case when packet_size itself is not set. This usage is + only intended for backward compatibility.

diff --git a/erts/emulator/beam/packet_parser.c b/erts/emulator/beam/packet_parser.c
index 8c1662dc6f..4d4b6ea196 100644
--- a/erts/emulator/beam/packet_parser.c
+++ b/erts/emulator/beam/packet_parser.c
@@ -405,18 +405,22 @@ int packet_get_length(enum PacketParseType htype,
             const char* ptr1 = ptr;
             int   len = plen;
             
+	    if (!max_plen) {
+		/* This is for backward compatibility with old user of decode_packet
+		 * that might use option 'line_length' to limit accepted length of
+		 * http lines.
+		 */
+		max_plen = trunc_len;
+	    }
+
             while (1) {
                 const char* ptr2 = memchr(ptr1, '\n', len);
                 
                 if (ptr2 == NULL) {
                     if (max_plen != 0) {
-                        if (n > max_plen) /* packet full */
+                        if (n >= max_plen) /* packet full */
                             goto error;
                     }
-                    else if (n >= trunc_len && trunc_len!=0) { /* buffer full */
-                        plen = trunc_len;
-                        goto done;
-                    }
                     goto more;
                 }
                 else {
@@ -425,8 +429,6 @@ int packet_get_length(enum PacketParseType htype,
                     if (*statep == 0) {
                         if (max_plen != 0 && plen > max_plen)
                             goto error;
-                        if (plen >= trunc_len && trunc_len != 0)
-                            plen = trunc_len;
                         goto done;
                     }
 
@@ -439,18 +441,12 @@ int packet_get_length(enum PacketParseType htype,
                         else {
                             if (max_plen != 0 && plen > max_plen)
                                 goto error;
-                            if (plen >= trunc_len && trunc_len != 0)
-                                plen = trunc_len;
                             goto done;
                         }
                     }
                     else {
                         if (max_plen != 0 && plen > max_plen)
                             goto error;
-                        if (plen >= trunc_len && trunc_len != 0) {
-                            plen = trunc_len;
-                            goto done;
-                        }
                         goto more;
                     }
                 }
diff --git a/erts/emulator/test/decode_packet_SUITE.erl b/erts/emulator/test/decode_packet_SUITE.erl
index 55ef05079f..4acbe8c6e0 100644
--- a/erts/emulator/test/decode_packet_SUITE.erl
+++ b/erts/emulator/test/decode_packet_SUITE.erl
@@ -596,11 +596,9 @@ otp_9389(Config) when is_list(Config) ->
     {more, undefined} = erlang:decode_packet(httph, Rest2, Opts),
     {ok, {http_header,_,"Link",_,Link}, Rest3} =
         erlang:decode_packet(httph, list_to_binary([Rest2, Pkt2]), Opts),
-    true = (length(Link) =< 3000),
-    {ok, {http_error, _}, Rest4} = erlang:decode_packet(httph, Rest3, Opts),
-    {ok, {http_error, _}, Rest5} = erlang:decode_packet(httph, Rest4, Opts),
+    true = (length(Link) > 8000),
     {ok, {http_header,_,'Content-Length',_,"0"}, <<"\r\n">>} =
-        erlang:decode_packet(httph, Rest5, Opts),
+        erlang:decode_packet(httph, Rest3, Opts),
     ok.
 
 otp_9389_line(doc) -> ["Verify packet_size works correctly for line mode"];
diff --git a/lib/kernel/doc/src/inet.xml b/lib/kernel/doc/src/inet.xml
index fad5af85bb..1a05b4ba99 100644
--- a/lib/kernel/doc/src/inet.xml
+++ b/lib/kernel/doc/src/inet.xml
@@ -573,6 +573,10 @@ fe80::204:acff:fe17:bf38
               is longer than the max allowed length, the packet is
               considered invalid. The same happens if the packet header
               is too big for the socket receive buffer.

+

For line oriented protocols (line,http*), + option packet_size also guarantees that lines up to the + indicated length are accepted and not considered invalid due + to internal buffer limitations.

{read_packets, Integer}(UDP sockets) -- cgit v1.2.3