[PATCH v7] ungetc: Guarantee single char pushback

Maciej W. Rozycki macro@redhat.com
Tue Dec 17 18:18:29 GMT 2024


On Tue, 17 Dec 2024, Siddhesh Poyarekar wrote:

> diff --git a/libio/libioP.h b/libio/libioP.h
> index 70e2bdfc9d..714abbd549 100644
> --- a/libio/libioP.h
> +++ b/libio/libioP.h
[...]
> @@ -911,30 +912,30 @@ extern int _IO_vscanf (const char *, va_list) __THROW;
>  #  define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
>         { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
>  	 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \
> -	 NULL, NULL, (FILE *) CHAIN, FD, \
> -	 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock }
> +	 NULL, NULL, (FILE *) CHAIN, FD, 0, { 0 }, \
> +	 _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock }
>  # else
>  #  define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
>         { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
>  	 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \
> -	 NULL, NULL, (FILE *) CHAIN, FD, \
> -	 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock, _IO_pos_BAD,\
> -	 NULL, WDP, NULL }
> +	 NULL, NULL, (FILE *) CHAIN, FD, 0, { 0 }, \
> +	 _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock, \
> +	 _IO_pos_BAD, NULL, WDP, NULL }
>  # endif
>  #else
>  # ifdef _IO_USE_OLD_IO_FILE
>  #  define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
>         { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
>  	 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \
> -	 NULL, NULL, (FILE *) CHAIN, FD, \
> -	 0, _IO_pos_BAD }
> +	 NULL, NULL, (FILE *) CHAIN, FD, 0, { 0 }, \
> +	 _IO_pos_BAD }
>  # else
>  #  define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \
>         { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
>  	 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \
> -	 NULL, NULL, (FILE *) CHAIN, FD, \
> -	 0, _IO_pos_BAD, 0, 0, { 0 }, 0, _IO_pos_BAD, \
> -	 NULL, WDP, NULL }
> +	 NULL, NULL, (FILE *) CHAIN, FD, 0, { 0 }, \
> +	 _IO_pos_BAD, 0, 0, { 0 }, NULL, \
> +	 _IO_pos_BAD, NULL, WDP, NULL }

 OK, line breaks now aligned, thank you.  As mentioned for v6 please split 
the final NULL fix off from this change.

> @@ -1040,6 +1041,15 @@ IO_validate_vtable (const struct _IO_jump_t *vtable)
>    return vtable;
>  }
>  
> +/* In case of an allocation failure, we resort to using the fixed buffer
> +   _SHORT_BACKUPBUF.  Free PTR unless it points to that buffer.  */

 OK.

> +static __always_inline void
> +_IO_free_backup_buf (FILE *fp, char *ptr)

 OK.

 No need to repost as far as I'm concerned just for the NULL fix update 
mentioned above; this is:

Reviewed-by: Maciej W. Rozycki <macro@redhat.com>

with said update applied.  Thank you for your contribution.

  Maciej



More information about the Libc-alpha mailing list