diff options
Diffstat (limited to 'shell/ash.c')
-rw-r--r-- | shell/ash.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/shell/ash.c b/shell/ash.c index 70ee15ed8..60c8ffeb7 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -13268,6 +13268,7 @@ readcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) | |||
13268 | /* "read -s" needs to save/restore termios, can't allow ^C | 13268 | /* "read -s" needs to save/restore termios, can't allow ^C |
13269 | * to jump out of it. | 13269 | * to jump out of it. |
13270 | */ | 13270 | */ |
13271 | again: | ||
13271 | INT_OFF; | 13272 | INT_OFF; |
13272 | r = shell_builtin_read(setvar0, | 13273 | r = shell_builtin_read(setvar0, |
13273 | argptr, | 13274 | argptr, |
@@ -13280,6 +13281,12 @@ readcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) | |||
13280 | ); | 13281 | ); |
13281 | INT_ON; | 13282 | INT_ON; |
13282 | 13283 | ||
13284 | if ((uintptr_t)r == 1 && errno == EINTR) { | ||
13285 | /* to get SIGCHLD: sleep 1 & read x; echo $x */ | ||
13286 | if (pending_sig == 0) | ||
13287 | goto again; | ||
13288 | } | ||
13289 | |||
13283 | if ((uintptr_t)r > 1) | 13290 | if ((uintptr_t)r > 1) |
13284 | ash_msg_and_raise_error(r); | 13291 | ash_msg_and_raise_error(r); |
13285 | 13292 | ||