Е, понеже никой не пише тук освен спамери, я да се направя и аз на спамер.

Моля някой който разбира повече от мен от 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

Reply via email to