Georgi Chorbadzhiyski wrote:

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

Ами vsnprintf_sensitive не трябва да е с променлив брой аргументи . Тя трябва да е определена подобно на vsnprintf, т.е. : .... char *fmt, va_list params) .

Относно show3: Трябва foo_sensitive определена подобно на snprintf, т.е. : .... char *fmt, ...) .



Приложената програма се компилира с gcc vl.c -o vl

Примерни разлики прикачени в va.diff


Румен



--- va.c        2012-07-02 22:45:12.790483438 +0300
+++ va-test.c   2012-07-02 23:13:13.177545733 +0300
@@ -4,12 +4,9 @@
 
 static int hide = 0;
 
-static char *vsnprintf_sensitive(char *result, int result_size, int 
remove_sensitive, char *fmt, ...) {
+static char *vsnprintf_sensitive(char *result, int result_size, int 
remove_sensitive, char *fmt, va_list params) {
        // 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) {
@@ -32,6 +29,14 @@
        result[p] = '\0';
        return result;
 }
+static char *snprintf_sensitive(char *result, int result_size, int 
remove_sensitive, char *fmt, ...) {
+       char *ret;
+       va_list params;
+       va_start(params, fmt);
+       ret = vsnprintf_sensitive(result, result_size, remove_sensitive, fmt, 
params);
+       va_end(params);
+       return ret;
+}
 
 void show(char *fmt, ...) {
        char txt[256];
@@ -53,7 +58,7 @@
 #define show3(fmt, ...) \
        do { \
                char txt[256]; \
-               show("show3:%s", vsnprintf_sensitive(txt, sizeof(txt), hide, 
fmt, __VA_ARGS__)); \
+               show("show3:%s", snprintf_sensitive(txt, sizeof(txt), hide, 
fmt, __VA_ARGS__)); \
        } while(0)
 
 
_______________________________________________
Lug-bg mailing list
[email protected]
http://linux-bulgaria.org/mailman/listinfo/lug-bg

Reply via email to