blob: aeef22572fb3ef8bf4488875a573c5f0d69378bd [file] [log] [blame]
#!/bin/bash
# Copyright 2015 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Detect 32bit builds that are using legacy 32bit file interfaces.
# https://en.wikipedia.org/wiki/Large_file_support
# Set ebuild vars to make shellcheck happy.
: "${ARCH:=}"
: "${CATEGORY:=}"
: "${D:=/}"
: "${PN:=}"
: "${PV:=}"
: "${RESTRICT:=}"
: "${WORKDIR:=}"
DOC_URL="https://issuetracker.google.com/201531268"
# Lists gleaned from headers and this doc:
# http://people.redhat.com/berrange/notes/largefile.html
# http://opengroup.org/platform/lfs.html
SYMBOLS=(
# aio.h
aio_cancel
aio_error
aio_fsync
aio_read
aio_return
aio_suspend
aio_write
lio_listio
# dirent.h
alphasort
getdirentries
readdir
readdir_r
scandir
scandirat
versionsort
# fcntl.h
creat
fallocate
fopen
fopenat
freopen
open
openat
posix_fadvise
posix_fallocate
__open
__open_2
__openat_2
# ftw.h
ftw
nftw
# glob.h
glob
globfree
# stdio.h
fgetpos
fopen
freopen
fseeko
fsetpos
ftello
tmpfile
# stdlib.h
mkostemp
mkostemps
mkstemp
mkstemps
# sys/mman.h
mmap
# sys/resource.h
getrlimit
prlimit
setrlimit
# sys/sendfile.h
sendfile
# sys/stat.h
fstat
fstatat
lstat
stat
__fxstat
__fxstatat
__lxstat
__xstat
# sys/statfs.h
fstatfs
# sys/statvfs.h
statvfs
fstatvfs
# unistd.h
lockf
lseek
ftruncate
pread
preadv
pwrite
pwritev
truncate
__pread_chk
)
SYMBOLS_REGEX=$(printf '%s|' "${SYMBOLS[@]}")
SYMBOLS_REGEX="^(${SYMBOLS_REGEX%|})$"
# These are packages that are known to DTRT. This list should only be updated
# with explicit review & documentation.
known_good_pkg() {
case "${CATEGORY}/${PN}" in
# All of the binaries provided by v4l-utils are built with LFS flags enabled,
# except libv4l2tracer.so. This library wraps the interfaces for open, open64,
# mmap, and mmap64 for tracing purposes which means they're only called when
# the tracee program is not built with LFS.
media-tv/v4l-utils) ;;
# Provides wrappers to every C library interface, both LFS & non-LFS.
# Internally it handles LFS correctly. Its non-LFS references are only via
# packages that are themselves broken.
sys-apps/sandbox) ;;
# https://bugs.gentoo.org/893656
# zlib is quite intelligent when it comes to the standard LFS flags. z_off_t
# is the only exported interface that uses off_t. In gzlib.c, a few APIs
# (e.g. gzseek) are defined in terms of z_off_t, so with a 32-bit ABI that
# splits values (e.g. arm 32-bit). This means the stack usage & return value
# are ABI incompatible.
#
# Annoyingly, the only thing tripping up the checker is the call to open() in
# gzlib.c, and zlib actually DTRT by using O_LARGEFILE when available.
# Unfortunately, it's impossible from a symbol analysis point of view to
# determine that. We would really need something that decompiles & analyzes
# the opcodes to detect that this particular usage is correct.
sys-libs/zlib) ;;
*) return 1;;
esac
return 0
}
known_bad_pkg() {
# Only allow this on arm as we have devices shipping that now.
case "${ARCH}" in
arm) ;;
*) return 1;;
esac
# TODO(b/260698283): Ignore ARC (bionic) packages for now.
case "${CATEGORY}/${PN}:${PV}" in
media-libs/arc-cros-gralloc:*|\
media-libs/arc-img-ddk:*|\
media-libs/arc-mali-drivers:*|\
media-libs/arc-mali-drivers-bifrost:*|\
media-libs/arc-mali-drivers-bifrost-bin:*|\
media-libs/arc-mali-drivers-valhall:*|\
media-libs/arc-mali-drivers-valhall-bin:*|\
media-libs/arc-mesa-freedreno:*|\
media-libs/arc-mesa-img:*|\
media-libs/arc-mesa-virgl:*|\
media-libs/arcvm-mesa-freedreno:*|\
x11-libs/arc-libdrm:*)
return 0
;;
esac
# TODO(b/258669199): Ignore Rust packages for now.
case "${CATEGORY}/${PN}:${PV}" in
chromeos-base/crosvm:*|\
chromeos-base/chunnel:*|\
dev-rust/s9:*|\
chromeos-base/factory_fai:*|\
chromeos-base/ippusb_bridge:*|\
chromeos-base/hwsec-utils:*|\
chromeos-base/resourced:*|\
media-gfx/deqp-runner:*|\
media-sound/adhd:*|\
media-sound/audio_processor:*|\
media-sound/audio_streams_conformance_test:*|\
media-sound/cras-client:*|\
media-sound/cras_rust:*|\
media-sound/cras_tests:*|\
sys-apps/kexec-lite:*|\
sys-firmware/sunplus-fwverify:*)
return 0
;;
esac
# Packages in upstream discussion. Must link to an upstream tracker.
case "${CATEGORY}/${PN}:${PV}" in
# https://bugs.gentoo.org/904190
dev-libs/expat:2.5*) return 0;;
# https://github.com/alsa-project/alsa-lib/pull/333
media-libs/alsa-lib:*) return 0;;
# https://github.com/alsa-project/alsa-utils/pull/223
media-sound/alsa-utils:*) return 0;;
esac
# Do not add more packages here!
case "${CATEGORY}/${PN}:${PV}" in
app-accessibility/brltty:6.3|\
app-admin/sysstat:11.7.4|\
app-benchmarks/blktests:20190430|\
app-benchmarks/blogbench:1.1.20200218|\
app-benchmarks/bootchart:0.9.2|\
app-benchmarks/pjdfstest:20190822|\
app-crypt/nss:3.68.2|\
app-crypt/tpm-tools:1.3.9.1|\
app-crypt/trousers:0.3.3|\
app-editors/qemacs:0.4.1_pre20170225|\
app-editors/vim-core:9.0.*|\
app-emulation/lx[cd]:3.*|\
app-emulation/lx[cd]:4.0.*|\
app-misc/ckermit:9.0.302|\
app-misc/edid-decode:20210514|\
app-misc/evtest:1.35|\
app-misc/figlet:2.2.5|\
app-misc/jq:1.4|\
app-misc/screen:4.9.0|\
app-misc/tmux:3.3a|\
app-misc/utouch-evemu:1.0.5|\
app-mobilephone/dfu-util:0.9|\
app-shells/dash:0.5.9.1|\
app-text/ghostscript-gpl:9.55.0|\
app-text/htmltidy:20090325|\
app-text/libpaper:1.1.28|\
app-text/poppler:22.03.0|\
chromeos-base/arc-key"ma"ster:0.0.1|\
chromeos-base/audiotest:0.0.1|\
chromeos-base/autotest-deps:0.0.4|\
chromeos-base/autotest-deps-cellular:0.0.1|\
chromeos-base/autotest-tests:0.0.4|\
chromeos-base/autotest-tests-graphics:0.0.1|\
chromeos-base/chromeos-chrome:*|\
chromeos-base/chromeos-cr50-dev:0.0.1|\
chromeos-base/crash-reporter:0.0.1|\
chromeos-base/cronista:0.24.52|\
chromeos-base/cros-camera:0.0.1|\
chromeos-base/cros-camera-libs:0.0.1|\
chromeos-base/croscomp:0.1.0|\
chromeos-base/crosh:0.24.52|\
chromeos-base/crostini_client:0.1.0|\
chromeos-base/ec-devutils:0.0.2|\
chromeos-base/ec-utils:0.0.2|\
chromeos-base/ec-utils-test:0.0.1|\
chromeos-base/factory:0.2.0|\
chromeos-base/factory_installer:0.0.1|\
chromeos-base/g2update_tool:1.2.4905|\
chromeos-base/gdix_hid_firmware_update:1.7.6|\
chromeos-base/glbench:0.0.1|\
chromeos-base/google-breakpad:2022.*|\
chromeos-base/google-breakpad:2023.0[12]*|\
chromeos-base/hps-firmware-tools:0.0.1|\
chromeos-base/infineon-firmware-updater:1.1.2459.0|\
chromeos-base/libevdev:0.0.1|\
chromeos-base/libhwsec:0.0.1|\
chromeos-base/manatee-runtime:0.1.0|\
chromeos-base/memd:0.1.0|\
chromeos-base/mttools:0.0.1|\
chromeos-base/perfetto:29.0|\
chromeos-base/perfetto_simple_producer:0.0.1|\
chromeos-base/pixart_tpfwup:0.0.3|\
chromeos-base/pixart_tpfwup:0.0.6|\
chromeos-base/sirenia:0.24.52|\
chromeos-base/sommelier:0.0.1|\
chromeos-base/tast-local-helpers-cros:0.0.1|\
chromeos-base/telemetry:0.0.1|\
chromeos-base/tensorflow-internal:2.8.0|\
chromeos-base/termina_container_tools:0.0.1|\
chromeos-base/toolchain-tests:0.0.1|\
chromeos-base/tpm2-simulator:0.0.1|\
chromeos-base/tremplin:0.0.1|\
chromeos-base/vkbench:0.0.1|\
chromeos-base/vpd:0.0.1|\
chromeos-base/wacom_fw_flash:1.4.0|\
chromeos-base/weida_wdt_util:0.9.9|\
dev-cpp/abseil-cpp:20211102.0|\
dev-embedded/dfu-programmer:0.7.2|\
dev-lang/tcl:8.6.12|\
dev-libs/boost:1.79.0|\
dev-libs/confuse:2.7|\
dev-libs/flatbuffers:2.0.0|\
dev-libs/fribidi:1.0.9|\
dev-libs/iniparser:3.1|\
dev-libs/json-c:0.14|\
dev-libs/leveldb:1.23|\
dev-libs/libconfig:1.5|\
dev-libs/libcroco:0.6.12|\
dev-libs/libev:4.33|\
dev-libs/libfastjson:0.99.8|\
dev-libs/libffi:3.1|\
dev-libs/libfmt:7.1.3|\
dev-libs/libgcrypt:1.8.8|\
dev-libs/libgpg-error:1.36|\
dev-libs/libgpiod:1.4.1|\
dev-libs/libltdl:2.4.6|\
dev-libs/libnl:1.1|\
dev-libs/libnl:3.4.0|\
dev-libs/libpcre2:10.34|\
dev-libs/libpcre:8.44|\
dev-libs/libunistring:0.9.10|\
dev-libs/libusb:1.0.26|\
dev-libs/libverto:0.3.0|\
dev-libs/libxslt:1.1.35|\
dev-libs/nettle:3.7.3|\
dev-libs/nspr:4.32|\
dev-libs/nss:3.68.2|\
dev-libs/opensc:0.21.0|\
dev-libs/openssl:1.1.1n|\
dev-libs/protobuf:3.19.3|\
dev-libs/tinyxml2:8.0.0|\
dev-python/grpcio:1.43.*|\
dev-python/numpy:1.19.4|\
dev-python/python-uinput:0.11.2|\
dev-python/selenium:3.0.2|\
dev-rust/bindgen:0.59.2|\
dev-util/android-tools:9.0.0_p3|\
dev-util/apitrace:9.0|\
dev-util/hdctools:0.0.1|\
dev-rust/manatee-client:0.24.52|\
dev-util/perf:5.15*|\
dev-util/rt-tests:2.2|\
dev-util/xdelta:3.0.11|\
dev-util/xxd:1.10|\
games-util/joystick:1.4.2|\
gnome-base/librsvg:2.40.21|\
media-fonts/font-util:1.3.2|\
media-gfx/deqp-runner:0.13.1|\
media-gfx/qrencode:3.4.4|\
media-gfx/"sa"ne-backends:1.1.1|\
media-gfx/zbar:0.23.1|\
media-libs/clvk:0.0.1|\
media-libs/cros-camera-hal-qti:0.0.1|\
media-libs/cros-camera-libfs:0.0.1|\
media-libs/cros-camera-sw-privacy-switch-test:0.0.1|\
media-libs/dlm:0.0.1|\
media-libs/freeimage:3.15.3|\
media-libs/freetype:2.12*|\
media-libs/ladspa-sdk:1.13|\
media-libs/lcms:2.12|\
media-libs/libjpeg-turbo:2.1.1|\
media-libs/libpng:1.6.37|\
media-libs/libv4lplugins:0.0.1|\
media-libs/libvorbis:1.3.7|\
media-libs/libyuv-test:1774|\
media-libs/mali-drivers:1.20|\
media-libs/mali-drivers-bin:1.20*|\
media-libs/mali-drivers-bifrost:32.0|\
media-libs/mali-drivers-bifrost-bin:32.0*|\
media-libs/mali-drivers-valhall:32.0|\
media-libs/mali-drivers-valhall-bin:32.0*|\
media-libs/mesa-img:21.3*|\
media-libs/opencl-cts:0.0.1|\
media-libs/opencv:4.5.5|\
media-libs/qti-7c-camera-bins:20220401|\
media-libs/rockchip-isp1-3a-libs-bin:2018.06.28|\
media-libs/sbc:1.3|\
media-libs/shaderc:2022.1|\
media-libs/skia:106|\
media-libs/tiff:4.3.0|\
media-libs/waffle:1.6.0|\
media-plugins/alsa-plugins:1.1.6|\
media-sound/gsm:1.0.13|\
media-sound/sound_card_init:*|\
media-video/yavta:0.0.1|\
net-analyzer/netcat:110.20180111|\
net-analyzer/netdata:1.34.1|\
net-analyzer/netperf:2.7.0|\
net-analyzer/tcpdump:4.9.3|\
net-analyzer/traceroute:2.1.0|\
net-dialup/lrzsz:0.12.20|\
net-dialup/minicom:2.7|\
net-dialup/ppp:2.4.9|\
net-dialup/xl2tpd:1.3.12|\
net-dns/avahi:0.8|\
net-dns/bind-tools:9.11.2_p1|\
net-firewall/conntrack-tools:1.4.4|\
net-firewall/ebtables:2.0.11|\
net-libs/grpc:1.16.*|\
net-libs/grpc:1.43.*|\
net-libs/libiio:0.23|\
net-libs/libnetfilter_conntrack:1.0.6|\
net-libs/libnsl:1.2.0|\
net-libs/libsoup:2.58.2|\
net-libs/libtirpc:1.0.2|\
net-libs/libvncserver:0.9.13|\
net-libs/rpcsvc-proto:1.3.1|\
net-misc/bridge-utils:1.6|\
net-misc/chrony:4.2|\
net-misc/diag:0.1_p20210329|\
net-misc/htpdate:1.0.4|\
net-misc/iperf:2.0.9|\
net-misc/iperf:3.7|\
net-misc/iputils:20171016_pre|\
net-misc/pps-tools:0.0.20120407|\
net-misc/qc-netmgr:0.1_p20220118|\
net-misc/radvd:2.17|\
net-misc/rmtfs:0.3_p20210408|\
net-misc/socat:1.7.3.2|\
net-misc/sslh:1.18|\
net-misc/tlsdate:0.0.5|\
net-misc/uftp:4.10.1|\
net-misc/usbip:4.19|\
net-print/cups-filters:1.28.7|\
net-print/dymo-cups-drivers:1.4.0|\
net-print/epson-inkjet-printer-escpr:1.7.18|\
net-print/hplip:3.21.8|\
net-print/starcupsdrv:3.11.0|\
net-proxy/tinyproxy:1.10.0|\
net-vpn/openvpn:2.4.4|\
net-vpn/strongswan:5.9.4|\
net-vpn/wireguard-tools:1.0.20200319|\
net-wireless/bluez:5.54|\
net-wireless/crda:3.18|\
net-wireless/floss:0.0.2|\
net-wireless/hostapd:2.11_pre|\
net-wireless/iw:5.19|\
net-wireless/wireless-tools:30_pre9|\
net-wireless/wpa_supplicant-cros:2.11_pre|\
sci-geosciences/gpsd:3.17|\
sci-libs/tensorflow:2.8.0|\
sys-apps/coreboot-utils:0.0.1|\
sys-apps/debianutils:4.4|\
sys-apps/dmidecode:3.2|\
sys-apps/dtc:1.6.0|\
sys-apps/ethtool:4.13|\
sys-apps/flashmap:0.3|\
sys-apps/flashrom-tester:1.6.0|\
sys-apps/groff:1.22.4|\
sys-apps/haveged:1.9.14|\
sys-apps/hdparm:9.63|\
sys-apps/i2c-tools:4.0|\
sys-apps/install-xattr:0.5|\
sys-apps/iotools:1.5|\
sys-apps/kbd:1.15.5|\
sys-apps/keyutils:1.6.3|\
sys-apps/less:590|\
sys-apps/lshw:02.19.2b_p20210121|\
sys-apps/memtester:4.2.2|\
sys-apps/nvme-cli:1.6|\
sys-apps/pv:1.6.20|\
sys-apps/restorecon:2.7|\
sys-apps/smartmontools:7.3|\
sys-apps/toybox:0.8.6|\
sys-apps/usbguard:20210927|\
sys-apps/usbutils:014|\
sys-auth/nss-mdns:0.13|\
sys-auth/pam_pwdfile:0.99|\
sys-cluster/libqb:0.17.2|\
sys-devel/bc:1.07.1|\
sys-devel/binutils:2.39*|\
sys-devel/flex:2.6.4|\
sys-devel/gdb:9.2.20200923|\
sys-devel/llvm:12.0.1|\
sys-devel/llvm-img:9.0.0|\
sys-fs/btrfs-progs:5.4.1|\
sys-fs/e2fsprogs:1.47.0|\
sys-fs/fuse:2.9.8|\
sys-libs/gcc-libs:10.2.0|\
sys-libs/libcap-ng:0.8.2|\
sys-libs/libcxx:15.*|\
sys-libs/libselinux:3.0|\
sys-libs/libsepol:3.0|\
sys-libs/mtdev:1.1.2|\
sys-libs/pam:1.3.1|\
sys-process/audit:3.0.6|\
sys-process/htop:1.0.2|\
sys-process/numactl:2.0.14|\
sys-process/psmisc:23.3|\
sys-process/time:1.9|\
x11-base/xwayland:1.20.8|\
x11-libs/pango:1.42.4)
return 0
;;
esac
return 1
}
check_lfs()
{
local files
if known_good_pkg; then
return
fi
# Exclude /build, since such files don't go into the final image.
files="$(for d in "$@"; do \
find "${d}" -path "${d}/build" -prune -o -type f -print0; done | \
xargs -0 scanelf -F '%s %p' -qyRgs "-${SYMBOLS_REGEX}")"
if [[ -n "${files}" ]]; then
echo
eqawarn "QA Notice: The following files were not built with LFS support:"
eqawarn " Please see ${DOC_URL} for details."
eqawarn "${files}"
eqawarn "Full build files:"
scanelf -F '%s %F' -qyRgs "-${SYMBOLS_REGEX}" "${WORKDIR:-}"
echo
if ! known_bad_pkg; then
die "package needs LFS support enabled -- see ${DOC_URL}"
fi
else
if known_bad_pkg; then
eqawarn "Please remove ${PN} exception from large-file-support.sh hook."
fi
fi
}
# Only check on 32-bit systems. Filtering by $ARCH here isn't perfect, but it
# should be good enough for our needs so far.
case "${ARCH}" in
amd64|arm64|"")
;;
*)
if [[ " ${RESTRICT} " != *" binchecks "* ]]; then
check_lfs "${D}"
fi
;;
esac
# Allow for people to run manually for testing/debugging.
if [[ $# -ne 0 ]]; then
eqawarn() { echo " * $*"; }
check_lfs "$@"
fi