Linux-Bulgaria.ORG
навигация

 

начало

пощенски списък

архив на групата

семинари ...

документи

как да ...

 

 

Предишно писмо Следващо писмо Предишно по тема Следващо по тема По Дата По тема (thread)

[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


 

наши приятели

 

линукс за българи
http://linux-bg.org

FSA-BG
http://fsa-bg.org

OpenFest
http://openfest.org

FreeBSD BG
http://bg-freebsd.org

KDE-BG
http://kde.fsa-bg.org/

Gnome-BG
http://gnome.cult.bg/

проект OpenFMI
http://openfmi.net

NetField Forum
http://netField.ludost.net/forum/

 

 

Linux-Bulgaria.ORG

Mailing list messages are © Copyright their authors.