mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-04 02:40:06 +00:00
c66c908230
This patch syncs posix/glob.c implementation with gnulib version b5ec983 (glob: simplify symlink detection). The only difference to gnulib code is * DT_UNKNOWN, DT_DIR, and DT_LNK definition in the case there were not already defined. Gnulib code which uses HAVE_STRUCT_DIRENT_D_TYPE will redefine them wrongly because GLIBC does not define HAVE_STRUCT_DIRENT_D_TYPE. Instead the patch check for each definition instead. Also, the patch requires additional globfree and globfree64 files for compatibility version on some architectures. Also the code simplification leads to not macro simplification (not need for NO_GLOB_PATTERN_P anymore). Checked on x86_64-linux-gnu and on a build using build-many-glibcs.py for all major architectures. [BZ #1062] * posix/Makefile (routines): Add globfree, globfree64, and glob_pattern_p. * posix/flexmember.h: New file. * posix/glob_internal.h: Likewise. * posix/glob_pattern_p.c: Likewise. * posix/globfree.c: Likewise. * posix/globfree64.c: Likewise. * sysdeps/gnu/globfree64.c: Likewise. * sysdeps/unix/sysv/linux/alpha/globfree.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/globfree64.c: Likewise. * sysdeps/unix/sysv/linux/oldglob.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/globfree64.c: Likewise. * sysdeps/unix/sysv/linux/x86_64/x32/globfree.c: Likewise. * sysdeps/wordsize-64/globfree.c: Likewise. * sysdeps/wordsize-64/globfree64.c: Likewise. * posix/glob.c (HAVE_CONFIG_H): Use !_LIBC instead. [NDEBUG): Remove comments. (GLOB_ONLY_P, _AMIGA, VMS): Remove define. (dirent_type): New type. Use uint_fast8_t not uint8_t, as C99 does not require uint8_t. (DT_UNKNOWN, DT_DIR, DT_LNK): New macros. (struct readdir_result): Use dirent_type. Do not define skip_entry unless it is needed; this saves a byte on platforms lacking d_ino. (readdir_result_type, readdir_result_skip_entry): New functions, replacing ... (readdir_result_might_be_symlink, readdir_result_might_be_dir): these functions, which were removed. This makes the callers easier to read. All callers changed. (D_INO_TO_RESULT): Now empty if there is no d_ino. (size_add_wrapv, glob_use_alloca): New static functions. (glob, glob_in_dir): Check for size_t overflow in several places, and fix some size_t checks that were not quite right. Remove old code using SHELL since Bash no longer uses this. (glob, prefix_array): Separate MS code better. (glob_in_dir): Remove old Amiga and VMS code. (globfree, __glob_pattern_type, __glob_pattern_p): Move to separate files. (glob_in_dir): Do not rely on undefined behavior in accessing struct members beyond their bounds. Use a flexible array member instead (link_stat): Rename from link_exists2_p and return -1/0 instead of 0/1. Caller changed. (glob): Fix memory leaks. * posix/glob64 (globfree64): Move to separate file. * sysdeps/gnu/glob64.c (NO_GLOB_PATTERN_P): Remove define. (globfree64): Remove hidden alias. * sysdeps/unix/sysv/linux/Makefile (sysdeps_routines): Add oldglob. * sysdeps/unix/sysv/linux/alpha/glob.c (__new_globfree): Move to separate file. * sysdeps/unix/sysv/linux/i386/glob64.c (NO_GLOB_PATTERN_P): Remove define. Move compat code to separate file. * sysdeps/wordsize-64/glob.c (globfree): Move definitions to separate file.
203 lines
6.6 KiB
Makefile
203 lines
6.6 KiB
Makefile
ifeq ($(subdir),csu)
|
|
sysdep_routines += errno-loc
|
|
endif
|
|
|
|
ifeq ($(subdir),assert)
|
|
CFLAGS-assert.c += -DFATAL_PREPARE_INCLUDE='<fatal-prepare.h>'
|
|
CFLAGS-assert-perr.c += -DFATAL_PREPARE_INCLUDE='<fatal-prepare.h>'
|
|
endif
|
|
|
|
ifeq ($(subdir),malloc)
|
|
CFLAGS-malloc.c += -DMORECORE_CLEARS=2
|
|
endif
|
|
|
|
ifeq ($(subdir),misc)
|
|
include $(firstword $(wildcard $(sysdirs:=/sysctl.mk)))
|
|
|
|
sysdep_routines += clone umount umount2 readahead \
|
|
setfsuid setfsgid epoll_pwait signalfd \
|
|
eventfd eventfd_read eventfd_write prlimit \
|
|
personality epoll_wait tee vmsplice splice \
|
|
open_by_handle_at
|
|
|
|
CFLAGS-gethostid.c = -fexceptions
|
|
CFLAGS-tee.c = -fexceptions -fasynchronous-unwind-tables
|
|
CFLAGS-vmsplice.c = -fexceptions -fasynchronous-unwind-tables
|
|
CFLAGS-splice.c = -fexceptions -fasynchronous-unwind-tables
|
|
CFLAGS-open_by_handle_at.c = -fexceptions -fasynchronous-unwind-tables
|
|
CFLAGS-sync_file_range.c = -fexceptions -fasynchronous-unwind-tables
|
|
CFLAGS-tst-writev.c += "-DARTIFICIAL_LIMIT=(0x80000000-sysconf(_SC_PAGESIZE))"
|
|
|
|
# Note that bits/mman-linux.h is listed here though the file lives in the
|
|
# top-level bits/ subdirectory instead of here in sysdeps/.../linux/bits/.
|
|
# That is just so that other (non-Linux) configurations for whom the
|
|
# bits/mman-linux.h definitions work well do not have to duplicate the
|
|
# contents of the file. The file must still be listed in sysdep_headers
|
|
# here and in any non-Linux configuration that uses it; other
|
|
# configurations will not install the file.
|
|
sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
|
|
sys/klog.h \
|
|
sys/user.h sys/prctl.h \
|
|
sys/kd.h sys/soundcard.h sys/vt.h \
|
|
sys/quota.h sys/fsuid.h \
|
|
scsi/sg.h scsi/scsi.h scsi/scsi_ioctl.h sys/pci.h \
|
|
sys/raw.h sys/personality.h sys/epoll.h \
|
|
bits/a.out.h sys/inotify.h sys/signalfd.h sys/eventfd.h \
|
|
sys/timerfd.h sys/fanotify.h bits/eventfd.h bits/inotify.h \
|
|
bits/signalfd.h bits/timerfd.h bits/epoll.h \
|
|
bits/socket_type.h bits/syscall.h bits/sysctl.h \
|
|
bits/mman-linux.h \
|
|
bits/siginfo-arch.h bits/siginfo-consts-arch.h
|
|
|
|
tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
|
|
tst-quota tst-sync_file_range test-errno-linux
|
|
|
|
# Generate the list of SYS_* macros for the system calls (__NR_*
|
|
# macros). The file syscall-names.list contains all possible system
|
|
# call names, and the generated header file produces SYS_* macros for
|
|
# the __NR_* macros which are actually defined.
|
|
|
|
generated += bits/syscall.h
|
|
$(objpfx)bits/syscall.h: \
|
|
../sysdeps/unix/sysv/linux/gen-syscall-h.awk \
|
|
../sysdeps/unix/sysv/linux/syscall-names.list
|
|
$(make-target-directory)
|
|
LC_ALL=C $(AWK) -f $^ > $@-tmp
|
|
$(move-if-change) $@-tmp $@
|
|
before-compile += $(objpfx)bits/syscall.h
|
|
|
|
# All macros defined by <sys/syscall.h>. Include <bits/syscall.h>
|
|
# explicitly because <sys/sycall.h> skips it if _LIBC is defined.
|
|
$(objpfx)tst-syscall-list-macros.list: \
|
|
$(objpfx)bits/syscall.h ../sysdeps/unix/sysv/linux/sys/syscall.h
|
|
printf '#include <linux/version.h>\n\
|
|
#include <sys/syscall.h>\n#include <bits/syscall.h>\n' | \
|
|
$(CC) -E -o $@-tmp $(CFLAGS) $(CPPFLAGS) -x c - -dM
|
|
$(move-if-change) $@-tmp $@
|
|
|
|
# __NR_* system call names. Used by the test below.
|
|
$(objpfx)tst-syscall-list-nr.list: \
|
|
../sysdeps/unix/sysv/linux/filter-nr-syscalls.awk \
|
|
$(objpfx)tst-syscall-list-macros.list
|
|
LC_ALL=C $(AWK) -f $^ > $@-tmp
|
|
$(move-if-change) $@-tmp $@
|
|
|
|
# SYS_* system call names. Used by the test below.
|
|
$(objpfx)tst-syscall-list-sys.list: $(objpfx)tst-syscall-list-macros.list
|
|
LC_ALL=C $(AWK) '/^#define SYS_/ { print substr($$2, 5) }' $< > $@-tmp
|
|
$(move-if-change) $@-tmp $@
|
|
|
|
tests-special += $(objpfx)tst-syscall-list.out
|
|
$(objpfx)tst-syscall-list.out: \
|
|
../sysdeps/unix/sysv/linux/tst-syscall-list.sh \
|
|
$(objpfx)tst-syscall-list-macros.list \
|
|
$(objpfx)tst-syscall-list-nr.list \
|
|
$(objpfx)tst-syscall-list-sys.list
|
|
$(BASH) $^ $(AWK) > $@; $(evaluate-test)
|
|
|
|
endif # $(subdir) == misc
|
|
|
|
ifeq ($(subdir),time)
|
|
sysdep_headers += sys/timex.h bits/timex.h
|
|
|
|
sysdep_routines += ntp_gettime ntp_gettimex
|
|
endif
|
|
|
|
ifeq ($(subdir),signal)
|
|
tests-special += $(objpfx)tst-signal-numbers.out
|
|
# Depending on signal.o* is a hack. What we actually want is a dependency
|
|
# on signal.h and everything it includes. That's impractical to write
|
|
# in this context, but signal.c includes signal.h and not much else so it'll
|
|
# be conservatively correct.
|
|
$(objpfx)tst-signal-numbers.out: \
|
|
../sysdeps/unix/sysv/linux/tst-signal-numbers.sh \
|
|
$(objpfx)signal.o*
|
|
AWK=$(AWK) $(SHELL) ../sysdeps/unix/sysv/linux/tst-signal-numbers.sh \
|
|
$(CC) $(patsubst -DMODULE_NAME=%,-DMODULE_NAME=testsuite,$(CPPFLAGS)) \
|
|
< /dev/null > $@; $(evaluate-test)
|
|
endif
|
|
|
|
ifeq ($(subdir),socket)
|
|
sysdep_headers += net/if_ppp.h net/ppp-comp.h \
|
|
net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
|
|
net/if_slip.h net/if_packet.h net/if_shaper.h
|
|
sysdep_routines += cmsg_nxthdr
|
|
CFLAGS-recvmmsg.c = -fexceptions -fasynchronous-unwind-tables
|
|
CFLAGS-sendmmsg.c = -fexceptions -fasynchronous-unwind-tables
|
|
endif
|
|
|
|
ifeq ($(subdir),sunrpc)
|
|
sysdep_headers += nfs/nfs.h
|
|
endif
|
|
|
|
ifeq ($(subdir),termios)
|
|
sysdep_headers += termio.h
|
|
endif
|
|
|
|
ifeq ($(subdir),posix)
|
|
sysdep_headers += bits/initspin.h
|
|
|
|
sysdep_routines += sched_getcpu oldglob
|
|
|
|
tests += tst-affinity tst-affinity-pid
|
|
|
|
CFLAGS-fork.c = $(libio-mtsafe)
|
|
CFLAGS-getpid.o = -fomit-frame-pointer
|
|
CFLAGS-getpid.os = -fomit-frame-pointer
|
|
endif
|
|
|
|
ifeq ($(subdir),inet)
|
|
sysdep_headers += netinet/if_fddi.h netinet/if_tr.h \
|
|
netipx/ipx.h netash/ash.h netax25/ax25.h netatalk/at.h \
|
|
netrom/netrom.h netpacket/packet.h netrose/rose.h \
|
|
neteconet/ec.h netiucv/iucv.h
|
|
sysdep_routines += netlink_assert_response
|
|
endif
|
|
|
|
# Don't compile the ctype glue code, since there is no old non-GNU C library.
|
|
inhibit-glue = yes
|
|
|
|
ifeq ($(subdir),dirent)
|
|
sysdep_routines += getdirentries getdirentries64
|
|
endif
|
|
|
|
ifeq ($(subdir),nis)
|
|
CFLAGS-ypclnt.c = -DUSE_BINDINGDIR=1
|
|
endif
|
|
|
|
ifeq ($(subdir),io)
|
|
sysdep_routines += xstatconv internal_statvfs internal_statvfs64 \
|
|
sync_file_range fallocate fallocate64
|
|
sysdep_headers += bits/fcntl-linux.h
|
|
|
|
tests += tst-fallocate tst-fallocate64
|
|
endif
|
|
|
|
ifeq ($(subdir),elf)
|
|
sysdep-rtld-routines += dl-brk dl-sbrk dl-getcwd dl-openat64 dl-opendir \
|
|
dl-fxstatat64
|
|
|
|
libof-lddlibc4 = lddlibc4
|
|
|
|
others += pldd
|
|
install-bin += pldd
|
|
$(objpfx)pldd: $(objpfx)xmalloc.o
|
|
endif
|
|
|
|
ifeq ($(subdir),rt)
|
|
CFLAGS-mq_send.c += -fexceptions
|
|
CFLAGS-mq_receive.c += -fexceptions
|
|
endif
|
|
|
|
ifeq ($(subdir),nscd)
|
|
sysdep-CFLAGS += -DHAVE_EPOLL -DHAVE_SENDFILE -DHAVE_INOTIFY -DHAVE_NETLINK
|
|
CFLAGS-gai.c += -DNEED_NETLINK
|
|
endif
|
|
|
|
ifeq ($(subdir),nptl)
|
|
tests += tst-align-clone tst-getpid1 \
|
|
tst-thread-affinity-pthread tst-thread-affinity-pthread2 \
|
|
tst-thread-affinity-sched
|
|
tests-internal += tst-setgetname
|
|
endif
|