From 85147bf69ecd74e05d1c0c65bb2937e4db52340f Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Thu, 19 Oct 2023 00:14:23 -0700 Subject: [PATCH] [wpinet] WebSocketSerializer: Fix UB (#5787) --- .../src/main/native/cpp/WebSocketSerializer.h | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/wpinet/src/main/native/cpp/WebSocketSerializer.h b/wpinet/src/main/native/cpp/WebSocketSerializer.h index 825dfbae26..50c1e0656b 100644 --- a/wpinet/src/main/native/cpp/WebSocketSerializer.h +++ b/wpinet/src/main/native/cpp/WebSocketSerializer.h @@ -179,7 +179,13 @@ std::span TrySendFrames( bufs.append(it->data.begin(), it->data.end()); } callback(bufs, {}); - return {&*frameStart, &*frameEnd}; +#ifdef __clang__ + // work around clang bug + return {frames.data() + (frameStart - frames.begin()), + frames.data() + (frameEnd - frames.begin())}; +#else + return {frameStart, frameEnd}; +#endif } else if (sentBytes < 0) { // error SmallVector bufs; @@ -208,7 +214,13 @@ std::span TrySendFrames( bufs.append(it->data.begin(), it->data.end()); } callback(bufs, {}); - return {&*frameStart, &*frameEnd}; +#ifdef __clang__ + // work around clang bug + return {frames.data() + (frameStart - frames.begin()), + frames.data() + (frameEnd - frames.begin())}; +#else + return {frameStart, frameEnd}; +#endif } // build a list of buffers to send as a normal write: @@ -270,7 +282,13 @@ std::span TrySendFrames( WS_DEBUG("Write({})\n", writeBufs.size()); stream.Write(writeBufs, req); - return {&*frameStart, &*frameEnd}; +#ifdef __clang__ + // work around clang bug + return {frames.data() + (frameStart - frames.begin()), + frames.data() + (frameEnd - frames.begin())}; +#else + return {frameStart, frameEnd}; +#endif } }