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
|