Georgi Chorbadzhiyski <g...@unixsol.org> writes:

> Е, понеже никой не пише тук освен спамери, я да се направя и аз на спамер.
>
> Моля някой който разбира повече от мен от C (би трябвало да са бая народ :)
> да ми светне лампата как да оправя следната атачната "програма". Функцията
> show2 не работи, резултатът от изпълнението на програмата е:
>
> show:1 test
> show:2 test
> show:3 test
> show:show2:-1079180764 show:%s
> show:show2:-1079180764 show:%s
> show:show2:-1079180764 show:%s
> show:show2:-1079180764 show:%s
> show:show3:1 test
> show:show3:1 test
> show:show3:2 test
> show:show3:3 test
> show:show2:-1079180764 show:%s
> show:show2:-1079180764 show:%s
> show:show2:-1079180764 show:%s
> show:show2:-1079180764 show:%s
> show:show3:1 test
> show:show3:1 -est
> show:show3:2 t-st
> show:show3:3 te-t
>
> когато show2 и show3 трябва да правят едно също. И друг път съм имал подобен
> проблем с va_start, когато го ползвам по подобен начин (от една моя функция
> викам друга и в двете искам да ползвам va_start/va_end).
>
> Приложената програма се компилира с gcc vl.c -o vl

В show2() пъхаш va_list в стека за разлика от show3() където се пъхат
самите аргументи. Прикачил съм кръпка дето променя имплементацията на
vsnprintf_sensitive() да работи с show2. Може би е по-добре да промениш
прототипа на vsnprintf_sensitive() вместо ... да приема va_list, по
подобие на библиотечната vsnprintf().
--- vl.c.orig	2012-07-03 02:50:38.882837484 +0300
+++ vl.c	2012-07-03 02:52:55.608826316 +0300
@@ -7,8 +7,10 @@
 static char *vsnprintf_sensitive(char *result, int result_size, int remove_sensitive, char *fmt, ...) {
 	// Get the resulting string
 	va_list params;
+	va_list params2;
 	va_start(params, fmt);
-	vsnprintf(result, result_size, fmt, params);
+	params2 = va_arg(params, va_list);
+	vsnprintf(result, result_size, fmt, params2);
 	va_end(params);
 	// Filter sensitive information
 	int i, n = strlen(result), p = 0;
@@ -56,6 +58,8 @@
 		show("show3:%s", vsnprintf_sensitive(txt, sizeof(txt), hide, fmt, __VA_ARGS__)); \
 	} while(0)
 
+#undef show3
+#define show3(fmt, ...)
 
 int main(void)
 {
-- 
Nedko Arnaudov <GnuPG KeyID: 5D1B58ED>

Attachment: pgppPSsYkgseu.pgp
Description: PGP signature

_______________________________________________
Lug-bg mailing list
Lug-bg@linux-bulgaria.org
http://linux-bulgaria.org/mailman/listinfo/lug-bg

Reply via email to