Skip to content

LWM2M: reading /3 using CBOR SENML generate invalid content #99088

@jvermillard

Description

@jvermillard

Describe the bug

Reading /3 with leshan-server-demo using SenML CBOR generate a leshan parse error and decoding the received SenML show an issue with encording multi-instance resource:

I try to read /3 using leshan demo server on zephyr lwm2m client:

2025-11-07 15:21:22,263 ClientServlet        [WARN] Invalid response
org.eclipse.leshan.core.request.exception.InvalidResponseException: Unable to decode response payload of request [ReadRequest [path=/3 format=SENML_CBOR(112)]] from client [native_sim]
        at org.eclipse.leshan.transport.californium.server.request.LwM2mResponseBuilder.handleCodecException(LwM2mResponseBuilder.java:438)
        at org.eclipse.leshan.transport.californium.server.request.LwM2mResponseBuilder.decodeCoapTimestampedResponse(LwM2mResponseBuilder.java:418)
        at org.eclipse.leshan.transport.californium.server.request.LwM2mResponseBuilder.visit(LwM2mResponseBuilder.java:121)
        at org.eclipse.leshan.core.request.ReadRequest.accept(ReadRequest.java:195)
        at org.eclipse.leshan.transport.californium.server.endpoint.ServerCoapMessageTranslator.createLwM2mResponse(ServerCoapMessageTranslator.java:75)
        at org.eclipse.leshan.transport.californium.server.endpoint.CaliforniumServerEndpoint$1.buildResponse(CaliforniumServerEndpoint.java:117)
        at org.eclipse.leshan.transport.californium.SyncRequestObserver.waitForResponse(SyncRequestObserver.java:55)
        at org.eclipse.leshan.transport.californium.server.endpoint.CaliforniumServerEndpoint.send(CaliforniumServerEndpoint.java:143)
        at org.eclipse.leshan.server.request.DefaultDownlinkRequestSender.send(DefaultDownlinkRequestSender.java:96)
        at org.eclipse.leshan.server.queue.QueueModeLwM2mRequestSender.send(QueueModeLwM2mRequestSender.java:60)
        at org.eclipse.leshan.server.LeshanServer.send(LeshanServer.java:489)
        at org.eclipse.leshan.server.LeshanServer.send(LeshanServer.java:462)
        at org.eclipse.leshan.demo.server.servlet.queuemode.QueueHandler.send(QueueHandler.java:112)
        at org.eclipse.leshan.demo.server.servlet.ClientServlet.sendRequestAndWriteResponse(ClientServlet.java:686)
        at org.eclipse.leshan.demo.server.servlet.ClientServlet.lambda$sendReadRequest$0(ClientServlet.java:209)
        at org.eclipse.leshan.demo.servers.json.servlet.LeshanDemoServlet.executeSafely(LeshanDemoServlet.java:40)
        at org.eclipse.leshan.demo.server.servlet.ClientServlet.sendReadRequest(ClientServlet.java:199)
        at org.eclipse.leshan.demo.server.servlet.ClientServlet.doGet(ClientServlet.java:194)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
        at org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736)
        at org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1614)
        at org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1547)
        at org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:824)
        at org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:436)
        at org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:464)
        at org.eclipse.jetty.ee10.servlet.SessionHandler.handle(SessionHandler.java:717)
        at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1060)
        at org.eclipse.jetty.server.Server.handle(Server.java:182)
        at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:662)
        at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:414)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
        at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:478)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:441)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:979)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1209)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1164)
        at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: org.eclipse.leshan.core.node.codec.CodecException: Unable to decode node[path:/3] : 96a321652f332f302f00613003665a6570687972a2006131037142617365204c774d324d20436c69656e74a2006132036430303031a20061330363312e30a20063362f300201a10205a20063372f3002190ed8a102191388a20063382f3002187da102190384a200613902185fa200623130020fa2006431312f300200a200623133021826a2006231340360a2006231350360a200623136036155a200623137036a6e61746976655f73696da2006231380363312e30a2006231390360a2006232300201a200623231021819
        at org.eclipse.leshan.core.node.codec.senml.LwM2mNodeSenMLDecoder.decodeTimestampedData(LwM2mNodeSenMLDecoder.java:221)
        at org.eclipse.leshan.core.node.codec.DefaultLwM2mDecoder.decodeTimestampedData(DefaultLwM2mDecoder.java:202)
        at org.eclipse.leshan.transport.californium.server.request.LwM2mResponseBuilder.decodeCoapTimestampedResponse(LwM2mResponseBuilder.java:409)
        ... 41 common frames omitted
Caused by: org.eclipse.leshan.senml.SenMLException: Unable to resolve record, invalid path
        at org.eclipse.leshan.core.node.codec.senml.LwM2mSenMLResolver.createResolvedRecord(LwM2mSenMLResolver.java:49)
        at org.eclipse.leshan.core.node.codec.senml.LwM2mSenMLResolver.createResolvedRecord(LwM2mSenMLResolver.java:30)
        at org.eclipse.leshan.senml.SenMLResolver.resolve(SenMLResolver.java:64)
        at org.eclipse.leshan.core.node.codec.senml.LwM2mNodeSenMLDecoder.groupRecordByTimestamp(LwM2mNodeSenMLDecoder.java:502)
        at org.eclipse.leshan.core.node.codec.senml.LwM2mNodeSenMLDecoder.decodeTimestampedData(LwM2mNodeSenMLDecoder.java:206)
        ... 43 common frames omitted
Caused by: org.eclipse.leshan.core.node.InvalidLwM2mPathException: Unable to parse LWM2M path [/3/0/] : Unexpected charaters '/' after '/3/0'
        at org.eclipse.leshan.core.node.PrefixedLwM2mPathParser$1.raiseException(PrefixedLwM2mPathParser.java:45)
        at org.eclipse.leshan.core.parser.StringParser.raiseException(StringParser.java:426)
        at org.eclipse.leshan.core.parser.StringParser.raiseException(StringParser.java:416)
        at org.eclipse.leshan.core.node.PrefixedLwM2mPathParser.parsePrefixedPath(PrefixedLwM2mPathParser.java:52)
        at org.eclipse.leshan.core.node.codec.senml.LwM2mSenMLResolver.createResolvedRecord(LwM2mSenMLResolver.java:46)
        ... 47 common frames omitted

decoded SenML+CBOR:

[
  {-2: "/3/0/", 0: "0", 3: "Zephyr"},
  {0: "1", 3: "Base LwM2M Client"},
  {0: "2", 3: "0001"},
  {0: "3", 3: "1.0"},
  {0: "6/0", 2: 1},
  {2: 5},
  {0: "7/0", 2: 3800},
  {2: 5000},
  {0: "8/0", 2: 125},
  {2: 900},
  {0: "9", 2: 95},
  {0: "10", 2: 15},
  {0: "11/0", 2: 0},
  {0: "13", 2: 38},
  {0: "14", 3: ""}, 
  {0: "15", 3: ""},
  {0: "16", 3: "U"},
  {0: "17", 3: "native_sim"},
  {0: "18", 3: "1.0"},
  {0: "19", 3: ""},
  {0: "20", 2: 1},
  {0: "21", 2: 25}
]

but it works on other objects (like /5 with no multi-instance resource):
parsed response:
86a321652f352f302f0061310360a20061330200a20061350200a20061360360a20061370360a20061390202

[
  {-2: "/5/0/", 0: "1", 3: ""}, 
  {0: "3", 2: 0},
  {0: "5", 2: 0},
  {0: "6", 3: ""},
  {0: "7", 3: ""}, 
  {0: "9", 2: 2}]

Was working a few week ago, I suspect it's a regression introduced here: #98328 (to be confirmed)

Regression

  • This is a regression.

Steps to reproduce

Build the LWM2M sample using native_sim and enabled 1.1 and senml cbor in KConfig

Relevant log output

Impact

Major – Severely degrades functionality; workaround is difficult or unavailable.

Environment

No response

Additional Context

No response

Metadata

Metadata

Assignees

Labels

RegressionSomething, which was working, does not anymorearea: LWM2MbugThe issue is a bug, or the PR is fixing a bugpriority: highHigh impact/importance bug

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions