man:MANPATH环境变量列表太长(manpath列表太长)

问题描述 投票:0回答:1

当有一个过长的MANPATH env-vars时,我最终遇到了这个错误的问题:

$> man <any command>
man: manpath list too long

为了弄清楚manpath列表的时间太长,我创建了这个小脚本:

#!/bin/bash
export MANPATH=
for i in $(seq 50 10000)
do
    export MANPATH=/usr:$MANPATH
    man -k gcc > /dev/null
    [ $? -ne 0 ] && echo "$i ${#MANPATH}" && exit 0
done

似乎它在接近500的${#MANPATH}时破裂了。

另外man -d不会给我任何我可以使用的信息...... :(

我从未听说过(也没有发现)对env-vars中条目数量的限制(除了环境变量的最大长度,我远离它)。

这有什么问题吗?最好是非root修复;)

我正在运行Debian 9.6。

编辑:这是上游和修复报告!

man
1个回答
1
投票

基于manp.c starting at line 786

        else if (sscanf (bp, "MANDATORY_MANPATH %511s", key) == 1)
            add_mandatory (key);    
        else if (sscanf (bp, "MANPATH_MAP %511s %511s",
             key, cont) == 2) 
            add_manpath_map (key, cont);
        else if ((c = sscanf (bp, "MANDB_MAP %511s %511s",
                      key, cont)) > 0) 
            add_mandb_map (key, cont, c, user);
        else if ((c = sscanf (bp, "DEFINE %511s %511[^\n]",
                      key, cont)) > 0) 
            add_def (key, cont, c, user);
        else if (sscanf (bp, "SECTION %511[^\n]", cont) == 1)
            add_sections (cont, user);
        else if (sscanf (bp, "SECTIONS %511[^\n]", cont) == 1)
            /* Since I keep getting it wrong ... */
...

我说阈值是511个字符。有趣的是,有一条评论说应该修复。

        /* TODO: would like a (limited) replacement for sscanf()
         * here that allocates its own memory. At that point check
         * everything that sprintf()s manpath et al!
         */ 

参考

© www.soinside.com 2019 - 2024. All rights reserved.