Е, понеже никой не пише тук освен спамери, я да се направя и аз на спамер.
Моля някой който разбира повече от мен от 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 -- Georgi Chorbadzhiyski http://georgi.unixsol.org/
#include <stdio.h> #include <stdarg.h> #include <string.h> static int hide = 0; static char *vsnprintf_sensitive(char *result, int result_size, int remove_sensitive, char *fmt, ...) { // Get the resulting string va_list params; va_start(params, fmt); vsnprintf(result, result_size, fmt, params); va_end(params); // Filter sensitive information int i, n = strlen(result), p = 0; if (remove_sensitive) { int in_sens = 0; for (i = 0; i < n; i++) { switch(result[i]) { case '{': in_sens = 1; continue; case '}': in_sens = 0; break; } if (in_sens) result[i] = '-'; } } // Filter sensitive markers for (i = 0; i < n; i++) { if (result[i] == '{' || result[i] == '}') continue; result[p++] = result[i]; } result[p] = '\0'; return result; } void show(char *fmt, ...) { char txt[256]; va_list params; va_start(params, fmt); vsnprintf(txt, sizeof(txt), fmt, params); va_end(params); fprintf(stderr, "show:%s", txt); } void show2(char *fmt, ...) { char txt[256]; va_list args; va_start(args, fmt); show("show2:%s", vsnprintf_sensitive(txt, sizeof(txt), hide, fmt, args)); va_end(args); } #define show3(fmt, ...) \ do { \ char txt[256]; \ show("show3:%s", vsnprintf_sensitive(txt, sizeof(txt), hide, fmt, __VA_ARGS__)); \ } while(0) int main(void) { show("%d %s\n", 1, "test"); show("%d %s\n", 2, "test"); show("%d %s\n", 3, "test"); hide = 0; show2("%d %s\n", 1, "test"); show2("%d %s\n", 1, "{t}est"); show2("%d %s\n", 2, "t{e}st"); show2("%d %s\n", 3, "te{s}t"); show3("%d %s\n", 1, "test"); show3("%d %s\n", 1, "{t}est"); show3("%d %s\n", 2, "t{e}st"); show3("%d %s\n", 3, "te{s}t"); hide = 1; show2("%d %s\n", 1, "test"); show2("%d %s\n", 1, "{t}est"); show2("%d %s\n", 2, "t{e}st"); show2("%d %s\n", 3, "te{s}t"); show3("%d %s\n", 1, "test"); show3("%d %s\n", 1, "{t}est"); show3("%d %s\n", 2, "t{e}st"); show3("%d %s\n", 3, "te{s}t"); }
_______________________________________________ Lug-bg mailing list Lug-bg@linux-bulgaria.org http://linux-bulgaria.org/mailman/listinfo/lug-bg