[Lug-bg] C va args
- Subject: [Lug-bg] C va args
- From: Georgi Chorbadzhiyski <gf@xxxxxxxxxxx>
- Date: Mon, 02 Jul 2012 21:17:15 +0300
- Organization: Unix Solutions Ltd. (http://unixsol.org/)
Е, понеже никой не пише тук освен спамери, я да се направя и аз на спамер.
Моля някой който разбира повече от мен от 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@xxxxxxxxxxxxxxxxxx
http://linux-bulgaria.org/mailman/listinfo/lug-bg
|