[JSC] WTFGetBacktrace can return numberOfFrames == 0 in some architectures
authorticaiolima@gmail.com <ticaiolima@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 1 Jul 2017 21:42:43 +0000 (21:42 +0000)
committerticaiolima@gmail.com <ticaiolima@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 1 Jul 2017 21:42:43 +0000 (21:42 +0000)
https://bugs.webkit.org/show_bug.cgi?id=172768

Reviewed by Mark Lam.

In some architectures, like ARMv6 running on a Raspberry pi, the
backtrace function from "execinfo.h" is returning 0. In
that case, the RELEASE_ASSERT in StackTrace::captureStackTrace
fails causing a runtime crash.
This patch is adding a guard for the case described above to
avoid a runtime crash in such case.

* wtf/StackTrace.cpp:
(WTF::StackTrace::captureStackTrace):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@219053 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/StackTrace.cpp

index a8eed54..06ca92d 100644 (file)
@@ -1,3 +1,20 @@
+2017-07-01  Caio Lima  <ticaiolima@gmail.com>
+
+        [JSC] WTFGetBacktrace can return numberOfFrames == 0 in some architectures
+        https://bugs.webkit.org/show_bug.cgi?id=172768
+
+        Reviewed by Mark Lam.
+
+        In some architectures, like ARMv6 running on a Raspberry pi, the
+        backtrace function from "execinfo.h" is returning 0. In
+        that case, the RELEASE_ASSERT in StackTrace::captureStackTrace
+        fails causing a runtime crash.
+        This patch is adding a guard for the case described above to
+        avoid a runtime crash in such case.
+
+        * wtf/StackTrace.cpp:
+        (WTF::StackTrace::captureStackTrace):
+
 2017-07-01  Dan Bernstein  <mitz@apple.com>
 
         [macOS] Remove code only needed when building for OS X Yosemite
index d5818b4..ce7c3eb 100644 (file)
@@ -58,8 +58,12 @@ StackTrace* StackTrace::captureStackTrace(int maxFrames, int framesToSkip)
     int numberOfFrames = maxFrames + framesToSkip;
 
     WTFGetBacktrace(&trace->m_skippedFrame0, &numberOfFrames);
-    RELEASE_ASSERT(numberOfFrames >= framesToSkip);
-    trace->m_size = numberOfFrames - framesToSkip;
+    if (numberOfFrames) {
+        RELEASE_ASSERT(numberOfFrames >= framesToSkip);
+        trace->m_size = numberOfFrames - framesToSkip;
+    } else
+        trace->m_size = 0;
+
     trace->m_capacity = maxFrames;
 
     return trace;