<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>54786</bug_id>
          
          <creation_ts>2025-06-11 11:55:29 +0300</creation_ts>
          <short_desc>percona-xtrabackup80: Аварийный останов (assertion failed) при неправильной длине ключа для расшифрования</short_desc>
          <delta_ts>2025-06-16 11:09:12 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>percona-xtrabackup80</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>NOTABUG</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Artem Varaksa">varaksaaa</reporter>
          <assigned_to name="Alexei Takaseev">taf</assigned_to>
          <cc>taf</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>267059</commentid>
    <comment_count>0</comment_count>
    <who name="Artem Varaksa">varaksaaa</who>
    <bug_when>2025-06-11 11:55:29 +0300</bug_when>
    <thetext>Шаги
====

Настроить MySQL и попробовать создать зашифрованный, а затем расшифровать бекап с неправильной длиной ключа (32, нужно 16):

# LENGTH=32 &amp;&amp; \
  set -o pipefail &amp;&amp; \
  apt-get install -y percona-xtrabackup80 &amp;&amp; \
  rm -rvf /var/lib/mysql/ &amp;&amp; apt-get install -y --reinstall MySQL perl-DBD-mysql &amp;&amp; \
  chkconfig mysqld on &amp;&amp; \
  systemctl enable --now mysqld ; sleep 2 ; systemctl status --no-pager mysqld &amp;&amp; \
  control mysqld-chroot disabled &amp;&amp; systemctl restart mysqld ; sleep 2 ; systemctl status --no-pager mysqld &amp;&amp; \
  echo create database test | mysql &amp;&amp; \
  mkdir -p /data/backups &amp;&amp; \
  key=&quot;$(openssl rand -base64 -hex &quot;$LENGTH&quot;)&quot; &amp;&amp; \
  xtrabackup --backup --encrypt=AES256 --encrypt-key=&quot;${key}&quot; --datadir=/var/lib/mysql/db --target-dir=/data/backups/encrypt; \
  for i in $(find /data/backups/encrypt/ -iname &quot;*\.xbcrypt&quot;); do xbcrypt -d --encrypt-key=&quot;${key}&quot; --encrypt-algo=AES256 &lt; $i &gt; $(dirname $i)/$(basename $i .xbcrypt) &amp;&amp; rm -fv $i; done


Фактический результат
=====================

Создание резервной копии не успешное из-за неправильной длины ключа и программа выходит с 1, но не падает.

&gt; encryption: unable to set libgcrypt cipher key - User defined source 1 : Invalid key length

А расшифровка ещё и падает на assert:

&gt; encryption: unable to set libgcrypt cipher key - User defined source 1 : Invalid key length
&gt; Assertion &quot;0&quot; failed at /usr/src/RPM/BUILD/percona-xtrabackup80-8.0.35/storage/innobase/xtrabackup/src/ds_decrypt.cc:48
&gt; Аварийный останов


Ожидаемый результат
===================

Нет падения на assert.


Воспроизводимость
=================

Воспроизводится на виртуальных машинах:

[sisyphus] ALT Server 11.0 beta20250213 x86_64
percona-xtrabackup80-8.0.35-alt5.x86_64

[p11] ALT Server 11.0 beta20250213 x86_64
percona-xtrabackup80-8.0.35-alt4.x86_64</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>267126</commentid>
    <comment_count>1</comment_count>
    <who name="Alexei Takaseev">taf</who>
    <bug_when>2025-06-12 07:48:20 +0300</bug_when>
    <thetext>Ошибка в тесте, в конструкции LENGTH=32 &amp;&amp; key=&quot;$(openssl rand -base64 -hex &quot;$LENGTH&quot;)&quot; в переменной $key будет значение длинной 64 символа (то есть 512 бит, поэтому и сообщение о длине ключа). Если же в LENGTH указать 16, то значение будет 32 символа (256 бит) и приведенный выше скрипт отрабатывает успешно.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>267223</commentid>
    <comment_count>2</comment_count>
    <who name="Artem Varaksa">varaksaaa</who>
    <bug_when>2025-06-16 10:23:30 +0300</bug_when>
    <thetext>Да, ошибка сделана специально. Проблема в разнице поведение шифрования и дешифрования - при шифровании хоть и отображается та же ошибка (ожидаемо), программа не падает с аварийным остановом.

Аварийный останов / assert предполагает ситуацию, которая не была предусмотрена в программе, но исходя из отображаемой ошибки, она предусмотрена - но код её обработки почему-то не выходит сразу из программы, поэтому позже и падает на assert.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>267233</commentid>
    <comment_count>3</comment_count>
    <who name="Alexei Takaseev">taf</who>
    <bug_when>2025-06-16 11:09:12 +0300</bug_when>
    <thetext>(Ответ для Artem Varaksa на комментарий #2)
&gt; Да, ошибка сделана специально. Проблема в разнице поведение шифрования и
&gt; дешифрования - при шифровании хоть и отображается та же ошибка (ожидаемо),
&gt; программа не падает с аварийным остановом.
&gt; 
&gt; Аварийный останов / assert предполагает ситуацию, которая не была
&gt; предусмотрена в программе, но исходя из отображаемой ошибки, она
&gt; предусмотрена - но код её обработки почему-то не выходит сразу из программы,
&gt; поэтому позже и падает на assert.

Это ожидаемое поведение, заложенное разработчиками.</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>