logging-log4j-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gary Gregory <garydgreg...@gmail.com>
Subject Re: TlsSyslogFrame calculates message length incorrectly
Date Thu, 21 Jan 2016 22:44:20 GMT
On Thu, Jan 21, 2016 at 1:46 PM, Blake Day <blake@chewy.com> wrote:

> Gary,
>
> Yes I was able to apply the patch to 2.5.  I can confirm it has fixed the
> issue we encountered with multi-byte characters. Again, thanks for your
> assistance!
>

YW,
Gary


>
>
>
> On 1/21/16, 12:55 PM, "Gary Gregory" <garydgregory@gmail.com> wrote:
>
> >Blake:
> >
> >Did you try to apply the patch and run with it? Our unit tests pass when I
> >have the patch but it's not guarantee in comparison to a real live
> use-case.
> >
> >Gary
> >
> >On Thu, Jan 21, 2016 at 9:51 AM, Blake Day <blake@chewy.com> wrote:
> >
> >> Looks good to me!  Thanks!
> >>
> >>
> >>
> >>
> >> On 1/20/16, 9:30 PM, "Gary Gregory" <garydgregory@gmail.com> wrote:
> >>
> >> >How about something like this:
> >> >
> >> >diff --git
> >>
> >>
> >a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/TlsSyslogFrame.java
> >>
> >>
> >b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/TlsSyslogFrame.java
> >> >index a48876f..d6e77ef 100644
> >> >---
> >>
> >>
> >a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/TlsSyslogFrame.java
> >> >+++
> >>
> >>
> >b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/TlsSyslogFrame.java
> >> >@@ -16,7 +16,7 @@
> >> >  */
> >> > package org.apache.logging.log4j.core.appender;
> >> >
> >> >-import java.nio.charset.Charset;
> >> >+import java.nio.charset.StandardCharsets;
> >> >
> >> > import org.apache.logging.log4j.util.Chars;
> >> >
> >> >@@ -26,46 +26,56 @@
> >> >  * @see <a href="https://tools.ietf.org/html/rfc5425">RFC 5425</a>
> >> >  */
> >> > public class TlsSyslogFrame {
> >> >-    private String message;
> >> >-    private int messageLengthInBytes;
> >> >+    private final String message;
> >> >
> >> >     public TlsSyslogFrame(final String message) {
> >> >-        setMessage(message);
> >> >+        this.message = message;
> >> >     }
> >> >
> >> >     public String getMessage() {
> >> >         return this.message;
> >> >     }
> >> >
> >> >-    public void setMessage(final String message) {
> >> >-        this.message = message;
> >> >-        setLengthInBytes();
> >> >-    }
> >> >-
> >> >-    private void setLengthInBytes() {
> >> >-        messageLengthInBytes = message.length();
> >> >-    }
> >> >-
> >> >     public byte[] getBytes() {
> >> >-        final String frame = toString();
> >> >-        return frame.getBytes(Charset.defaultCharset());
> >> >+        final String frame = toString();
> >> >+        return frame.getBytes(StandardCharsets.UTF_8);
> >> >     }
> >> >
> >> >     @Override
> >> >     public String toString() {
> >> >-        final String length = Integer.toString(messageLengthInBytes);
> >> >+        final byte[] messageBytes =
> >> >message.getBytes(StandardCharsets.UTF_8);
> >> >+        final String length = Integer.toString(messageBytes.length);
> >> >         return length + Chars.SPACE + message;
> >> >     }
> >> >
> >> >-    public boolean equals(final TlsSyslogFrame frame) {
> >> >-        return isLengthEquals(frame) && isMessageEquals(frame);
> >> >+    @Override
> >> >+    public int hashCode() {
> >> >+        final int prime = 31;
> >> >+        int result = 1;
> >> >+        result = prime * result + ((message == null) ? 0 :
> >> >message.hashCode());
> >> >+        return result;
> >> >     }
> >> >
> >> >-    private boolean isLengthEquals(final TlsSyslogFrame frame) {
> >> >-        return this.messageLengthInBytes ==
> frame.messageLengthInBytes;
> >> >+    @Override
> >> >+    public boolean equals(final Object obj) {
> >> >+        if (this == obj) {
> >> >+            return true;
> >> >+        }
> >> >+        if (obj == null) {
> >> >+            return false;
> >> >+        }
> >> >+        if (!(obj instanceof TlsSyslogFrame)) {
> >> >+            return false;
> >> >+        }
> >> >+        final TlsSyslogFrame other = (TlsSyslogFrame) obj;
> >> >+        if (message == null) {
> >> >+            if (other.message != null) {
> >> >+                return false;
> >> >+            }
> >> >+        } else if (!message.equals(other.message)) {
> >> >+            return false;
> >> >+        }
> >> >+        return true;
> >> >     }
> >> >
> >> >-    private boolean isMessageEquals(final TlsSyslogFrame frame) {
> >> >-        return this.message.equals(frame.message);
> >> >-    }
> >> > }
> >> >
> >> >
> >> >Gary
> >> >
> >> >On Wed, Jan 20, 2016 at 6:27 PM, Gary Gregory <garydgregory@gmail.com>
> >> >wrote:
> >> >
> >> >> And another issue: TlsSyslogFrame implements equals() but not
> >> hashCode().
> >> >>
> >> >> Gary
> >> >>
> >> >> On Wed, Jan 20, 2016 at 4:58 PM, Blake Day <blake@chewy.com>
wrote:
> >> >>
> >> >>> TlsSyslogFrame appears to be miscalculating the message length.
> >> >>> According to RFC5425, the message length must be the octet count
of
> the
> >> >>> SYSLOG-MSG in the frame.  Though the variable below is aptly named
> >> >>> messageLengthInBytes, it is assigned the value from message.length()
> >> (where
> >> >>> message is a String) rather than the bytes.
> >> >>>
> >> >>> See below for relevant portions of code:
> >> >>>
> >> >>> private String message;
> >> >>> private int messageLengthInBytes;
> >> >>>
> >> >>> private void setLengthInBytes() {
> >> >>>     messageLengthInBytes = message.length();
> >> >>> }
> >> >>>
> >> >>> @Override
> >> >>> public String toString() {
> >> >>>     final String length = Integer.toString(messageLengthInBytes);
> >> >>>     return length + Chars.SPACE + message;
> >> >>> }
> >> >>>
> >> >>>
> >> >>>
> >> >>>
> >> >>>
> ---------------------------------------------------------------------
> >> >>> To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
> >> >>> For additional commands, e-mail: log4j-user-help@logging.apache.org
> >> >>>
> >> >>>
> >> >>
> >> >>
> >> >> --
> >> >> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> >> >> Java Persistence with Hibernate, Second Edition
> >> >> <http://www.manning.com/bauer3/>
> >> >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> >> >> Spring Batch in Action <http://www.manning.com/templier/>
> >> >> Blog: http://garygregory.wordpress.com
> >> >> Home: http://garygregory.com/
> >> >> Tweet! http://twitter.com/GaryGregory
> >> >>
> >> >
> >> >
> >> >
> >> >--
> >> >E-Mail: garydgregory@gmail.com | ggregory@apache.org
> >> >Java Persistence with Hibernate, Second Edition
> >> ><http://www.manning.com/bauer3/>
> >> >JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> >> >Spring Batch in Action <http://www.manning.com/templier/>
> >> >Blog: http://garygregory.wordpress.com
> >> >Home: http://garygregory.com/
> >> >Tweet! http://twitter.com/GaryGregory
> >>
> >
> >
> >
> >--
> >E-Mail: garydgregory@gmail.com | ggregory@apache.org
> >Java Persistence with Hibernate, Second Edition
> ><http://www.manning.com/bauer3/>
> >JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> >Spring Batch in Action <http://www.manning.com/templier/>
> >Blog: http://garygregory.wordpress.com
> >Home: http://garygregory.com/
> >Tweet! http://twitter.com/GaryGregory
>



-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message