summaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenys Vlasenko2016-11-04 16:43:18 +0100
committerDenys Vlasenko2016-11-04 16:43:18 +0100
commit06b114900fc57cac0e422d26228f4d0aaf5d2288 (patch)
treef8c0aea330b697bb2a1e86833091b5c76407c954 /shell
parent834aba3b72cb0e45153b95fed991522f7f1986c9 (diff)
downloadbusybox-06b114900fc57cac0e422d26228f4d0aaf5d2288.zip
busybox-06b114900fc57cac0e422d26228f4d0aaf5d2288.tar.gz
ash: fix "duplicate local" code (forgot to re-enable interrupts)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/shell/ash.c b/shell/ash.c
index f756428..87f2127 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -32,6 +32,7 @@
#define DEBUG_TIME 0
#define DEBUG_PID 1
#define DEBUG_SIG 1
+#define DEBUG_INTONOFF 0
#define PROFILE 0
@@ -442,10 +443,18 @@ static void exitshell(void) NORETURN;
* much more efficient and portable. (But hacking the kernel is so much
* more fun than worrying about efficiency and portability. :-))
*/
-#define INT_OFF do { \
+#if DEBUG_INTONOFF
+# define INT_OFF do { \
+ TRACE(("%s:%d INT_OFF(%d)\n", __func__, __LINE__, suppress_int)); \
suppress_int++; \
barrier(); \
} while (0)
+#else
+# define INT_OFF do { \
+ suppress_int++; \
+ barrier(); \
+} while (0)
+#endif
/*
* Called to raise an exception. Since C doesn't include exceptions, we
@@ -513,7 +522,14 @@ int_on(void)
raise_interrupt();
}
}
-#define INT_ON int_on()
+#if DEBUG_INTONOFF
+# define INT_ON do { \
+ TRACE(("%s:%d INT_ON(%d)\n", __func__, __LINE__, suppress_int-1)); \
+ int_on(); \
+} while (0)
+#else
+# define INT_ON int_on()
+#endif
static IF_ASH_OPTIMIZE_FOR_SIZE(inline) void
force_int_on(void)
{
@@ -9101,7 +9117,7 @@ mklocal(char *name)
/* else:
* it's a duplicate "local VAR" declaration, do nothing
*/
- return;
+ goto ret;
}
lvp = lvp->next;
}
@@ -9140,6 +9156,7 @@ mklocal(char *name)
lvp->vp = vp;
lvp->next = localvars;
localvars = lvp;
+ ret:
INT_ON;
}