levsha icon indicating copy to clipboard operation
levsha copied to clipboard

java.nio.BufferOverflowException from putToBuffer in StringHelper

Open Zhen-hao opened this issue 3 years ago • 1 comments

This piece of code

def nodeFromHtml[T](html: String): LevshaNode[T] =
    LevshaNode[T] { rc =>
      val document: Elem = XML.loadString(html)
      def aux(node: XmlNode): Unit =
        node match {
          case scala.xml.Text(text) =>
            rc.addTextNode(text)
          case _ =>
            rc.openNode(XmlNs.html, node.label)
            node.attributes.foreach { attr =>
              rc.setAttr(XmlNs.html, attr.key, attr.value.head.text)
            }
            node.child.foreach { child =>
              aux(child)
            }
            rc.closeNode(node.label)
        }
      aux(document.head)
    }

can throw

[info] java.nio.BufferOverflowException: null
[info]  at java.base/java.nio.Buffer.nextPutIndex(Buffer.java:730)
[info]  at java.base/java.nio.HeapByteBuffer.putChar(HeapByteBuffer.java:342)
[info]  at levsha.impl.internal.DefaultStringHelper.putToBuffer(StringHelper.scala:47)
[info]  at levsha.impl.internal.DefaultStringHelper.putToBuffer$(StringHelper.scala:39)
[info]  at levsha.impl.internal.StringHelper$.putToBuffer(StringHelper.scala:14)
[info]  at levsha.impl.PortableRenderContext.addTextNode(PortableRenderContext.scala:139)
[info]  at korolev.server.internal.services.PageService$RenderContextProxy.addTextNode(PageService.scala:66)
[info]  at korolev.server.internal.services.PageService$RenderContextProxy.addTextNode$(PageService.scala:66)
[info]  at korolev.server.internal.services.PageService$$anon$1.addTextNode(PageService.scala:39)

I tried to find the root cause hoping to fix it. But the usage of vars of type ByteBuffer makes it hard to trace what's going on. I think there is a leak somewhere.

Zhen-hao avatar Dec 27 '22 17:12 Zhen-hao