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