2

最近vsftpd3.0.0をコンパイルしようとしましたが、次のコンパイルエラーが原因で失敗します。

gcc -c seccompsandbox.c -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wall -W -               Wshadow -Werror -Wformat-security -D_FORTIFY_SOURCE=2  -idirafter dummyinc
seccompsandbox.c:63: error: ‘O_DIRECTORY’ undeclared here (not in a function)
seccompsandbox.c:63: error: ‘O_CLOEXEC’ undeclared here (not in a function)
make: *** [seccompsandbox.o] Error 1

ソースと環境にあまり詳しくないので、これを修正する方法がわかりません。新しいseccompフィルターサンドボックスと関係があると思います。グーグルで検索すると、エラーは再現可能であることがわかりましたが、解決策は提出されませんでした。

私のLinuxカーネルバージョンは2.6.32-5-amd64、gccバージョンを使用しています4.4.5 (Debian 4.4.5-8)

どんなアイデアでも大歓迎です。(追加情報が必要な場合は、遠慮なくお問い合わせください)

4

2 に答える 2

4

少なくともDebianではO_DIRECTORYO_CLOEXECが定義されている場合_GNU_SOURCEにのみ定義されます。

_GNU_SOURCE現在のvsftpリリースでは特定のモジュールに設定されていますが、一般的には設定されていません。

回避策として、次のパッチを使用できます。

diff -Naur vsftpd-3.0.0.orig/seccompsandbox.c vsftpd-3.0.0/seccompsandbox.c
--- vsftpd-3.0.0.orig/seccompsandbox.c       2012-04-05 00:41:51.000000000 +0200
+++ vsftpd-3.0.0/seccompsandbox.c  2012-06-30 15:25:52.000000000 +0200
@@ -11,7 +11,7 @@
 #include "seccompsandbox.h"

 #if defined(__linux__) && defined(__x86_64__)
-
+#define _GNU_SOURCE
 #include "session.h"
 #include "sysutil.h"
 #include "tunables.h

免責事項:このパッチを適用すると、現在のvsftpリリースがコンパイルされます。作成されたバイナリが正しく機能するかどうかがわかりました。

于 2012-06-30T13:40:59.500 に答える
0

SLES 11 sp1 64ビット、カーネル2.6.32、gccver4.3.4を使用しています。FORTIFY_SOURCEを変更または削除しても違いはなく、同じエラーが発生します。私はACプログラマーではありません-フラグO_DIRECTORYとO_CLOEXECはseccompsandbox.cにあります:

static const int kOpenFlags =
    O_CREAT|O_EXCL|O_APPEND|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_LARGEFILE;

それらを削除するとコンパイルされますが、それは本当に自信を持って私を満たします...。

vrf_findlibs.shも壊れています。スクリプトを再調整して、最初に64ビットバージョンのlibcapを見つけるか、32ビットコピーを選択し続ける必要がありました(-lcapも機能しない、見つからないと言う):

# Look for libcap (capabilities)
if locate_library /lib64/libcap.so; then
  echo "/lib64/libcap.so.2";
elif locate_library /lib/libcap.so.1; then
  echo "/lib/libcap.so.1";
elif locate_library /lib/libcap.so.2; then
  echo "/lib/libcap.so.2";
else
  locate_library /usr/lib/libcap.so && echo "-lcap";
  locate_library /lib/libcap.so && echo "-lcap";
  locate_library /lib64/libcap.so && echo "-lcap";
fi
于 2012-06-29T00:14:55.663 に答える