Skip to content
This repository has been archived by the owner on Aug 21, 2024. It is now read-only.

SimpleHTTP::Post() でデータが指定したサイズを超えて送信される #51

Open
Raclamusi opened this issue Nov 10, 2023 · 0 comments
Labels
unexpected result Something isn't working

Comments

@Raclamusi
Copy link

予期しない動作の内容

SimpleHTTP::Post(url, headers, src, size, writer) を呼び出したとき、size を無視して src を 0 のバイトが登場するまで送信します。
意図したとおりにデータを送信できないうえ、バッファオーバーランの危険性があります。

再現方法

以下のコードを実行し、スペースキーを押します。

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		if (KeySpace.down())
		{
			MemoryWriter writer;

			SimpleHTTP::Post(U"https://script.google.com/macros/s/AKfycbz78zNhTqOwne7I0wg9me1Alny8NEYn3FZnAmdQ3xljV4l08vTziTE6XWJoGOYH9NJR/exec", {}, "abcdefgh", 4, writer);

			Print << U"size: {}"_fmt(writer.size());
			Print << U"content: {}"_fmt(Unicode::FromUTF8(std::string_view{ std::bit_cast<const char*>(writer.getBlob().data()), writer.getBlob().size() }));
		}
	}
}

コード中の URL は、POST したデータをそのまま返すように設定したウェブアプリのものです。
スペースキー押下時に "abcdefgh" のうち4バイトを送信するコードを書いていますが、実際にはヌル文字が登場するまでの8バイトが送信されています。

image

原因

この問題の原因は、siv3dSendXMLHTTPRequest()UTF8ToString() によってデータを文字列に変換していることです。
この関数にデータサイズを渡し、適切に変換することで、この問題を解決できると思います。
例えば、以下のように siv3dSendXMLHTTPRequest() を修正することが考えられます。

-    siv3dSendXMLHTTPRequest: function(id, dataPtr) {
+    siv3dSendXMLHTTPRequest: function(id, dataPtr, dataSize) {
         {{{ runtimeKeepalivePush() }}}

         siv3dXMLHTTPRequestList[id].addEventListener("load", function() {
             {{{ runtimeKeepalivePop() }}}
         });
         siv3dXMLHTTPRequestList[id].addEventListener("error", function() {
             {{{ runtimeKeepalivePop() }}}
         });

-        const data = dataPtr ? UTF8ToString(dataPtr) : null;
+        const data = dataPtr ? new Uint8Array(HEAPU8.buffer, dataPtr, dataSize) : null;
         siv3dXMLHTTPRequestList[id].send(data);
     },
-    siv3dSendXMLHTTPRequest__sig: "vii",
+    siv3dSendXMLHTTPRequest__sig: "viii",
     siv3dSendXMLHTTPRequest__deps: [ "$siv3dXMLHTTPRequestList" ],
@Raclamusi Raclamusi added the unexpected result Something isn't working label Nov 10, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
unexpected result Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant