godai-kaihatsu / gondwana

https://gondwana.godai.co.jp/
2 stars 0 forks source link

GetIndex GetMaterialParam GetNormal GetTangent GetTextureSource GetUV GetVertex GetVertexColor で id をオブジェクトとして与える params パターンを使用すると G4 が不正終了するバグを修正する #76

Closed KouichiAraki closed 6 years ago

KouichiAraki commented 6 years ago

G4-4.0.0.16にて下記のコードを実行するとエラーウィンドウが表示されてG4が落ちてしまいました。 GetIndexを実行することが原因なのではないかと思われます。 ご確認よろしくお願いいたします。

default

\# -*- coding: utf-8 -*-
import pycurl, io

def ExeRequest( Request, Host ):
    curl = pycurl.Curl()
    Buf = io.BytesIO()
    curl.reset()
    curl.setopt( pycurl.URL, Host )
    curl.setopt( pycurl.CUSTOMREQUEST, 'POST' )
    curl.setopt( pycurl.POSTFIELDS, Request )
    curl.setopt( pycurl.WRITEDATA, Buf )
    curl.perform()
    return Buf.getvalue().decode( 'UTF-8' )

if __name__ == '__main__':

    HostIp = '127.0.0.1'
    PortNum = '50080/api/json-rpc-2.0/'
    Host = HostIp + ':' + PortNum

    Request = '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.New" }'
    ExeRequest( Request, Host )
    Request = '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetVertexGlobal", "params": { "id": 0, "vertices": [ 200.0, 43.062096, 141.354376, 200.0, 43.067096, 141.349376 , 200.0, 43.067096, 141.359376 ] } }'
    ExeRequest( Request, Host )
    Request = '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetIndex", "params": { "id": 0, "indices": [ 0, 1, 2, 0, 2, 1 ] } }'
    ExeRequest( Request, Host )
    Request = '{ "jsonrpc": "2.0", "id": null, "method": "GeoObject.GetIndex", "params": [0] }'
    ExeRequest( Request, Host )
usagi commented 6 years ago

再現用 #76.json:

[ { "jsonrpc": "2.0", "id": null, "method": "GeoObject.New" }
, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetVertexGlobal"
  , "params":
    { "id": 0
    , "vertices": [ 200.0, 43.062096, 141.354376, 200.0, 43.067096, 141.349376 , 200.0, 43.067096, 141.359376 ]
    }
  }
, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.SetIndex"
  , "params":
    { "id": 0
    , "indices": [ 0, 1, 2, 0, 2, 1 ]
    }
  }
, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.GetIndex"
  , "params": [ 0 ]
  }
]
curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST -d @#76.json
usagi commented 6 years ago

状況の発生を確認。再現性、高。

usagi commented 6 years ago

メモリーアクセスエラーが発生する事からアプリケーションのバグと認定。対応を開始。

usagi commented 6 years ago

JSONのパーサーに実装上のバグを発見。対応を検討。

usagi commented 6 years ago

バグの影響範囲を確認:

  1. GetIndex
  2. GetMaterialParam
  3. GetNormal
  4. GetTangent
  5. GetTextureSource
  6. GetUV
  7. GetVertex
  8. GetVertexColor
usagi commented 6 years ago

修正後、動作確認。

  << curl -Ss -i http://127.0.0.1:50080/api/json-rpc-2.0/ -X POST -d @#76.json                                                              [draft-c++1z]
HTTP/1.1 200 OK
Content-Length: 306
Content-Type: application/json
Access-Control-Allow-Origin: *

[
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": 0
        },
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": null
        },
        {
                "jsonrpc": "2.0",
                "id": null,
                "result": null
        },
        {
                "jsonrpc": "2.0",
                "id": null,
                "error":
                {
                        "code": -32602,
                        "message": "not found id"
                }
        }
]% 
usagi commented 6 years ago

動作確認で GetIndex が error を返しているが、この点はバグとは無関係。 params の定義が誤っているためこの場合は error となるのが正常な挙動。

https://github.com/godai-kaihatsu/gondwana/wiki/dev'http_api'reference'GeoObject.GetIndex

image

これについては Pattern 3 を試そうとしたものと思われるので、#76.json のバッチリストの最後のリクエストオブジェクトを次のように修正すると期待動作を得られると推量される:

fixed-request:

, { "jsonrpc": "2.0", "id": null, "method": "GeoObject.GetIndex"
  , "params": { "id": 0, "indices": [ 0 ] }
  }

exptected-response:

        {
                "jsonrpc": "2.0",
                "id": null,
                "result":
                {
                        "0": 0
                }
        }

また、 params の Pattern 3 は複数の index を取得したい場合のパラメーターの与え方なので、この場合のように 1 つだけの index を取得したい場合は Pattern 4 を用いるとより簡単にリクエストもできる。

request-pettern-4:

"params": { "id": 0, "index": 0 }

response-pattern-4:

        {
                "jsonrpc": "2.0",
                "id": null,
                "result": 0
        }
usagi commented 6 years ago

このバグ修正は 4.0.0.19 ( preview-6b ) に結合。 @KouichiAraki バグレポートありがとうございました。