Libelektra: testshell_markdown_tutorial_crypto:失败

创建于 2019-11-26  ·  17评论  ·  资料来源: ElektraInitiative/libelektra

重现问题的步骤

在拥有gpgme开发文件的同时构建libelektra。 (在fedora上gpgme-devel
我用了

cmake -DBUILD_DOCUMENTATION=ON -DBINDINGS="ALL" -DBUILD_SHARED=ON -DBUILD_STATIC=ON -DBUILD_FULL=ON -DENABLE_COVERAGE=OFF -DENABLE_OPTIMIZATIONS=ON -DENABLE_DEBUG=ON -DENABLE_LOGGER=OFF -DBUILD_STATIC=ON -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DKDB_DB_SYSTEM="$SYSTEM_DIR" DCMAKE_INSTALL_PREFIX=./releaseInstallDir -DPLUGINS="ALL" -DTOOLS="ALL" ..

但并非一切都与问题有关。

make run_all

预期结果

Test #215: testshell_markdown_tutorial_crypto ........... Passed    2.58 sec

实际结果

似乎tmpfs上的/ tmp或类似文件存在问题? 我在fedora和Debian Buster(在docker)中也遇到了问题。

249/262 Test #215: testshell_markdown_tutorial_crypto ...........***Failed    2.58 sec
Input: /home/mpranj/workspace/libelektra/doc/tutorials/crypto.md
kdb mount test.ini user/tests ini
kdb set user/tests/password 1234
kdb file user/tests/password | xargs cat
kdb rm user/tests/password
kdb umount user/tests
kdb mount test.ini user/tests fcrypt "encrypt/key=$(kdb gen-gpg-testkey)" ini
kdb set user/tests/password 1234

ERROR - RET:
Return value “5” does not match “0”

kdb file user/tests/password | xargs cat

ERROR - RET:
Return value “123” does not match “0”

kdb rm user/tests/password

ERROR - RET:
Return value “11” does not match “0”

kdb umount user/tests
kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey)" ini
kdb set user/tests/password 1234

ERROR - RET:
Return value “5” does not match “0”

kdb file user/tests/password | xargs cat

ERROR - RET:
Return value “123” does not match “0”

kdb rm user/tests/password

ERROR - RET:
Return value “11” does not match “0”

kdb umount user/tests
kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey),encrypt/key=$(kdb gen-gpg-testkey)" ini
kdb set user/tests/password 1234

ERROR - RET:
Return value “5” does not match “0”

kdb file user/tests/password | xargs cat

ERROR - RET:
Return value “123” does not match “0”

kdb rm user/tests/password

ERROR - RET:
Return value “11” does not match “0”

kdb umount user/tests
kdb mount test.ini user/tests crypto_gcrypt "crypto/key=$(kdb gen-gpg-testkey)" base64 ini
kdb meta-set user/tests/password crypto/encrypt 1
kdb set user/tests/password 1234
kdb set user/tests/unencrypted "I am not encrypted"
kdb file user/tests/password | xargs cat
kdb meta-set user/tests/password crypto/encrypt 0
kdb file user/tests/password | xargs cat
kdb rm user/tests/unencrypted
kdb rm user/tests/password
kdb umount user/tests
shell_recorder /tmp/tmp.FLYIzi6Q4K RESULTS: 31 test(s) done 9 error(s).

—— Protocol ————————————————————————————————————————————————————
CMD: kdb mount test.ini user/tests ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 0
STDOUT: Create a new key user/tests/password with string "1234"

CMD: kdb file user/tests/password | xargs cat
RET: 0
STDOUT: password=1234

CMD: kdb rm user/tests/password
RET: 0

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests fcrypt "encrypt/key=$(kdb gen-gpg-testkey)" ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 5
=== FAILED return value does not match expected pattern 0
STDERR: Sorry, module fcrypt issued the error C01100:
Resource: Renaming file /tmp/test.ini.2110573:1574783987.412609.tmpZJttxQ to /home/mpranj/.config/test.ini.2110573:1574783987.412609.tmp failed. Reason: Invalid cross-device link
ERROR: C01100

CMD: kdb file user/tests/password | xargs cat
RET: 123
=== FAILED return value does not match expected pattern 0
STDERR: cat: /home/mpranj/.config/test.ini: No such file or directory

CMD: kdb rm user/tests/password
RET: 11
=== FAILED return value does not match expected pattern 0
STDERR: Did not find the key

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey)" ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 5
=== FAILED return value does not match expected pattern 0
STDERR: Sorry, module fcrypt issued the error C01100:
Resource: Renaming file /tmp/test.ini.2110783:1574783987.564306.tmpRJuvgG to /home/mpranj/.config/test.ini.2110783:1574783987.564306.tmp failed. Reason: Invalid cross-device link
ERROR: C01100

CMD: kdb file user/tests/password | xargs cat
RET: 123
=== FAILED return value does not match expected pattern 0
STDERR: cat: /home/mpranj/.config/test.ini: No such file or directory

CMD: kdb rm user/tests/password
RET: 11
=== FAILED return value does not match expected pattern 0
STDERR: Did not find the key

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey),encrypt/key=$(kdb gen-gpg-testkey)" ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 5
=== FAILED return value does not match expected pattern 0
STDERR: Sorry, module fcrypt issued the error C01100:
Resource: Renaming file /tmp/test.ini.2111010:1574783987.747497.tmpti3bSR to /home/mpranj/.config/test.ini.2111010:1574783987.747497.tmp failed. Reason: Invalid cross-device link
ERROR: C01100

CMD: kdb file user/tests/password | xargs cat
RET: 123
=== FAILED return value does not match expected pattern 0
STDERR: cat: /home/mpranj/.config/test.ini: No such file or directory

CMD: kdb rm user/tests/password
RET: 11
=== FAILED return value does not match expected pattern 0
STDERR: Did not find the key

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests crypto_gcrypt "crypto/key=$(kdb gen-gpg-testkey)" base64 ini
RET: 0

CMD: kdb meta-set user/tests/password crypto/encrypt 1
RET: 0

CMD: kdb set user/tests/password 1234
RET: 0
STDOUT: Set string to "1234"

CMD: kdb set user/tests/unencrypted "I am not encrypted"
RET: 0
STDOUT: Create a new key user/tests/unencrypted with string "I am not encrypted"

CMD: kdb file user/tests/password | xargs cat
RET: 0
STDOUT: unencrypted=I am not encrypted
#<strong i="19">@META</strong> crypto/encrypt = 1
password=@BASE64IyFjcnlwdG8wMBEAAACCBjEzmVhqufXSsgK4VPRDUC9GyQxBhocVbgZwimonK+xHaRCSX/blNDSVdIoSRg0n

CMD: kdb meta-set user/tests/password crypto/encrypt 0
RET: 0

CMD: kdb file user/tests/password | xargs cat
RET: 0
STDOUT: unencrypted=I am not encrypted
#<strong i="20">@META</strong> crypto/encrypt = 0
password=1234

CMD: kdb rm user/tests/unencrypted
RET: 0

CMD: kdb rm user/tests/password
RET: 0

CMD: kdb umount user/tests
RET: 0
————————————————————————————————————————————————————————————————

系统信息

  • Elektra版本:大师
  • 操作系统:Fedora
  • 其他相关软件的版本?

更多日志文件和输出

bug work in progress

最有用的评论

我认为,这个问题可能会更经常发生。 我们甚至建议在fcrypt文档中将/tmp重新挂载到RAM磁盘。 因此,我们实际上建议立即触发此错误。

我将尝试提供适当的修复。

我将简单地为构建显式配置其他TMPDIR。 如果问题再次出现在目标系统上,我们可以重新打开并找到更好的解决方案。

作为构建服务器的变通办法,这也很好。

所有17条评论

@ markus2330,这在kdb run_all -v > ~elektra/$VERSION/run_all 2>&1 )中。

编辑:我可以尝试在a7 / v2上执行此部分,因为它可能仅在以fedora作为主机的情况下失败(并且仅在docker中为debian)。

不,这绝对不是风口浪尖。 这很可能是因为以前的运行中仍然有一些临时文件,或者#2957毕竟还没有完全固定。

希望@ petermax2有时间在0.9.2之前修复它:wink:

@mpranj您是否需要发行说明或其他帮助?

使用上方的cmake命令从头开始构建2bc994ae8b3f3a04396303ece106ea563764e490时,我无法重现该问题。

    Start 188: testshell_markdown_tutorial_crypto 
222/235 Test #188: testshell_markdown_tutorial_crypto ...........   Passed    3.16 sec

也许您的构建目录以某种方式被破坏了。 您能否尝试使用新的(空)构建目录进行编译和测试?

@ petermax2感谢您如此迅速地进行检查。 我在主机系统(fedora)以及debian buster docker容器上尝试了几次。 我还多次清理了构建目录。

这总是有可能只是我的问题。 稍后再检查!

嗯,奇怪! 我想我昨天使用了Debian:stable容器进行构建和测试。 我可以在晚上与Fedora再试一次。 目前,我没有太多时间进行故障排除,但是我将快速进行查找。

这个问题在Fedora下可以重现。

The following tests FAILED:
 41 - testshell_markdown_base64 (Failed)
 56 - testshell_markdown_csvstorage (Failed)
 76 - testshell_markdown_iconv (Failed)
 78 - testshell_markdown_ini (Failed)
 93 - testshell_markdown_mini (Failed)
116 - testmod_resolver (Failed)
181 - testshell_markdown_tutorial_crypto (Failed)

也许这不是特定于密码教程的问题。 我要调查

找不到kdb gen-gpg-testkey 。 此问题与#3246(KDB_EXEC_PATH)有关。

编辑:分析仅对testshell_markdown_tutorial_crypto 。 到目前为止,我没有检查其他测试。

感谢您关注此问题!

我还没有看到其他测试未能通过。 您确定这是同样的问题吗? 我什至没有使用已安装的kdb,我只是使用make run_all运行了ctest。

从长远来看,我们还将添加一些fedora docker映像(#3227),以更早地捕获类似的内容。

您确定这是同样的问题吗?

不,可能有几个不同的问题。

从长远来看,我们还将添加一些Fedora Docker映像

很好的主意!

我从前开始编辑帖子,以阐明我对分析的含义。

该问题并非孤立于我的机器。 测试失败,因为以下rename()调用失败:
https://github.com/ElektraInitiative/libelektra/blob/263cbe69686a9f087204a7f3660b007d1de22da2/src/plugins/fcrypt/fcrypt.c#L231

原因是默认情况下/ tmp是Fedora上的一个单独的挂载点,而Debian并非如此。 因此,无法跨不同的安装点重命名该文件。

我已经通过应用(非常脏)的补丁程序验证了这是问题所在。 我建议使它与解析器实现保持一致,并将临时文件放置在与原始文件相同的目录中。

@ petermax2您怎么看?您是否有时间用适当的补丁程序对其进行修复?

可以通过插件配置来设置fcrypt使用的tmp目录。

fcrypt使用配置选项fcrypt / tmpdir在加密和解密期间为临时文件生成路径。 如果未提供此类配置选项,则fcrypt将尝试使用环境变量TMPDIR。 如果在环境中未设置TMPDIR,则/ tmp用作默认目录。

(_Source_:插件文档

减轻类似Fedora的构建作业的最简单方法是使用另一个目录。 在构建服务器上,可以使用本地构建目录。 你有什么感想?

@ petermax2您怎么看?您是否有时间用适当的补丁程序对其进行修复?

我可以在周末分配一些空闲时间,但是作为一个合适的解决方案,您有什么想法呢?

我可以在周末分配一些空闲时间,但是作为一个合适的解决方案,您有什么想法呢?

无需过度设计任何东西。 正如我建议的那样,我会将临时文件放在与目标文件相同的目录中。 提交更改时, resolver就是这种方式,因此在某种程度上是一致的。

我也可以只为构建配置一个不同的TMPDIR。 我可以自己执行该更改。

无论您在这里提出什么建议,我们都会继续进行。

从重命名文件

[EXDEV]
[CX] [Option Start] The links named by new and old are on different file systems and the implementation does not support links between file systems. [Option End]

编辑:失败与sudo与相同的错误:

213: CMD: kdb set user/tests/password 1234
213: RET: 5
213: === FAILED return value does not match expected pattern 0
213: STDERR: Sorry, module fcrypt issued the error C01100:
213: Resource: Renaming file /tmp/test.ini.571145:1586371945.946855.tmpHdGEMt to /root/.config/test.ini.571145:1586371945.946855.tmp failed. Reason: Invalid cross-device link
213: ERROR: C01100

一个简单的解决方案是将rename操作替换为copy + remove。

我将简单地为构建显式配置其他TMPDIR。 如果问题再次出现在目标系统上,我们可以重新打开并找到更好的解决方案。

我认为,这个问题可能会更经常发生。 我们甚至建议在fcrypt文档中将/tmp重新挂载到RAM磁盘。 因此,我们实际上建议立即触发此错误。

我将尝试提供适当的修复。

我将简单地为构建显式配置其他TMPDIR。 如果问题再次出现在目标系统上,我们可以重新打开并找到更好的解决方案。

作为构建服务器的变通办法,这也很好。

非常感谢您的调查!

一个简单的解决方案是用复制+删除替换重命名操作。

不替换代码,而是在重命名失败时执行此操作。 (在这种情况下,也要切碎源文件。)这样,/ tmp上没有RAM磁盘的人就会有速度,而/ tmp上有RAM磁盘的人会具有更高的安全性。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

markus2330 picture markus2330  ·  4评论

markus2330 picture markus2330  ·  3评论

markus2330 picture markus2330  ·  3评论

dominicjaeger picture dominicjaeger  ·  3评论

sanssecours picture sanssecours  ·  3评论