[スレッド全体]

2016/12/3 (土) 00:36:13 ばぼ 返信 削除
Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
[2390] Re6:セキュアなsnprintf関数。
▼ もかさん
> それ以前の問題として、サクラの定義をよく見てみると、数か所間違いがあるようにみえます。
> defineのほうはrev:3680以降からです。

やっと言ってる意味が分かりました。
わたしの修正コードでなくて、
現在のコードに対する修正提案なんですね。


(tchar_snprintf_sの実装部分)
> -	int ret=tchar_vsprintf_s(buf,count,format,v);
> +	int ret=tchar_vsnprintf_s(buf,count,format,v);

コア実装がいまのままなら同じことなんで
間違っていても機能的には影響ないと思います。

機能的に影響がなければ直さない、
それが乙女のポリシー。

と言われたらもう何も言えねっす。


ちなみに、tchar_snprintf_sは直呼びじゃなく
auto_snprintf_sを経由するのが正道と思われます。

string_ex.h 260行目
inline int auto_snprintf_s(ACHAR* buf, size_t count, const ACHAR* format, ...)   { va_list v; va_start(v,format); int ret=tchar_vsnprintf_s(buf,count,format,v); va_end(v); return ret; }
inline int auto_snprintf_s(WCHAR* buf, size_t count, const WCHAR* format, ...)   { va_list v; va_start(v,format); int ret=tchar_vsnprintf_s(buf,count,format,v); va_end(v); return ret; }
inline int auto_sprintf(ACHAR* buf, const ACHAR* format, ...)                    { va_list v; va_start(v,format); int ret=tchar_vsprintf(buf,format,v); va_end(v); return ret; }
inline int auto_sprintf(WCHAR* buf, const WCHAR* format, ...)                    { va_list v; va_start(v,format); int ret=tchar_vsprintf(buf,format,v); va_end(v); return ret; }
inline int auto_sprintf_s(ACHAR* buf, size_t nBufCount, const ACHAR* format, ...){ va_list v; va_start(v,format); int ret=tchar_vsprintf_s(buf,nBufCount,format,v); va_end(v); return ret; }
inline int auto_sprintf_s(WCHAR* buf, size_t nBufCount, const WCHAR* format, ...){ va_list v; va_start(v,format); int ret=tchar_vsprintf_s(buf,nBufCount,format,v); va_end(v); return ret; }

こっちは合ってますな。

内部実装のva_arg版関数を呼び出すだけの代物なので、
呼び出し口で1か所対応すれば目的を果たせるはずです。
邪道を利用してる箇所は非常に少なかったはずなので、
呼出し側を修正して関数定義ごと削除するのが適切かと思います。

関数定義ごと削除してしまえば
誤って利用してしまうことの再発防止にもなりますし。

また、全く同じ意味の実体が別定義で存在するので
機能を損なうこともありません。


まぁ、機能的影響はゼロなので、
どうでもいいっちゃどうでもいい話。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.81
[ut:0.010][st:0.000]