Компиляция vsftpd 3.0.0 не удалась

Я недавно пытался скомпилировать 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. Поиск в Google показал мне, что ошибка воспроизводима, но решение не было отправлено.

Моя версия ядра Linux 2.6.32-5-amd64 и я использую версию GCC 4.4.5 (Debian 4.4.5-8)

Любые идеи приветствуются. (Если вам нужна дополнительная информация, не стесняйтесь спрашивать)

2 ответа

Решение

По крайней мере, на 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 выпустить компиляцию, теперь я понимаю, работают ли созданные двоичные файлы правильно или нет.

Я использую SLES 11 sp1 64bit, ядро ​​2.6.32, gcc ver 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
Другие вопросы по тегам