File socat-1.7.2.1.patch of Package socat.546
diff --git a/xio-readline.c b/xio-readline.c
index 5ffd8ed..dd6998e 100644
--- a/xio-readline.c
+++ b/xio-readline.c
@@ -214,25 +214,26 @@ void xioscan_readline(struct single *pipe, const void *buff, size_t bytes) {
if (pipe->dtype == XIODATA_READLINE && pipe->para.readline.dynprompt) {
/* we save the last part of the output as possible prompt */
const void *ptr = buff;
- const void *pcr = memrchr(buff, '\r', bytes);
- const void *plf = memrchr(buff, '\n', bytes);
+ const void *pcr;
+ const void *plf;
size_t len;
+
if (bytes > pipe->para.readline.dynbytes) {
ptr = (const char *)buff + bytes - pipe->para.readline.dynbytes;
+ len = pipe->para.readline.dynbytes;
+ } else {
+ len = bytes;
}
- if (pcr) {
- /* forget old prompt */
- pipe->para.readline.dynend = pipe->para.readline.dynprompt;
- /* new prompt starts here */
- ptr = (const char *)pcr+1;
- }
- if (plf && plf >= ptr) {
+ pcr = memrchr(ptr, '\r', len);
+ plf = memrchr(ptr, '\n', len);
+ if (pcr != NULL || plf != NULL) {
+ const void *peol = Max(pcr, plf);
/* forget old prompt */
pipe->para.readline.dynend = pipe->para.readline.dynprompt;
+ len -= (peol+1 - ptr);
/* new prompt starts here */
- ptr = (const char *)plf+1;
+ ptr = (const char *)peol+1;
}
- len = (const char *)buff-(const char *)ptr+bytes;
if (pipe->para.readline.dynend - pipe->para.readline.dynprompt + len >
pipe->para.readline.dynbytes) {
memmove(pipe->para.readline.dynprompt,
@@ -243,7 +244,6 @@ void xioscan_readline(struct single *pipe, const void *buff, size_t bytes) {
pipe->para.readline.dynprompt + pipe->para.readline.dynbytes - len;
}
memcpy(pipe->para.readline.dynend, ptr, len);
- /*pipe->para.readline.dynend = pipe->para.readline.dynprompt + len;*/
pipe->para.readline.dynend = pipe->para.readline.dynend + len;
}
return;
--
1.7.0.4