Georgi Chorbadzhiyski <[email protected]> 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>
pgppPSsYkgseu.pgp
Description: PGP signature
_______________________________________________ Lug-bg mailing list [email protected] http://linux-bulgaria.org/mailman/listinfo/lug-bg
