FreeBSD 10.0的strnvis大坑

先吐槽自己,这么多年了,这里都成了遗弃之地了。上次写博客还是未婚小青年,这个时候已经是娃她爸好几个月了。
最近遇到个大坑,记录下。
自用一台小服务器HP N40L,用了FreeBSD+ZFS做文件服务器,当然还有跑了几个重要的服务:unbound+dnssec,为什么,你懂得。还有obfuscated ssh+privoxy,同理。以前一直用的是FreeBSD 9.1-release,很好,但是,这个服务器的启动盘,我用了一块老的不行的靠重新量产救回来过一次的KingMax超棒作为启动盘和根文件系统,也一直没有问题。但是,前面某天为了某些原因,拉了次闸,然后我在用的时候,发现挂载的好好的NFS不见了。于是,看了下启动信息,是挂载根文件系统失败。
最近因为某些原因,把自己的家用服务器从FreeBSD 9.1升级到了10.0,然后,然后就踩到了大坑。原来跑的好好的obfuscate-ssh重新编译什么的都正常,但是一跑就core dump。直接gdb看了下,直指一个库函数调用strnvis,这个函数,然后,仔细看了看代码,我去……雷翻的节奏啊,这也行啊?

这个函数,Linux上默认是没有的,Gentoo上是安装了libbsd之后会有,手册中给出的原型是:

1
2
int
strnvis(char *dst, const char *src, size_t size, int flag);

所以,应该是为了在所有系统上都能用,obfuscated ssh自带了一个实现,在供未提供此函数的系统上使用。在openbsd-compat的vis.h中原型声明如下:

1
2
int     strnvis(char *, const char *, size_t, int)
                __attribute__ ((__bounded__(__string__,1,3)));

在FreeBSD 9.1上是没有vis函数提供的,所以,程序应该用了这个版本。目前,一切都很和谐。

但是,FreeBSD在与时俱进目前看来9.2/10.0是提供了这个函数的,core dump指示的段错误就是在这个函数里,专程去看了代码,应该没什么问题。
但是它的原型竟然是:

1
2
int
     strnvis(char *dst, size_t dlen, const char *src, int flag);

搞笑的是,这个man手册中,就在这个函数中间,竟然有这样的字样:整体是这个样子:

int
:mdoc warning: .Nx: Unknown NetBSD version `7.0′ (#516)
strnvis(char *dst, size_t dlen, const char *src, int flag);

根据头文件前面的注释,目测此坑来自于NetBSD?

因为FreeBSD本身自带的openssh在没有改代码的情况下正常,我就想改configrue的脚本来解决,但是改来改去,未果,这个函数就是要链接到系统提供的版本。
在configure之后,修改config.h中的HAVE_STRNVIS和HAVE_VIS_H两个宏未0也未能得逞。

最后,直接修改代码中对strnis调用的地方了事……

自己对BSD算不上熟,auto-tools也是半熟……没找到通过配置让其优先采用openbsd-compat目录中的版本的办法,在此求教。

最后,再次吐槽:libc中都搞出同名不同原型的函数,还能不能好好玩耍了!!!!!

Leave a Comment

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据