write死循环漏洞修复

Signed-off-by: 吴敏杰 <wuminjie2@h-partners.com>
This commit is contained in:
吴敏杰
2025-07-21 08:10:10 +00:00
committed by Gitee
parent 9e1d19b3a0
commit 6bbcd01421
2 changed files with 28 additions and 0 deletions
+24
View File
@@ -565,6 +565,29 @@ c_print(const char **wp)
po.coproc = po.copipe = false;
s = Xstring(xs, xp);
#ifdef MKSH_OH_ADAPT
unsigned int retry_count = 0
while (len > 0) {
ssize_t nwritten = write(po.fd, s, len);
retry_count = nwritten ? 0 : retry_count + 1;
if (nwritten < 0 || retry_count > = MAX_WRITE_RETRY_TIME) {
if (nwritten < 0 && errno == EINTR) {
if (po.copipe)
restore_pipe();
/* give the user a chance to ^C out */
intrcheck();
/* interrupted, try again */
if (po.coproc)
po.copipe = block_pipe();
continue;
}
c = 1;
break;
}
s += nwritten;
len -= nwritten;
}
#else
while (len > 0) {
ssize_t nwritten;
@@ -585,6 +608,7 @@ c_print(const char **wp)
s += nwritten;
len -= nwritten;
}
#endif
if (po.copipe)
restore_pipe();
}
+4
View File
@@ -258,6 +258,10 @@ typedef void (*sig_t)(int);
typedef MKSH_TYPEDEF_SIG_ATOMIC_T sig_atomic_t;
#endif
#ifdef MKSH_OH_ADAPT
#define MAX_WRITE_RETRY_TIME 10
#endif
#ifdef MKSH_TYPEDEF_SSIZE_T
typedef MKSH_TYPEDEF_SSIZE_T ssize_t;
#endif