allow locale's decimal point as radix character when parsing fixed-point decimal into seconds and fractional seconds; handle case of shell script file descriptor being made non-blocking; fix smalkl memory leak in programmable completion of shell option names; fix for patsub_replacement behavior when BASH_COMPAT = 42 and the replacement string is quoted; fix for readine when changing show-mode-in-prompt variable

This commit is contained in:
Chet Ramey
2025-12-17 09:59:56 -05:00
parent f27bf94a79
commit 2cdb2f9b31
12 changed files with 241 additions and 38 deletions
+39 -19
View File
@@ -510,33 +510,53 @@ b_fill_buffer (BUFFERED_STREAM *bp)
if (bp->b_flag & B_ERROR) /* try making read errors `sticky' */
return EOF;
/* In an environment where text and binary files are treated differently,
compensate for lseek() on text files returning an offset different from
the count of characters read() returns. Text-mode streams have to be
treated as unbuffered. */
if ((bp->b_flag & (B_TEXT | B_UNBUFF)) == B_TEXT)
while (1) /* loop to handle non-blocking fds */
{
o = lseek (bp->b_fd, 0, SEEK_CUR);
nr = zread (bp->b_fd, bp->b_buffer, bp->b_size);
if (nr > 0 && nr < lseek (bp->b_fd, 0, SEEK_CUR) - o)
/* In an environment where text and binary files are treated differently,
compensate for lseek() on text files returning an offset different from
the count of characters read() returns. Text-mode streams have to be
treated as unbuffered. */
if ((bp->b_flag & (B_TEXT | B_UNBUFF)) == B_TEXT)
{
lseek (bp->b_fd, o, SEEK_SET);
bp->b_flag |= B_UNBUFF;
bp->b_size = 1;
o = lseek (bp->b_fd, 0, SEEK_CUR);
nr = zread (bp->b_fd, bp->b_buffer, bp->b_size);
if (nr > 0 && nr < lseek (bp->b_fd, 0, SEEK_CUR) - o)
{
lseek (bp->b_fd, o, SEEK_SET);
bp->b_flag |= B_UNBUFF;
bp->b_size = 1;
nr = zread (bp->b_fd, bp->b_buffer, bp->b_size);
}
}
}
else
nr = zread (bp->b_fd, bp->b_buffer, bp->b_size);
if (nr <= 0)
{
else
nr = zread (bp->b_fd, bp->b_buffer, bp->b_size);
if (nr > 0)
break;
bp->b_used = bp->b_inputp = 0;
bp->b_buffer[0] = 0;
if (nr == 0)
bp->b_flag |= B_EOF;
{
bp->b_flag |= B_EOF;
return (EOF);
}
else if (errno == X_EAGAIN || errno == X_EWOULDBLOCK)
{
if (sh_unset_nodelay_mode (bp->b_fd) < 0)
{
sys_error (_("cannot reset nodelay mode for fd %d"), bp->b_fd);
bp->b_flag |= B_ERROR;
return (EOF);
}
continue;
}
else
bp->b_flag |= B_ERROR;
return (EOF);
{
bp->b_flag |= B_ERROR;
return (EOF);
}
}
bp->b_used = nr;