ここずっと毎日削ってはニス塗りを繰り返していた、机の天板。かなりピカピ
カに。もうちょっと鏡面目指して続けます。

PowerEdge T105に試しにXサーバ入れてみたとこ、僕なら(文字が読めて、緑が
緑に見れればいいいいよレベル)十分使えるレベルのビデオカードだった。
(ML115はさすがに無理だと思ったけれど)、騒音レベルもかなり低いし、これならデスクトップ用に
もう一台注文しておいてもよかったかも。
xorg-server-1.4.2になってxorgcfgがなくなってしまった。かなり便利だったの
に。meta-pkgsから入れただけだとfont-sony-miscが入らないので8x16がない。ちょっとはまった。
amd64だと自前の日記ツールからxmlrpcを介してMovabletypeにコミットするプ
ログラムが動かない。昨日は仕方なくi386からコミットしたのだけど、ちょこっ
と様子を見てみることに。
デバッガで追うとva_argsで死んでいる...。半日かけてデバッグしてみたとこ
ろ
va_list pointers, bad(?) gcc codeのスレ
だった。結局この仕様のままなんだ!
驚いたよ。
動かない理由はこれ。
#include <stdio.h>
#include <stdarg.h>
/*
i386 cc
1:ohayo
2:desu
3:yo
4:desu
amd64 cc
1:ohayo
2:(文字化け)
3:(文字化け)
Segmentation fault (core dumped)
*/
void foo (char *, ...);
void bar (va_list *);
void
bar (va_list *p)
{
printf ("2:%s\n", va_arg(*p, char *));
printf ("3:%s\n", va_arg(*p, char *));
}
void
b (va_list p)
{
bar (&p);
}
void
foo(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
printf ("1:%s\n", va_arg(ap, char *));
b (ap);
printf ("4:%s\n", va_arg(ap, char *));
va_end (ap);
}
int
main ()
{
foo ("ss", "ohayo", "desu", "yo", "!");
return 0;
}
amd64とi386でva_listの定義が違っていてどうにもならない。amd64上でc++な
らコンパイルが通らないからわかるのだけど、ccだとコンパイルは通って動か
ないのでいやらしい。これを下のようにva_listを値で渡しているところをポイ
ンタにしてva_copyして下に渡さないと(ポインタ渡しのところはそのまま)
i386と同じ挙動にならない。vprintfの挙動もi386はインクリメントしないのに
amd64だとインクリメントするので挙動を合わせるためにva_argにしてあります。
#include <stdio.h>
#include <stdarg.h>
/*
i386 cc
1:ohayo
2:desu
3:yo
4:desu
amd64 cc
1:ohayo
2:desu
3:yo
4:desu
*/
void foo (char *, ...);
void bar (va_list *);
void
bar (va_list *p)
{
printf ("2:%s\n", va_arg(*p, char *));
printf ("3:%s\n", va_arg(*p, char *));
}
void
b (va_list *p)
{
va_list q;
va_copy (q, *p);
bar (&q);
}
void
foo(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
printf ("1:%s\n", va_arg(ap, char *));
b (&ap);
printf ("4:%s\n", va_arg(ap, char *));
va_end (ap);
}
int
main ()
{
foo ("ss", "ohayo", "desu", "yo", "!");
return 0;
}
xmlrpc-cの該当部分を延々と書き換えてなんとか動くようになったかも。しか
しこんなきっついのがあってよくもまぁamd64使えてるなと驚いた。それと
xmlrpc-cなんて誰も使ってなさそうということも...^^。
diff -ur xmlrpc-c-1.09.00.orig/include/xmlrpc-c/base.h xmlrpc-c-1.09.00/include/xmlrpc-c/base.h
--- xmlrpc-c-1.09.00.orig/include/xmlrpc-c/base.h 2006-12-24 06:45:21.000000000 +0900
+++ xmlrpc-c-1.09.00/include/xmlrpc-c/base.h 2008-10-12 21:16:45.000000000 +0900
@@ -417,7 +417,7 @@
void
xmlrpc_build_value_va(xmlrpc_env * const env,
const char * const format,
- va_list args,
+ va_list *args,
xmlrpc_value ** const valPP,
const char ** const tailP);
@@ -431,7 +431,7 @@
xmlrpc_decompose_value_va(xmlrpc_env * const envP,
xmlrpc_value * const value,
const char * const format,
- va_list args);
+ va_list *args);
/* xmlrpc_parse_value... is the same as xmlrpc_decompose_value... except
that it doesn't do proper memory management -- it returns xmlrpc_value's
@@ -451,7 +451,7 @@
xmlrpc_parse_value_va(xmlrpc_env * const envP,
xmlrpc_value * const value,
const char * const format,
- va_list args);
+ va_list *args);
/*=========================================================================
** Encoding XML
diff -ur xmlrpc-c-1.09.00.orig/include/xmlrpc-c/string_int.h xmlrpc-c-1.09.00/include/xmlrpc-c/string_int.h
--- xmlrpc-c-1.09.00.orig/include/xmlrpc-c/string_int.h 2006-09-25 05:00:00.000000000 +0900
+++ xmlrpc-c-1.09.00/include/xmlrpc-c/string_int.h 2008-10-12 21:18:24.000000000 +0900
@@ -17,7 +17,7 @@
void
xmlrpc_vasprintf(const char ** const retvalP,
const char * const fmt,
- va_list varargs);
+ va_list *varargs);
void GNU_PRINTF_ATTR(2,3)
xmlrpc_asprintf(const char ** const retvalP, const char * const fmt, ...);
diff -ur xmlrpc-c-1.09.00.orig/include/xmlrpc-c/util.h xmlrpc-c-1.09.00/include/xmlrpc-c/util.h
--- xmlrpc-c-1.09.00.orig/include/xmlrpc-c/util.h 2006-12-24 06:45:21.000000000 +0900
+++ xmlrpc-c-1.09.00/include/xmlrpc-c/util.h 2008-10-12 21:21:39.000000000 +0900
@@ -140,7 +140,7 @@
xmlrpc_set_fault_formatted_v(xmlrpc_env * const envP,
int const code,
const char * const format,
- va_list const args);
+ va_list const *__args);
/* The same as the above, but using a printf-style format string. */
void
diff -ur xmlrpc-c-1.09.00.orig/lib/libutil/casprintf.c xmlrpc-c-1.09.00/lib/libutil/casprintf.c
--- xmlrpc-c-1.09.00.orig/lib/libutil/casprintf.c 2006-07-30 06:49:02.000000000 +0900
+++ xmlrpc-c-1.09.00/lib/libutil/casprintf.c 2008-10-12 21:20:25.000000000 +0900
@@ -11,7 +11,9 @@
static __inline__ void
simpleVasprintf(char ** const retvalP,
const char * const fmt,
- va_list varargs) {
+ va_list *__varargs) {
+ va_list ap;
+ va_copy (ap, *__varargs);
/*----------------------------------------------------------------------------
This is a poor man's implementation of vasprintf(), of GNU fame.
-----------------------------------------------------------------------------*/
@@ -21,12 +23,12 @@
result = malloc(initialSize);
if (result != NULL) {
size_t bytesNeeded;
- bytesNeeded = vsnprintf(result, initialSize, fmt, varargs);
+ bytesNeeded = vsnprintf(result, initialSize, fmt, ap);
if (bytesNeeded > initialSize) {
free(result);
result = malloc(bytesNeeded);
if (result != NULL)
- vsnprintf(result, bytesNeeded, fmt, varargs);
+ vsnprintf(result, bytesNeeded, fmt, ap);
} else if (bytesNeeded == initialSize) {
if (result[initialSize-1] != '\0') {
/* This is one of those old systems where vsnprintf()
@@ -53,14 +55,15 @@
void
xmlrpc_vasprintf(const char ** const retvalP,
const char * const fmt,
- va_list varargs) {
-
+ va_list *__varargs) {
+ va_list ap;
+ va_copy (ap, *__varargs);
char * string;
#if HAVE_ASPRINTF
- vasprintf(&string, fmt, varargs);
+ vasprintf(&string, fmt, ap);
#else
- simpleVasprintf(&string, fmt, varargs);
+ simpleVasprintf(&string, fmt, &ap);
#endif
if (string == NULL)
diff -ur xmlrpc-c-1.09.00.orig/lib/libutil/error.c xmlrpc-c-1.09.00/lib/libutil/error.c
--- xmlrpc-c-1.09.00.orig/lib/libutil/error.c 2006-09-04 06:52:31.000000000 +0900
+++ xmlrpc-c-1.09.00/lib/libutil/error.c 2008-10-12 21:23:14.000000000 +0900
@@ -79,11 +79,12 @@
xmlrpc_set_fault_formatted_v(xmlrpc_env * const envP,
int const code,
const char * const format,
- va_list const args) {
-
+ va_list const *__args) {
+ va_list ap;
+ va_copy (ap, *__args);
char buffer[ERROR_BUFFER_SZ];
- vsnprintf(buffer, ERROR_BUFFER_SZ, format, args);
+ vsnprintf(buffer, ERROR_BUFFER_SZ, format, ap);
/* vsnprintf is guaranteed to terminate the buffer, but we're paranoid. */
buffer[ERROR_BUFFER_SZ - 1] = '\0';
diff -ur xmlrpc-c-1.09.00.orig/src/cpp/client_simple.cpp xmlrpc-c-1.09.00/src/cpp/client_simple.cpp
--- xmlrpc-c-1.09.00.orig/src/cpp/client_simple.cpp 2006-02-05 04:25:18.000000000 +0900
+++ xmlrpc-c-1.09.00/src/cpp/client_simple.cpp 2008-10-12 20:56:36.000000000 +0900
@@ -71,9 +71,11 @@
void
makeParamArray(string const format,
xmlrpc_value ** const paramArrayPP,
- va_list args) {
+ va_list *__args) {
env_wrap env;
+ va_list ap;
+ va_copy (ap, *__args);
/* The format is a sequence of parameter specifications, such as
"iiii" for 4 integer parameters. We add parentheses to make it
@@ -83,7 +85,7 @@
const char * tail;
xmlrpc_build_value_va(&env.env_c, arrayFormat.c_str(),
- args, paramArrayPP, &tail);
+ &ap, paramArrayPP, &tail);
if (env.env_c.fault_occurred)
throw(error(env.env_c.fault_string));
@@ -118,7 +120,7 @@
va_list args;
va_start(args, resultP);
- makeParamArray(format, ¶mArrayP, args);
+ makeParamArray(format, ¶mArrayP, &args);
va_end(args);
if (env.env_c.fault_occurred)
diff -ur xmlrpc-c-1.09.00.orig/src/cpp/girerr.cpp xmlrpc-c-1.09.00/src/cpp/girerr.cpp
--- xmlrpc-c-1.09.00.orig/src/cpp/girerr.cpp 2006-03-23 08:44:44.000000000 +0900
+++ xmlrpc-c-1.09.00/src/cpp/girerr.cpp 2008-10-12 21:20:40.000000000 +0900
@@ -14,7 +14,7 @@
va_start(varargs, format);
const char * value;
- xmlrpc_vasprintf(&value, format, varargs);
+ xmlrpc_vasprintf(&value, format, &varargs);
string const valueString(value);
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_build.c xmlrpc-c-1.09.00/src/xmlrpc_build.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_build.c 2008-10-12 17:54:34.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_build.c 2008-10-12 20:54:59.000000000 +0900
@@ -424,12 +424,14 @@
void
xmlrpc_build_value_va(xmlrpc_env * const envP,
const char * const format,
- va_list args,
+ va_list *__args,
xmlrpc_value ** const valPP,
const char ** const tailP) {
XMLRPC_ASSERT_ENV_OK(envP);
XMLRPC_ASSERT(format != NULL);
+ va_list ap;
+ va_copy (ap, *__args);
if (strlen(format) == 0)
xmlrpc_faultf(envP, "Format string is empty.");
@@ -437,7 +439,7 @@
const char * formatCursor;
formatCursor = &format[0];
- getValue(envP, &formatCursor, &args, valPP);
+ getValue(envP, &formatCursor, &ap, valPP);
if (!envP->fault_occurred)
XMLRPC_ASSERT_VALUE_OK(*valPP);
@@ -458,7 +460,7 @@
const char * suffix;
va_start(args, format);
- xmlrpc_build_value_va(envP, format, args, &retval, &suffix);
+ xmlrpc_build_value_va(envP, format, &args, &retval, &suffix);
va_end(args);
if (!envP->fault_occurred) {
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_client.c xmlrpc-c-1.09.00/src/xmlrpc_client.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_client.c 2007-01-01 11:14:06.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_client.c 2008-10-12 21:11:24.000000000 +0900
@@ -633,11 +633,13 @@
const char * const methodName,
const char * const format,
xmlrpc_value ** const resultPP,
- va_list args) {
+ va_list *__args) {
xmlrpc_value * argP;
xmlrpc_env argenv;
const char * suffix;
+ va_list ap;
+ va_copy (ap, *__args);
XMLRPC_ASSERT_ENV_OK(envP);
XMLRPC_ASSERT_PTR_OK(serverUrl);
@@ -647,7 +649,7 @@
/* Build our argument value. */
xmlrpc_env_init(&argenv);
- xmlrpc_build_value_va(&argenv, format, args, &argP, &suffix);
+ xmlrpc_build_value_va(&argenv, format, &ap, &argP, &suffix);
if (argenv.fault_occurred)
xmlrpc_env_set_fault_formatted(
envP, argenv.fault_code, "Invalid RPC arguments. "
@@ -696,7 +698,7 @@
va_start(args, format);
clientCall2f_va(envP, clientP, serverUrl,
- methodName, format, resultPP, args);
+ methodName, format, resultPP, &args);
va_end(args);
}
@@ -969,7 +971,7 @@
/* Build our argument array. */
va_start(args, format);
- xmlrpc_build_value_va(envP, format, args, ¶mArrayP, &suffix);
+ xmlrpc_build_value_va(envP, format, &args, ¶mArrayP, &suffix);
va_end(args);
if (!envP->fault_occurred) {
if (*suffix != '\0')
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_client_global.c xmlrpc-c-1.09.00/src/xmlrpc_client_global.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_client_global.c 2006-04-10 23:17:01.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_client_global.c 2008-10-12 21:09:55.000000000 +0900
@@ -127,15 +127,16 @@
const xmlrpc_server_info * const serverInfoP,
const char * const methodName,
const char * const format,
- va_list args,
+ va_list *__args,
xmlrpc_value ** const resultPP) {
-
+ va_list ap;
+ va_copy (ap, *__args);
validateGlobalClientExists(envP);
if (!envP->fault_occurred) {
xmlrpc_value * paramArrayP;
const char * suffix;
- xmlrpc_build_value_va(envP, format, args, ¶mArrayP, &suffix);
+ xmlrpc_build_value_va(envP, format, &ap, ¶mArrayP, &suffix);
if (!envP->fault_occurred) {
if (*suffix != '\0')
@@ -171,7 +172,7 @@
va_list args;
va_start(args, format);
- clientCall_va(envP, serverInfoP, methodName, format, args, &resultP);
+ clientCall_va(envP, serverInfoP, methodName, format, &args, &resultP);
va_end(args);
xmlrpc_server_info_free(serverInfoP);
@@ -193,7 +194,7 @@
xmlrpc_value * resultP;
va_start(args, format);
- clientCall_va(envP, serverP, methodName, format, args, &resultP);
+ clientCall_va(envP, serverP, methodName, format, &args, &resultP);
va_end(args);
return resultP;
@@ -305,7 +306,7 @@
va_list args;
va_start(args, format);
- xmlrpc_build_value_va(&env, format, args, ¶mArrayP, &suffix);
+ xmlrpc_build_value_va(&env, format, &args, ¶mArrayP, &suffix);
va_end(args);
if (!env.fault_occurred) {
@@ -371,7 +372,7 @@
xmlrpc_env_init(&env);
va_start(args, format);
- xmlrpc_build_value_va(&env, format, args, ¶mArrayP, &suffix);
+ xmlrpc_build_value_va(&env, format, &args, ¶mArrayP, &suffix);
va_end(args);
if (!env.fault_occurred) {
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_decompose.c xmlrpc-c-1.09.00/src/xmlrpc_decompose.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_decompose.c 2006-09-20 16:34:49.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_decompose.c 2008-10-12 21:14:32.000000000 +0900
@@ -1022,14 +1022,15 @@
static void
createDecompTree(xmlrpc_env * const envP,
const char * const format,
- va_list args,
+ va_list *__args,
struct decompTreeNode ** const decompRootPP) {
-
+ va_list ap;
+ va_copy (ap, *__args);
const char * formatCursor;
struct decompTreeNode * decompRootP;
formatCursor = &format[0];
- createDecompTreeNext(envP, &formatCursor, &args, &decompRootP);
+ createDecompTreeNext(envP, &formatCursor, &ap, &decompRootP);
if (!envP->fault_occurred) {
if (*formatCursor != '\0')
xmlrpc_faultf(envP, "format string '%s' has garbage at the end: "
@@ -1051,15 +1052,16 @@
xmlrpc_value * const valueP,
bool const oldstyleMemMgmt,
const char * const format,
- va_list args) {
-
+ va_list *__args) {
+ va_list ap;
+ va_copy (ap, *__args);
struct decompTreeNode * decompRootP;
XMLRPC_ASSERT_ENV_OK(envP);
XMLRPC_ASSERT_VALUE_OK(valueP);
XMLRPC_ASSERT(format != NULL);
- createDecompTree(envP, format, args, &decompRootP);
+ createDecompTree(envP, format, &ap, &decompRootP);
if (!envP->fault_occurred) {
decomposeValueWithTree(envP, valueP, oldstyleMemMgmt, decompRootP);
@@ -1074,11 +1076,12 @@
xmlrpc_decompose_value_va(xmlrpc_env * const envP,
xmlrpc_value * const valueP,
const char * const format,
- va_list args) {
-
+ va_list *__args) {
+ va_list ap;
+ va_copy (ap, *__args);
bool const oldstyleMemMgtFalse = false;
- decomposeValue(envP, valueP, oldstyleMemMgtFalse, format, args);
+ decomposeValue(envP, valueP, oldstyleMemMgtFalse, format, &ap);
}
@@ -1092,7 +1095,7 @@
va_list args;
va_start(args, format);
- xmlrpc_decompose_value_va(envP, value, format, args);
+ xmlrpc_decompose_value_va(envP, value, format, &args);
va_end(args);
}
@@ -1102,11 +1105,12 @@
xmlrpc_parse_value_va(xmlrpc_env * const envP,
xmlrpc_value * const valueP,
const char * const format,
- va_list args) {
-
+ va_list *__args) {
+ va_list ap;
+ va_copy (ap, *__args);
bool const oldstyleMemMgmtTrue = true;
- decomposeValue(envP, valueP, oldstyleMemMgmtTrue, format, args);
+ decomposeValue(envP, valueP, oldstyleMemMgmtTrue, format, &ap);
}
@@ -1120,6 +1124,6 @@
va_list args;
va_start(args, format);
- xmlrpc_parse_value_va(envP, value, format, args);
+ xmlrpc_parse_value_va(envP, value, format, &args);
va_end(args);
}
Only in xmlrpc-c-1.09.00/src: xmlrpc_decompose.c~
Binary files xmlrpc-c-1.09.00.orig/src/xmlrpc_decompose.o and xmlrpc-c-1.09.00/src/xmlrpc_decompose.o differ
Binary files xmlrpc-c-1.09.00.orig/src/xmlrpc_expat.o and xmlrpc-c-1.09.00/src/xmlrpc_expat.o differ
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_parse.c xmlrpc-c-1.09.00/src/xmlrpc_parse.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_parse.c 2006-09-04 06:52:31.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_parse.c 2008-10-12 21:14:54.000000000 +0900
@@ -76,7 +76,7 @@
va_list args;
va_start(args, format);
- xmlrpc_set_fault_formatted_v(envP, XMLRPC_PARSE_ERROR, format, args);
+ xmlrpc_set_fault_formatted_v(envP, XMLRPC_PARSE_ERROR, format, &args);
va_end(args);
}
最近のコメント