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

 

начало

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

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

семинари ...

документи

как да ...

 

 

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

Re: [Lug-bg] C va args


  • Subject: Re: [Lug-bg] C va args
  • From: Румен Петров <help@xxxxxxxxxxxxxxxxx>
  • Date: Mon, 02 Jul 2012 23:22:49 +0300

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
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.