Bug 51874

Summary: Ошибка запаковки debuginfo если в исходниках есть квадратные скобки
Product: Sisyphus Reporter: Ivan A. Melnikov <iv>
Component: rpm-buildAssignee: placeholder <placeholder>
Status: NEW --- QA Contact: qa-sisyphus
Severity: major    
Priority: P5 CC: arseny, glebfm, imz, ldv, placeholder, vt
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
соберите этот спек чтобы воспроизвести проблему none

Description Ivan A. Melnikov 2024-10-29 17:09:01 MSK
Created attachment 17077 [details]
соберите этот спек чтобы воспроизвести проблему

При сборке одного проекта на go наткнулся на интересную проблему: часть сгенерированных исходников эта штука называет something[generated].go, а наш rpmbuild позже воспринимает квадратные скобки как glob.

Проще всего реализовать воспроизвести эту проблему с помощью приложенного spec-файла, который на моей системе не собирается со следующей ошибкой:

[...]
Creating bracket-test-debuginfo package
Processing files: bracket-test-debuginfo-0.1-alt1
error: File not found by glob: /tmp/.private/iv/RPM/TMP/bracket-test-buildroot/usr/src/debug/test[generated].c


RPM build errors:
    File not found by glob: /tmp/.private/iv/RPM/TMP/bracket-test-buildroot/usr/src/debug/test[generated].c
Comment 1 Ivan A. Melnikov 2024-10-29 17:10:00 MSK
> часть сгенерированных исходников эта штука называет something[generated].go

Оказывается эти исходники довольно сложно переименовать, наверное придётся отключить debuginfo пока это не исправленно.
Comment 2 Vitaly Chikunov 2024-10-30 02:16:05 MSK
Похоже это баг в логике build/files.c:processBinaryFile. Сначала определяется что fileURL это glob, по наличию ? * [ ], если glob, то он обрабатывается как glob (с экранированием символов через \, а если не glob, то обрабатывается как путь (без поддержки экранирования). То есть если добавить экранирование, то путь перестает быть glob и символы экранирования испортят путь.

И это должно относиться не только к debuginfo, а к любым файлам.
Comment 3 Vitaly Chikunov 2024-10-30 03:10:47 MSK
Я думаю правильным было бы изначально считать тот путь glob'ом. Но, просто отключить это уже нельзя из-за возможных неочевидных последствий.

Апстрим поменял логику в c10e2310e4c41a626b524ae71b3c4f87a29134b2, это огромный 
коммит. [Ссылающийся на коммит 4030062f2bf16d7a4540c78c1e61706f3810fe9b, которого нет (видимо rebase его потер).]

Другой вариант - придумать что-то ALT-specific.
Comment 4 Vitaly Chikunov 2024-10-30 04:30:08 MSK
> Другой вариант - придумать что-то ALT-specific.

RFC https://git.altlinux.org/tasks/361121/
Comment 5 Gleb F-Malinovskiy 2024-10-30 15:26:30 MSK
(In reply to Vitaly Chikunov from comment #4)
> RFC https://git.altlinux.org/tasks/361121/

В теории, наверное, было бы ещё удобнее если бы это делалось через %attr или что-то такое, чтобы можно было glob выключить и потом включить обратно.  Но пока что это, вроде, не нужно.

LGTM
Comment 6 Arseny Maslennikov 2024-10-30 15:40:03 MSK
(In reply to Vitaly Chikunov from comment #4)
> > Другой вариант - придумать что-то ALT-specific.

> RFC https://git.altlinux.org/tasks/361121/

Вдогонку: есть ли у нас (стоит ли добавить) тест, покрывающий файлы с пробелами — записи в %files, видимо, такого вида:
  %files --noglob
  "%_datadir/project/2001 a space odyssey"
  "%_datadir/project/2001[a space odyssey]"
?

А то rpm-s-m, исправляя у себя, столкнулись с поломкой таких файлов.
Comment 7 Arseny Maslennikov 2024-10-30 15:43:12 MSK
(In reply to Vitaly Chikunov from comment #4)
> > Другой вариант - придумать что-то ALT-specific.
> 
> RFC https://git.altlinux.org/tasks/361121/
Для генератных пакетов — LGTM, за исключением соображения выше.

(In reply to Gleb F-Malinovskiy from comment #5)
> (In reply to Vitaly Chikunov from comment #4)
> > RFC https://git.altlinux.org/tasks/361121/
> 
> В теории, наверное, было бы ещё удобнее если бы это делалось через %attr или
> что-то такое, чтобы можно было glob выключить и потом включить обратно.  Но
> пока что это, вроде, не нужно.
Когда секцию пишет человек — да. А роботу-генератору, как я imho себе их представляю, так будет менее удобно: у него получился список готовых путей, и ему нужно их в неизменном виде донести до rpm-build.
Comment 8 Gleb F-Malinovskiy 2024-10-30 17:17:22 MSK
(In reply to Vitaly Chikunov from comment #2)
> Похоже это баг в логике build/files.c:processBinaryFile. Сначала
> определяется что fileURL это glob, по наличию ? * [ ], если glob, то он
> обрабатывается как glob (с экранированием символов через \, а если не glob,
> то обрабатывается как путь (без поддержки экранирования). То есть если
> добавить экранирование, то путь перестает быть glob и символы экранирования
> испортят путь.
Кстати, в этом случае в качестве объезда можно сделать, чтобы это всегда был glob, а сам путь при этом остался однозначным.  Я вспомнил, что мы делаем похожее в сборочнице с git-ом, там вот такое есть:

old_tag_id="$(git rev-parse --tags="[${tag_name:0:1}]${tag_name:1}")"