タグ別アーカイブ: inspircd

Ubuntu 11.10 64bitでInspircdをmakeしたときのエラーと脆弱性を回避する

普通に./configureとmakeとかすればいいのだけど、引っかかったところをメモ。

バージョンは、inspircd-1.2.8。
普通にコンパイルしようとすると以下のビルドエラーが出る。

        LINK:               inspircd
command_parse.o: In function `CommandParser::FindSym(void**, void*, std::stringconst&)':
command_parse.cpp:(.text+0x2a50): undefined reference to `dlsym'
command_parse.cpp:(.text+0x2a5c): undefined reference to `dlerror'
command_parse.o: In function `CommandParser::ReloadCommand(std::string, User*)':
command_parse.cpp:(.text+0x2d80): undefined reference to `dlclose'
command_parse.o: In function `CommandParser::LoadCommand(char const*)':
command_parse.cpp:(.text+0x3257): undefined reference to `dlopen'
command_parse.cpp:(.text+0x3271): undefined reference to `dlerror'
dynamic.o: In function `DLLManager::DLLManager(InspIRCd*, char const*)':
dynamic.cpp:(.text+0x68): undefined reference to `dlopen'
dynamic.cpp:(.text+0x82): undefined reference to `dlerror'
dynamic.o: In function `DLLManager::~DLLManager()':
dynamic.cpp:(.text+0xc9): undefined reference to `dlclose'
dynamic.o: In function `DLLManager::GetSymbol(void**, char const*)':
dynamic.cpp:(.text+0x130): undefined reference to `dlerror'
dynamic.cpp:(.text+0x147): undefined reference to `dlsym'
dynamic.cpp:(.text+0x153): undefined reference to `dlerror'
collect2: ld returned 1 exit status
make[1]: *** [inspircd] Error 1
make: *** [ircd] Error 2

./configure を実行後、以下のファイルを修正する必要がある。
./src/Makefike

修正前

        $(RUNCC) $(FLAGS)   -rdynamic -L. -o inspircd $(LDLIBS)  bancache.o base.o channelmanager.o channels.o cidr.o command_parse.o commands.o configreader.o cull_list.o dns.o dynamic.o filelogger.o hashcomp.o helperfuncs.o inspircd.o inspsocket.o inspstring.o listensocket.o logger.o mode.o modules.o server.o snomasks.o socket.o socketengine.o testsuite.o threadengine.o timer.o user_resolver.o usermanager.o userprocess.o users.o wildcard.o xline.o modes/modeclasses.a socketengine_epoll.o threadengine_pthread.o

修正後

        $(RUNCC) $(FLAGS)   -rdynamic -L. -o inspircd  bancache.o base.o channelmanager.o channels.o cidr.o command_parse.o commands.o configreader.o cull_list.o dns.o dynamic.o filelogger.o hashcomp.o helperfuncs.o inspircd.o inspsocket.o inspstring.o listensocket.o logger.o mode.o modules.o server.o snomasks.o socket.o socketengine.o testsuite.o threadengine.o timer.o user_resolver.o usermanager.o userprocess.o users.o wildcard.o xline.o modes/modeclasses.a socketengine_epoll.o threadengine_pthread.o $(LDLIBS) 

変わったところは、$(LDLIBS)の場所。
どうやら、gccの仕様変更で、リンクのコマンドオプションはオブジェクトよりも後にしなければならないらしい。
モジュールとかもその要領で変更する必要があるのがあるかも。なんか、LDLIBSに自分でライブラリ追加指定しても使ってなかったらリンクされないとかいう仕様になってるっぽいし、ちょっと不便。

あと、Inspircdには、セキュリティ上の問題点(脆弱性)が指摘されている。
JVNVU#212651 InspIRCd にメモリ破損の脆弱性

これについては、ここを参考に、./src/dns.cppを修正する必要がある。

修正前

                case DNS_QUERY_PTR:
                        o = 0;
                        q = 0;
                       while (q == 0 && i < length && o + 256 < 1023)

修正後

                case DNS_QUERY_PTR:
                        o = 0;
                        q = 0;
                       while (q == 0 && i >= 0 && i < length && o + 256 < 511)

iが0以下になったり、512以上になったりするということなのかな?