Collin Funk <collin.fu...@gmail.com> writes: >> Do you want to deal with it, or should I ? > > I'll take a look later today.
I pushed the attached patch which fixes it. It is much simpler than I expected since most of the Android code can be reused for OpenBSD. I know Bionic uses a lot of BSD stuff, but I assumed the stdio implementation was different. I guess I was wrong. I tested a testdir of all modules on an OpenBSD snapshot from 2025-07-19 and on OpenBSD 7.6 which does not have the change. Both passed all tests. Collin
>From 69a02b5307df043ca22c4b75eaec12be21493910 Mon Sep 17 00:00:00 2001 Message-ID: <69a02b5307df043ca22c4b75eaec12be21493910.1753071535.git.collin.fu...@gmail.com> From: Collin Funk <collin.fu...@gmail.com> Date: Sun, 20 Jul 2025 21:14:37 -0700 Subject: [PATCH] stdioext: Port to recent OpenBSD snapshots with an incomplete FILE type. * lib/fbufmode.c (fbufmode): Check for __OpenBSD__ definition since __sferror is no longer defined publicly on this platform. * lib/fflush.c (clear_ungetc_buffer, update_fpos_cache, rpl_fflush): Likewise. * lib/fpending.c (__fpending): Likewise. * lib/fpurge.c (fpurge): Likewise. * lib/freadable.c (freadable): Likewise. * lib/freadahead.c (freadahead): Likewise. * lib/freading.c (freading): Likewise. * lib/freadptr.c (freadptr): Likewise. * lib/freadseek.c (freadptrinc): Likewise. * lib/fseeko.c (fseeko): Likewise. * lib/fseterr.c (fseterr): Likewise. * lib/fwritable.c (fwritable): Likewise. * lib/fwriting.c (fwriting): Likewise. * lib/stdio-impl.h: Likewise. (_gl_flags_file_t): Define to 'short'. (_gl_file_offset_t): Define to 'fpos_t'. (fp_): Define this macro using the one already written for Android. (struct __sfileext): Define the same way as Android which does not rely on a public 'struct __sbuf' definition. (__SLBF, __SNBF, __SRD, __SWR, __SRW, __SEOF, __SERR, __SOFF): Define macros to the same value as on Android. --- ChangeLog | 27 +++++++++++++++++++++++++++ lib/fbufmode.c | 2 +- lib/fflush.c | 8 ++++---- lib/fpending.c | 2 +- lib/fpurge.c | 4 ++-- lib/freadable.c | 2 +- lib/freadahead.c | 2 +- lib/freading.c | 2 +- lib/freadptr.c | 2 +- lib/freadseek.c | 2 +- lib/fseeko.c | 6 +++--- lib/fseterr.c | 2 +- lib/fwritable.c | 2 +- lib/fwriting.c | 2 +- lib/stdio-impl.h | 29 +++++++++++++++++------------ 15 files changed, 63 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index a7dcba2070..9003983e2c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,30 @@ +2025-07-20 Collin Funk <collin.fu...@gmail.com> + + stdioext: Port to recent OpenBSD snapshots with an incomplete FILE type. + * lib/fbufmode.c (fbufmode): Check for __OpenBSD__ definition since + __sferror is no longer defined publicly on this platform. + * lib/fflush.c (clear_ungetc_buffer, update_fpos_cache, rpl_fflush): + Likewise. + * lib/fpending.c (__fpending): Likewise. + * lib/fpurge.c (fpurge): Likewise. + * lib/freadable.c (freadable): Likewise. + * lib/freadahead.c (freadahead): Likewise. + * lib/freading.c (freading): Likewise. + * lib/freadptr.c (freadptr): Likewise. + * lib/freadseek.c (freadptrinc): Likewise. + * lib/fseeko.c (fseeko): Likewise. + * lib/fseterr.c (fseterr): Likewise. + * lib/fwritable.c (fwritable): Likewise. + * lib/fwriting.c (fwriting): Likewise. + * lib/stdio-impl.h: Likewise. + (_gl_flags_file_t): Define to 'short'. + (_gl_file_offset_t): Define to 'fpos_t'. + (fp_): Define this macro using the one already written for Android. + (struct __sfileext): Define the same way as Android which does not rely + on a public 'struct __sbuf' definition. + (__SLBF, __SNBF, __SRD, __SWR, __SRW, __SEOF, __SERR, __SOFF): Define + macros to the same value as on Android. + 2025-07-20 Bruno Haible <br...@clisp.org> doc: Document resilience against supply chain attacks. diff --git a/lib/fbufmode.c b/lib/fbufmode.c index 416a7a4cd0..b10a122f94 100644 --- a/lib/fbufmode.c +++ b/lib/fbufmode.c @@ -48,7 +48,7 @@ fbufmode (FILE *fp) if (fp_->_flags & _IO_UNBUFFERED) return _IONBF; return _IOFBF; -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ if (fp_->_flags & __SLBF) return _IOLBF; diff --git a/lib/fflush.c b/lib/fflush.c index 9e256f3272..896b9dab3d 100644 --- a/lib/fflush.c +++ b/lib/fflush.c @@ -52,7 +52,7 @@ clear_ungetc_buffer_preserving_position (FILE *fp) static void clear_ungetc_buffer (FILE *fp) { -# if defined __sferror || defined __DragonFly__ || defined __ANDROID__ +# if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ if (HASUB (fp)) { @@ -77,7 +77,7 @@ clear_ungetc_buffer (FILE *fp) #if ! (defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1) /* GNU libc, BeOS, Haiku, Linux libc5 */ -# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT +# if (defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ static int @@ -100,7 +100,7 @@ static void update_fpos_cache (_GL_ATTRIBUTE_MAYBE_UNUSED FILE *fp, _GL_ATTRIBUTE_MAYBE_UNUSED off_t pos) { -# if defined __sferror || defined __DragonFly__ || defined __ANDROID__ +# if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ # if defined __CYGWIN__ || defined __ANDROID__ /* fp_->_offset is typed as an integer. */ @@ -205,7 +205,7 @@ rpl_fflush (FILE *stream) return result; } -# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT +# if (defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ { diff --git a/lib/fpending.c b/lib/fpending.c index be8a987734..529bc7f651 100644 --- a/lib/fpending.c +++ b/lib/fpending.c @@ -39,7 +39,7 @@ __fpending (FILE *fp) #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ return fp->_IO_write_ptr - fp->_IO_write_base; -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */ return fp_->_p - fp_->_bf._base; #elif defined __EMX__ /* emx+gcc */ diff --git a/lib/fpurge.c b/lib/fpurge.c index 0b0f90abda..a9f9c3d66f 100644 --- a/lib/fpurge.c +++ b/lib/fpurge.c @@ -45,7 +45,7 @@ fpurge (FILE *fp) extern int fpurge (FILE *); # endif int result = fpurge (fp); -# if defined __sferror || defined __DragonFly__ || defined __ANDROID__ +# if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ if (result == 0) /* Correct the invariants that fpurge broke. @@ -75,7 +75,7 @@ fpurge (FILE *fp) fp->_IO_save_base = NULL; } return 0; -# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +# elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ fp_->_p = fp_->_bf._base; fp_->_r = 0; diff --git a/lib/freadable.c b/lib/freadable.c index 2a494ae1ce..60eb32f93b 100644 --- a/lib/freadable.c +++ b/lib/freadable.c @@ -38,7 +38,7 @@ freadable (FILE *fp) #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ return (fp->_flags & _IO_NO_READS) == 0; -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */ return (fp_->_flags & (__SRW | __SRD)) != 0; #elif defined __EMX__ /* emx+gcc */ diff --git a/lib/freadahead.c b/lib/freadahead.c index 5a7da7c30b..c44ab033c7 100644 --- a/lib/freadahead.c +++ b/lib/freadahead.c @@ -40,7 +40,7 @@ freadahead (FILE *fp) return (fp->_IO_read_end - fp->_IO_read_ptr) + (fp->_flags & _IO_IN_BACKUP ? fp->_IO_save_end - fp->_IO_save_base : 0); -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0) return 0; diff --git a/lib/freading.c b/lib/freading.c index c8af68b5c5..1a5d0e0dad 100644 --- a/lib/freading.c +++ b/lib/freading.c @@ -36,7 +36,7 @@ freading (FILE *fp) return ((fp->_flags & _IO_NO_WRITES) != 0 || ((fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) == 0 && fp->_IO_read_base != NULL)); -# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +# elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */ return (fp_->_flags & __SRD) != 0; # elif defined __EMX__ /* emx+gcc */ diff --git a/lib/freadptr.c b/lib/freadptr.c index bb56b47039..9719c177e5 100644 --- a/lib/freadptr.c +++ b/lib/freadptr.c @@ -41,7 +41,7 @@ freadptr (FILE *fp, size_t *sizep) return NULL; *sizep = size; return (const char *) fp->_IO_read_ptr; -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0) return NULL; diff --git a/lib/freadseek.c b/lib/freadseek.c index 1fcc8d255a..5ddf7fab58 100644 --- a/lib/freadseek.c +++ b/lib/freadseek.c @@ -39,7 +39,7 @@ freadptrinc (FILE *fp, size_t increment) #elif defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku < hrev58760, Linux libc5 */ fp->_IO_read_ptr += increment; -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ fp_->_p += increment; fp_->_r -= increment; diff --git a/lib/fseeko.c b/lib/fseeko.c index b39099c4a0..d4b6d8f44c 100644 --- a/lib/fseeko.c +++ b/lib/fseeko.c @@ -55,7 +55,7 @@ fseeko (FILE *fp, off_t offset, int whence) if (fp_->_IO_read_end == fp_->_IO_read_ptr && fp_->_IO_write_ptr == fp_->_IO_write_base && fp_->_IO_save_base == NULL) -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ # if defined __SL64 && defined __SCLE /* Cygwin */ if ((fp->_flags & __SL64) == 0) @@ -120,7 +120,7 @@ fseeko (FILE *fp, off_t offset, int whence) off_t pos = lseek (fileno (fp), offset, whence); if (pos == -1) { -#if defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ fp_->_flags &= ~__SOFF; #endif @@ -131,7 +131,7 @@ fseeko (FILE *fp, off_t offset, int whence) /* GNU libc, BeOS, Haiku, Linux libc5 */ fp_->_flags &= ~_IO_EOF_SEEN; fp_->_offset = pos; -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ # if defined __CYGWIN__ || (defined __NetBSD__ && __NetBSD_Version__ >= 600000000) || defined __minix /* fp_->_offset is typed as an integer. */ diff --git a/lib/fseterr.c b/lib/fseterr.c index f66f30460a..caa8ef1087 100644 --- a/lib/fseterr.c +++ b/lib/fseterr.c @@ -35,7 +35,7 @@ fseterr (FILE *fp) #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ fp->_flags |= _IO_ERR_SEEN; -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ fp_->_flags |= __SERR; #elif defined __EMX__ /* emx+gcc */ diff --git a/lib/fwritable.c b/lib/fwritable.c index 1f29f7f773..54471a8271 100644 --- a/lib/fwritable.c +++ b/lib/fwritable.c @@ -38,7 +38,7 @@ fwritable (FILE *fp) #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ return (fp->_flags & _IO_NO_WRITES) == 0; -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */ return (fp_->_flags & (__SRW | __SWR)) != 0; #elif defined __EMX__ /* emx+gcc */ diff --git a/lib/fwriting.c b/lib/fwriting.c index 3308ffcc3c..90cb2c3ad5 100644 --- a/lib/fwriting.c +++ b/lib/fwriting.c @@ -34,7 +34,7 @@ fwriting (FILE *fp) #if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */ return (fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) != 0; -#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#elif defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */ return (fp_->_flags & __SWR) != 0; #elif defined __EMX__ /* emx+gcc */ diff --git a/lib/stdio-impl.h b/lib/stdio-impl.h index 4b4263fe90..36295b9477 100644 --- a/lib/stdio-impl.h +++ b/lib/stdio-impl.h @@ -82,7 +82,7 @@ #include <errno.h> /* For detecting Plan9. */ -#if defined __sferror || defined __DragonFly__ || defined __ANDROID__ +#if defined __sferror || defined __OpenBSD__ || defined __DragonFly__ || defined __ANDROID__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */ # if defined __DragonFly__ /* DragonFly */ @@ -108,13 +108,15 @@ # define _flags pub._flags # define _r pub._r # define _w pub._w -# elif defined __ANDROID__ /* Android */ -# ifdef __LP64__ +# elif defined __ANDROID__ || defined __OpenBSD__ /* Android & OpenBSD */ +# if defined __LP64__ && !defined __OpenBSD__ # define _gl_flags_file_t int # else # define _gl_flags_file_t short # endif -# ifdef __LP64__ +# if defined __OpenBSD__ +# define _gl_file_offset_t fpos_t +# elif defined __LP64__ # define _gl_file_offset_t int64_t # else /* see https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md */ @@ -122,10 +124,12 @@ # endif /* Up to this commit from 2015-10-12 <https://android.googlesource.com/platform/bionic.git/+/f0141dfab10a4b332769d52fa76631a64741297a> - the innards of FILE were public, and fp_ub could be defined like for OpenBSD, + the innards of FILE were public, see <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/fileext.h> and <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/local.h>. - After this commit, the innards of FILE are hidden. */ + After this commit, the innards of FILE are hidden. Likewise for OpenBSD + up to this commit from 2025-07-16 + <https://github.com/openbsd/src/commit/b7f6c2eb760a2da367dd51d539ef06f5f3553790>. */ # define fp_ ((struct { unsigned char *_p; \ int _r; \ int _w; \ @@ -152,9 +156,8 @@ # define fp_ fp # endif -# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ || defined __minix /* NetBSD >= 1.5ZA, OpenBSD, Minix 3 */ +# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __minix /* NetBSD >= 1.5ZA, Minix 3 */ /* See <https://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup> - and <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup> and <https://github.com/Stichting-MINIX-Research-Foundation/minix/blob/master/lib/libc/stdio/fileext.h> */ struct __sfileext { @@ -162,7 +165,7 @@ /* More fields, not relevant here. */ }; # define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub -# elif defined __ANDROID__ /* Android */ +# elif defined __ANDROID__ || defined __OpenBSD__ /* Android & OpenBSD */ struct __sfileext { struct { unsigned char *_base; size_t _size; } _ub; /* ungetc buffer */ @@ -175,9 +178,11 @@ # define HASUB(fp) (fp_ub._base != NULL) -# if defined __ANDROID__ /* Android */ - /* Needed after this commit from 2016-01-25 - <https://android.googlesource.com/platform/bionic.git/+/e70e0e9267d069bf56a5078c99307e08a7280de7> */ +# if defined __ANDROID__ || defined __OpenBSD__ /* Android & OpenBSD */ + /* Needed after this Android commit from 2016-01-25 + <https://android.googlesource.com/platform/bionic.git/+/e70e0e9267d069bf56a5078c99307e08a7280de7> + And after this OpenBSD commit from 2025-07-16 + <https://github.com/openbsd/src/commit/b7f6c2eb760a2da367dd51d539ef06f5f3553790>. */ # ifndef __SEOF # define __SLBF 1 # define __SNBF 2 -- 2.50.1