Libelektra: testshell_markdown_tutorial_crypto: falha

Criado em 26 nov. 2019  ·  17Comentários  ·  Fonte: ElektraInitiative/libelektra

Etapas para reproduzir o problema

Construa a libelektra enquanto possui os arquivos de desenvolvimento gpgme. ( gpgme-devel no fedora)
eu usei

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" ..

mas nem tudo é relevante para o problema.

make run_all

resultado esperado

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

Resultado atual

Parece que há um problema com / tmp em tmpfs ou similar? Eu recebo o problema no fedora e também no buster debian (no 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
————————————————————————————————————————————————————————————————

Informação do sistema

  • Versão Elektra: mestre
  • Sistema operacional: Fedora
  • Versões de outro software relevante?

Mais arquivos de log e saída

bug work in progress

Comentários muito úteis

Esse problema pode ocorrer com mais frequência, eu acho. Nós até recomendamos na documentação do fcrypt remontar /tmp em um disco RAM. Portanto, na verdade, recomendamos acionar esse erro imediatamente.

Vou tentar fornecer uma correção adequada.

Vou simplesmente configurar um TMPDIR diferente explicitamente para as compilações. Se o problema ocorrer novamente nos sistemas de destino, podemos reabri-los e encontrar uma solução melhor.

Isso também é bom como uma solução alternativa para os servidores de compilação.

Todos 17 comentários

@ markus2330 isso é bem-sucedido no buildserver. Isso é um obstáculo para você? Isso seria refletido nos logs do lançamento ( kdb run_all -v > ~elektra/$VERSION/run_all 2>&1 ).

EDITAR: posso tentar fazer esta parte em a7 / v2, pois talvez só falhe no meu cenário com o fedora como host (e debian apenas no docker).

Não, definitivamente não é um empecilho. Provavelmente é simplesmente porque algum arquivo temporário ainda existe de uma execução anterior ou o # 2957 não foi completamente corrigido, afinal.

Esperançosamente, @ petermax2 terá tempo de consertá-lo antes de 0.9.2: wink:

@mpranj você precisa de ajuda com as notas de lançamento ou algo mais?

Não consigo reproduzir o problema ao compilar 2bc994ae8b3f3a04396303ece106ea563764e490 do zero usando o comando cmake acima.

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

Talvez seu diretório de construção esteja quebrado de alguma forma. Você poderia tentar compilar e testar com um novo diretório de compilação (vazio)?

@ petermax2 obrigado por verificar isso tão rapidamente. Tentei várias vezes no meu sistema host (fedora) e também em um contêiner docker buster debian. Eu também limpei o diretório de compilação muitas vezes.

Sempre é possível que seja apenas um problema para mim. Vou verificar novamente mais tarde!

Hm estranho! Acho que usei um Debian: container

O problema pode ser reproduzido no 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)

Talvez este não seja um problema específico de cripto-tutorial. Eu tenho que investigar.

kdb gen-gpg-testkey não pode ser encontrado. Este problema está relacionado ao nº 3246 (KDB_EXEC_PATH).

EDIT: A análise só é válida para testshell_markdown_tutorial_crypto . Não verifiquei os outros testes até agora.

Obrigado por dar uma olhada neste problema!

Não vi os outros testes falharem tbh. Tem certeza de que é o mesmo problema? Eu nem mesmo trabalhei com o kdb instalado, apenas executei o ctest com make run_all.

No longo prazo, adicionaremos algumas imagens da docker do Fedora também (# 3227), para detectar algo assim antes.

Tem certeza de que é o mesmo problema?

Não, provavelmente vários problemas diferentes.

A longo prazo, adicionaremos algumas imagens do dock do fedora também

Muito boa ideia!

Eu editei minha postagem anterior para esclarecer o que eu quis dizer com minha análise.

O problema não é isolado da minha máquina. O teste falha porque a seguinte chamada rename () falha:
https://github.com/ElektraInitiative/libelektra/blob/263cbe69686a9f087204a7f3660b007d1de22da2/src/plugins/fcrypt/fcrypt.c#L231

A razão é que / tmp é um ponto de montagem separado no Fedora por padrão, o que não era o caso do Debian. Portanto, o arquivo não pode ser renomeado em diferentes pontos de montagem.

Eu verifiquei que esse é o problema aplicando um patch (muito sujo). Eu proporia mantê-lo consistente com a implementação do resolvedor e colocar o arquivo temporário no mesmo diretório do arquivo original.

@ petermax2 o que você acha e você teria tempo para consertar com um patch adequado?

O diretório tmp usado por fcrypt pode ser definido através da configuração do plugin.

fcrypt usa a opção de configuração fcrypt / tmpdir para gerar caminhos para arquivos temporários durante a criptografia e descriptografia. Se nenhuma opção de configuração for fornecida, fcrypt tentará usar a variável de ambiente TMPDIR. Se TMPDIR não for definido no ambiente, / tmp será usado como diretório padrão.

(_Fonte_: documentação do plug -

A maneira mais fácil de mitigar trabalhos de construção semelhantes ao Fedora seria usar outro diretório. No servidor de construção, o diretório de construção local pode ser usado. O que você acha?

@ petermax2 o que você acha e você teria tempo para consertar com um patch adequado?

Posso alocar algum tempo livre nos finais de semana, mas o que você tem em mente como solução adequada?

Posso alocar algum tempo livre nos finais de semana, mas o que você tem em mente como solução adequada?

Não há necessidade de engenharia excessiva em nada. Como sugeri, colocaria o arquivo temporário no mesmo diretório do arquivo de destino. Esta é a maneira que resolver faz ao submeter alterações, então seria um tanto consistente.

Eu também estou bem em apenas configurar um TMPDIR diferente para as compilações. Posso implementar essa mudança sozinho.

Iremos com tudo o que você sugerir aqui.

De renomear docu :

[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]

Editar: falha com sudo com o mesmo erro:

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

Uma solução simplista seria substituir a operação rename por uma cópia + remoção.

Vou simplesmente configurar um TMPDIR diferente explicitamente para as compilações. Se o problema ocorrer novamente nos sistemas de destino, podemos reabri-los e encontrar uma solução melhor.

Esse problema pode ocorrer com mais frequência, eu acho. Nós até recomendamos na documentação do fcrypt remontar /tmp em um disco RAM. Portanto, na verdade, recomendamos acionar esse erro imediatamente.

Vou tentar fornecer uma correção adequada.

Vou simplesmente configurar um TMPDIR diferente explicitamente para as compilações. Se o problema ocorrer novamente nos sistemas de destino, podemos reabri-los e encontrar uma solução melhor.

Isso também é bom como uma solução alternativa para os servidores de compilação.

Muito obrigado por investigar isso!

Uma solução simplista seria substituir a operação de renomeação por uma cópia + remoção.

Não para substituir o código, mas para fazer isso se a renomeação falhar. (E também para destruir o arquivo de origem, nesse caso.) Então as pessoas sem disco RAM em / tmp têm velocidade e pessoas com disco RAM em / tmp têm mais segurança.

Esta página foi útil?
0 / 5 - 0 avaliações