goo

cnvstow

cnvstow
下記のcnvstowエラーは、2012/06/14 3.31β1 で、修正されています。

 cnvstowの第一引数に指定する変数は、(変換元の文字列サイズ + 1) * 2 以上確保する必要があります。 そうでない場合、予期しないエラーが発生する可能性があります。 コード1を実行、終了後にエラー報告ダイアログが出ました。 この件は、HSP3のバグトラックに報告しています。
コード1 - 終了時にエラーが発生する可能性があります
	sdim dst, 64
	sdim src, 1024
	repeat 1000 : src += "x" : loop
	cnvstow dst, src
	stop
 UNICODE変換は、hsp3ext_win.cppのcnvwstr関数を使用しているようですが、 cnvstowではwchar_t単位ではなくchar単位でbufsizeを指定しているためバッファオーバーフローしているようです。
int cnvwstr( void *out, char *in, int bufsize )
{
	//	sjis->unicode に変換
	//
	return MultiByteToWideChar( CP_ACP, 0, in, -1, (LPWSTR)out, bufsize );
}
dupptr
 HSP3掲示板 重複した範囲の dupptr についてより。
通常文字列変数とクローン文字列変数では、代入方法が違うようです。
hspvar_str.cppのHspVarStr_Set関数は、
static void HspVarStr_Set( PVal *pval, PDAT *pdat, const void *in )
{
	char **pp;
	if ( pval->mode == HSPVAR_MODE_CLONE ) {
		strncpy( (char *)pdat, (char *)in, pval->size );
		return;
	}
	pp = (char **)sbGetOption( (char *)pdat );
	sbStrCopy( pp, (char *)in );
	//strcpy( GetPtr(pval), (char *)in );
}
とあります。MSDNによればstrncpyは、
char *strncpy(char *strDest, const char *strSource, size_t count);
strncpy 関数は、strSource の最初の count の文字数を strDest にコピーし、strDest を返します。count で指定した文字数が strSource の文字数より少ない場合、NULL 文字はコピー先の文字列に追加されません。count で指定した文字数が strSource の文字数よりも多い場合は、count の文字数になるまで、コピー先文字列に NULL 文字が埋め込まれます。コピー元の文字列とコピー先の文字列が重なり合う場合、strncpy 関数の動作は未定義です。
とあります。大きなサイズや頻繁に代入が必要なクローン文字列変数を使う場合、代入は使わないでmemcpyなどを使用したほうがいいかと思います。 逆に、常にクリアしたい時は便利かもしれません(固定バッファサイズの文字列を送信する時など)。
コメント ( 0 ) | Trackback ( 0 )

cnvstowの修正

cnvstowの修正について。
下記、history.txtより引用
2012/06/14 3.31β1 cnvstow命令でバッファオーバーフローが発生することがある不具合を修正(BT#245)
コメント ( 0 ) | Trackback ( 0 )