[スレッド全体]

2016/11/30 (水) 16:31:39 もか  
Mozilla/5.0 (Windows NT 6.3; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
[2388] Re5:セキュアなsnprintf関数。
それ以前の問題として、サクラの定義をよく見てみると、数か所間違いがあるようにみえます。
defineのほうはrev:3680以降からです。
こうじゃないでしょうか。

Index: sakura_core/util/string_ex.h
===================================================================
--- sakura_core/util/string_ex.h	(リビジョン 4157)
+++ sakura_core/util/string_ex.h	(作業コピー)
@@ -253,9 +253,9 @@
 
 //印字系
 #if defined(_MSC_VER) && _MSC_VER>=1400
-#define auto_snprintf_s(buf, count, format, ...) tchar_sprintf_s((buf), count, (format), __VA_ARGS__)
+#define auto_snprintf_s(buf, count, format, ...) tchar_snprintf_s((buf), count, (format), __VA_ARGS__)
 #define auto_sprintf(buf, format, ...)           tchar_sprintf((buf), (format), __VA_ARGS__)
-#define auto_sprintf_s(buf, nBufCount, format, ...) tchar_snprintf_s((buf), nBufCount, (format), __VA_ARGS__)
+#define auto_sprintf_s(buf, nBufCount, format, ...) tchar_sprintf_s((buf), nBufCount, (format), __VA_ARGS__)
 #else
(すみません省略します)
Index: sakura_core/util/tchar_printf.cpp
===================================================================
--- sakura_core/util/tchar_printf.cpp	(リビジョン 4157)
+++ sakura_core/util/tchar_printf.cpp	(作業コピー)
@@ -359,6 +359,7 @@
 
 
 // sprintf_sラップ
+// ※nBufCountをはみ出す場合は異常終了します。
 //
 // (実装について)
 //     内容が同じなので、templateでも良かったのですが、
@@ -418,7 +419,7 @@
 {
 	va_list v;
 	va_start(v,format);
-	int ret=tchar_vsprintf_s(buf,count,format,v);
+	int ret=tchar_vsnprintf_s(buf,count,format,v);
 	va_end(v);
 	return ret;
 }
@@ -426,7 +427,7 @@
 {
 	va_list v;
 	va_start(v,format);
-	int ret=tchar_vsprintf_s(buf,count,format,v);
+	int ret=tchar_vsnprintf_s(buf,count,format,v);
 	va_end(v);
 	return ret;
 }

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]