2

我最近尝试编译 vsftpd 3.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_DIRECTORY,并且O_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,gcc 版本 4.3.4;更改或删除 FORTIFY_SOURCE 没有任何区别,得到相同的错误。我不是交流程序员 - 标志 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 回答