Bug 29117

Summary: rpmReadSignature failed при inode, выходящем за 32 бита
Product: Sisyphus Reporter: Vitaly Lipatov <lav>
Component: rpmAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: at, glebfm, icesik, imz, ldv, mike, piastry, placeholder, sin, vt
Version: unstable   
Hardware: all   
OS: Linux   

Description Vitaly Lipatov 2013-06-27 23:29:17 MSK
$ rpm --checksig
/var/ftp/pub/Etersoft/CIFS@Etersoft/5.4.7/sources/etercifs-5.4.7-alt1.src.rpm 
error:
/var/ftp/pub/Etersoft/CIFS@Etersoft/5.4.7/sources/etercifs-5.4.7-alt1.src.rpm:
rpmReadSignature failed

Небольшое расследование выявило, что у файла inode >4ГБ:
это видно по вызову из rpm:
fstat64(3</var/ftp/pub/Etersoft/CIFS@Etersoft/5.4.7/sources/etercifs-5.4.7-alt1.src.rpm>,
{st_dev=makedev(253, 0), st_ino=4496308953, st_mode=S_IFREG|0644, st_nlink=1,
st_uid=1706, st_gid=100, st_blksize=4096, st_blocks=15592, st_size=7981458,
st_atime=2013/06/27-22:11:08, st_mtime=2013/06/27-22:19:54,
st_ctime=2013/06/27-22:19:54}) = 0

и просто
# stat
/var/ftp/pub/Etersoft/CIFS@Etersoft/5.4.7/sources/etercifs-5.4.7-alt1.src.rpm 
  Размер: 7981458       Блоков: 15592      Блок В/В: 4096   обычный файл
Устройство: fd00h/64768d    Inode: 4496308953  Ссылки: 1

Условия возникновения:

файловая система XFS (700ГБ размером) подошла к краю и решила создавать inode > 4Гб (несмотря на описанное здесь https://bugzilla.altlinux.org/show_bug.cgi?id=28214#c14 где проблемы обещались только при ФС размером > 1ТБ)
Comment 1 Vitaly Lipatov 2013-06-29 17:23:06 MSK
Удобно, что мы всё это уже обсуждали:

>Комментарий #12 от Dmitry V. Levin 2013-01-12 06:06:26
>Чего гадать, когда можно просто в linux/fs/stat.c исходный код посмотреть.
>Например, там написано, что stat(2) возвращает EOVERFLOW, когда st_ino,
>st_nlink или st_size недостаточного размера.

>Комментарий #4 от Dmitry V. Levin 2012-12-20 18:37:37
>Достаточно просто добавить AC_SYS_LARGEFILE, который does the right thing.
Comment 2 Dmitry V. Levin 2013-10-24 02:36:58 MSK
(In reply to comment #1)
> Удобно, что мы всё это уже обсуждали:
> 
> >Комментарий #12 от Dmitry V. Levin 2013-01-12 06:06:26
> >Чего гадать, когда можно просто в linux/fs/stat.c исходный код посмотреть.
> >Например, там написано, что stat(2) возвращает EOVERFLOW, когда st_ino,
> >st_nlink или st_size недостаточного размера.
> 
> >Комментарий #4 от Dmitry V. Levin 2012-12-20 18:37:37
> >Достаточно просто добавить AC_SYS_LARGEFILE, который does the right thing.

В некоторые пакеты просто добавить AC_SYS_LARGEFILE нельзя.
Например, в rpm используется fts, соответственно, все взрывается:

In file included from files.c:1573:0:
/usr/include/fts.h:41:3: error: #error "<fts.h> cannot be used with -D_FILE_OFFSET_BITS==64"

В rpm>=4.1 (видимо, для объезда) jbj просто взял и скопировал fts.{c,h} из glibc в rpm.

см. тж.
http://sourceware.org/bugzilla/show_bug.cgi?id=11460
http://sourceware.org/bugzilla/show_bug.cgi?id=15838
Comment 3 Gleb F-Malinovskiy 2016-12-19 17:13:22 MSK
rpm 4.13.0 использует LFS на i586.