unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#27706: MacOS: decode-time hang
@ 2017-07-15 14:19 Charles A. Roelli
  2017-07-15 21:32 ` Alan Third
  2017-09-30 19:09 ` Charles A. Roelli
  0 siblings, 2 replies; 9+ messages in thread
From: Charles A. Roelli @ 2017-07-15 14:19 UTC (permalink / raw)
  To: 27706

Evaluating the following form on my system (macOS 10.6) results in a
hang from Emacs 23 to master:

(decode-time '(-1034058203136 0))

[other values around -1034058203136 don't cause an issue]

The stack trace (stuck in macOS' libc, I think):

(gdb) bt full
#0  0x00007fff83860aef in timesub () from /usr/lib/libSystem.B.dylib
No symbol table info available.
#1  0x00007fff8386081c in _st_localsub () from /usr/lib/libSystem.B.dylib
No symbol table info available.
#2  0x00007fff83869d71 in localtime_r () from /usr/lib/libSystem.B.dylib
No symbol table info available.
#3  0x00000001004586c7 in localtime_rz (tz=0x10210bba0, 
t=0x7fff5fbf8d20, tm=0x7fff5fbf8ce8) at time_rz.c:296
         abbr_saved = false
         old_tz = 0x1
#4  0x00000001002ba08b in emacs_localtime_rz (tz=0x10210bba0, 
t=0x7fff5fbf8d20, tm=0x7fff5fbf8ce8) at editfns.c:103
No locals.
#5  0x00000001002c2680 in Fdecode_time (specified_time=..., zone=...) at 
editfns.c:2163
         time_spec = -67768038400720896
         gmt_tm = {
           tm_sec = 1606388960,
           tm_min = 32767,
           tm_hour = 1766166,
           tm_mday = 1,
           tm_mon = 0,
           tm_year = 0,
           tm_wday = 0,
           tm_yday = 0,
           tm_isdst = 0,
           tm_gmtoff = 10261984,
           tm_zone = 0x7fff5fbf8d30 "`\215\277_\377\177"
         }
         tz = 0x10210bba0
         local_tm = {
           tm_sec = 24,
           tm_min = 38,
           tm_hour = 8,
           tm_mday = 32767,
           tm_mon = 0,
           tm_year = 0,
           tm_wday = 0,
           tm_yday = 0,
           tm_isdst = 0,
           tm_gmtoff = 0,
           tm_zone = 0x0
         }
         tm = 0x0
         tm_year_base = 0

The form is called when compiling the new org-timer.el, which requires
org-clock.el, which itself contains this call that causes the issue:

(defconst org-clock--oldest-date
   (let* ((dichotomy
	  (lambda (min max pred)
	    (if (funcall pred min) min
	      (cl-incf min)
	      (while (> (- max min) 1)
		(let ((mean (+ (ash min -1) (ash max -1) (logand min max 1))))
		  (if (funcall pred mean) (setq max mean) (setq min mean)))))
	    max))
	 (high
	  (funcall dichotomy
		   most-negative-fixnum
		   0
		   (lambda (m) (ignore-errors (decode-time (list m 0))))))
	 (low
	  (funcall dichotomy
		   most-negative-fixnum
		   0
		   (lambda (m) (ignore-errors (decode-time (list high m)))))))
     (list high low))
   "Internal time for oldest date representable on the system.")

As a result, "make" hangs for me, so I delete org-timer.el locally to
get around the problem for now.  But I'd like to find a more permanent
solution to make sure this doesn't happen elsewhere.

Can anyone reproduce this under macOS, and if so, under which macOS
version?  I'd like to know which versions might need a fix for this
problem.






^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#27706: MacOS: decode-time hang
  2017-07-15 14:19 bug#27706: MacOS: decode-time hang Charles A. Roelli
@ 2017-07-15 21:32 ` Alan Third
  2017-07-16 16:11   ` Charles A. Roelli
  2017-09-30 19:09 ` Charles A. Roelli
  1 sibling, 1 reply; 9+ messages in thread
From: Alan Third @ 2017-07-15 21:32 UTC (permalink / raw)
  To: Charles A. Roelli; +Cc: 27706

On Sat, Jul 15, 2017 at 04:19:39PM +0200, Charles A. Roelli wrote:
> Evaluating the following form on my system (macOS 10.6) results in a
> hang from Emacs 23 to master:
> 
> (decode-time '(-1034058203136 0))
> 
> [other values around -1034058203136 don't cause an issue]

I can’t reproduce in 10.12.
-- 
Alan Third





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#27706: MacOS: decode-time hang
  2017-07-15 21:32 ` Alan Third
@ 2017-07-16 16:11   ` Charles A. Roelli
  0 siblings, 0 replies; 9+ messages in thread
From: Charles A. Roelli @ 2017-07-16 16:11 UTC (permalink / raw)
  To: Alan Third; +Cc: 27706

Thanks for testing it.


> On 15 Jul 2017, at 23:32, Alan Third <alan@idiocy.org> wrote:
> 
>> On Sat, Jul 15, 2017 at 04:19:39PM +0200, Charles A. Roelli wrote:
>> Evaluating the following form on my system (macOS 10.6) results in a
>> hang from Emacs 23 to master:
>> 
>> (decode-time '(-1034058203136 0))
>> 
>> [other values around -1034058203136 don't cause an issue]
> 
> I can’t reproduce in 10.12.
> -- 
> Alan Third






^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#27706: MacOS: decode-time hang
  2017-07-15 14:19 bug#27706: MacOS: decode-time hang Charles A. Roelli
  2017-07-15 21:32 ` Alan Third
@ 2017-09-30 19:09 ` Charles A. Roelli
  2017-09-30 20:21   ` Alan Third
  1 sibling, 1 reply; 9+ messages in thread
From: Charles A. Roelli @ 2017-09-30 19:09 UTC (permalink / raw)
  To: 27706

> From: "Charles A. Roelli" <charles@aurox.ch>
> Date: Sat, 15 Jul 2017 16:19:39 +0200
> 
> Evaluating the following form on my system (macOS 10.6) results in a
> hang from Emacs 23 to master:
> 
> (decode-time '(-1034058203136 0))
> 
> [other values around -1034058203136 don't cause an issue]
> 
> The stack trace (stuck in macOS' libc, I think):
> 
> [...]
> 
> The form is called when compiling the new org-timer.el, which requires
> org-clock.el, which itself contains this call that causes the issue:
> 
> (defconst org-clock--oldest-date
>    (let* ((dichotomy
> 	  (lambda (min max pred)
> 	    (if (funcall pred min) min
> 	      (cl-incf min)
> 	      (while (> (- max min) 1)
> 		(let ((mean (+ (ash min -1) (ash max -1) (logand min max 1))))
> 		  (if (funcall pred mean) (setq max mean) (setq min mean)))))
> 	    max))
> 	 (high
> 	  (funcall dichotomy
> 		   most-negative-fixnum
> 		   0
> 		   (lambda (m) (ignore-errors (decode-time (list m 0))))))
> 	 (low
> 	  (funcall dichotomy
> 		   most-negative-fixnum
> 		   0
> 		   (lambda (m) (ignore-errors (decode-time (list high m)))))))
>      (list high low))
>    "Internal time for oldest date representable on the system.")
> 
> As a result, "make" hangs for me, so I delete org-timer.el locally to
> get around the problem for now.  But I'd like to find a more permanent
> solution to make sure this doesn't happen elsewhere.
> 
> Can anyone reproduce this under macOS, and if so, under which macOS
> version?  I'd like to know which versions might need a fix for this
> problem.

I'd like to fix this for emacs-26.  Is this fix okay to apply?

From b7a871e126b6e2036dbbe81b5c8b36bfbf6da419 Mon Sep 17 00:00:00 2001
From: "Charles A. Roelli" <charles@aurox.ch>
Date: Sat, 30 Sep 2017 20:42:03 +0200
Subject: [PATCH] Workaround for faulty localtime() under macOS 10.6

* lisp/org/org-clock.el (org-clock--oldest-date): Only execute
'decode-time' on times later than year -2**31 under macOS 10.6.
See Bug#27706.
---
 lisp/org/org-clock.el | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/lisp/org/org-clock.el b/lisp/org/org-clock.el
index 8df185d..97d9612 100644
--- a/lisp/org/org-clock.el
+++ b/lisp/org/org-clock.el
@@ -478,7 +478,18 @@ org-clock--oldest-date
 	  (funcall dichotomy
 		   most-negative-fixnum
 		   0
-		   (lambda (m) (ignore-errors (decode-time (list m 0))))))
+		   (lambda (m)
+                     ;; libc in macOS 10.6 hangs when decoding times
+                     ;; around year -2**31.  Limit `high' not to go
+                     ;; any earlier than that.
+                     (if (and (featurep 'ns)
+                              (string-match-p
+                               "10\\.6\\.[[:digit:]]"
+                               (shell-command-to-string
+                                "sw_vers -productVersion")))
+                         (if (> m -1034058203136)
+                             (ignore-errors (decode-time (list m 0))))
+                       (ignore-errors (decode-time (list m 0)))))))
 	 (low
 	  (funcall dichotomy
 		   most-negative-fixnum
-- 
2.9.4








^ permalink raw reply related	[flat|nested] 9+ messages in thread

* bug#27706: MacOS: decode-time hang
  2017-09-30 19:09 ` Charles A. Roelli
@ 2017-09-30 20:21   ` Alan Third
  2017-09-30 21:21     ` Noam Postavsky
  0 siblings, 1 reply; 9+ messages in thread
From: Alan Third @ 2017-09-30 20:21 UTC (permalink / raw)
  To: Charles A. Roelli; +Cc: 27706

On Sat, Sep 30, 2017 at 09:09:08PM +0200, Charles A. Roelli wrote:
> +                     (if (and (featurep 'ns)
> +                              (string-match-p
> +                               "10\\.6\\.[[:digit:]]"
> +                               (shell-command-to-string
> +                                "sw_vers -productVersion")))

I can’t speak for the issue generally as I don’t know what this code
does, but this particular check looks incorrect to me.

sw_vers doesn’t exist on GNU/Linux, and probably other platforms that
GNUstep runs on, so you can’t just use a check for NS. Probably you
need to check for Darwin, which should work on terminal only versions
of Emacs too.

    (string-equal system-type "darwin")

(There may be other ways to check, this is the only one I know.)
-- 
Alan Third





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#27706: MacOS: decode-time hang
  2017-09-30 20:21   ` Alan Third
@ 2017-09-30 21:21     ` Noam Postavsky
  2017-10-01  9:27       ` Charles A. Roelli
  0 siblings, 1 reply; 9+ messages in thread
From: Noam Postavsky @ 2017-09-30 21:21 UTC (permalink / raw)
  To: Alan Third; +Cc: Charles A. Roelli, 27706

Alan Third <alan@idiocy.org> writes:

>     (string-equal system-type "darwin")

`system-type' contains a symbol, so generally the comparison should look
like this (unless there is some strong reason to do string comparison)

    (eq system-type 'darwin)





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#27706: MacOS: decode-time hang
  2017-09-30 21:21     ` Noam Postavsky
@ 2017-10-01  9:27       ` Charles A. Roelli
  2017-10-01 17:11         ` Charles A. Roelli
  0 siblings, 1 reply; 9+ messages in thread
From: Charles A. Roelli @ 2017-10-01  9:27 UTC (permalink / raw)
  To: Noam Postavsky; +Cc: alan, 27706

> From: Noam Postavsky <npostavs@users.sourceforge.net>
> Date: Sat, 30 Sep 2017 17:21:49 -0400
> 
> Alan Third <alan@idiocy.org> writes:
> 
> >     (string-equal system-type "darwin")
> 
> `system-type' contains a symbol, so generally the comparison should look
> like this (unless there is some strong reason to do string comparison)
> 
>     (eq system-type 'darwin)

Thanks to both of you for your help.  Updated patch follows.  I've
also made the check a bit easier to read, and verified that it also
works on the Darwin terminal.

From 7ddfdae2359c07bdddeeeafd69517e02ee3ee2f5 Mon Sep 17 00:00:00 2001
From: "Charles A. Roelli" <charles@aurox.ch>
Date: Sat, 30 Sep 2017 20:42:03 +0200
Subject: [PATCH] Workaround for faulty localtime() under macOS 10.6

* lisp/org/org-clock.el (org-clock--oldest-date): Only execute
'decode-time' on times later than year -2**31 under macOS 10.6.
See Bug#27706.
---
 lisp/org/org-clock.el | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/lisp/org/org-clock.el b/lisp/org/org-clock.el
index 8df185d..2eec817 100644
--- a/lisp/org/org-clock.el
+++ b/lisp/org/org-clock.el
@@ -478,7 +478,17 @@ org-clock--oldest-date
 	  (funcall dichotomy
 		   most-negative-fixnum
 		   0
-		   (lambda (m) (ignore-errors (decode-time (list m 0))))))
+		   (lambda (m)
+                     ;; libc in macOS 10.6 hangs when decoding times
+                     ;; around year -2**31.  Limit `high' not to go
+                     ;; any earlier than that.
+                     (unless (and (eq system-type 'darwin)
+                                  (string-match-p
+                                   "10\\.6\\.[[:digit:]]"
+                                   (shell-command-to-string
+                                    "sw_vers -productVersion"))
+                                  (<= m -1034058203136))
+                       (ignore-errors (decode-time (list m 0)))))))
 	 (low
 	  (funcall dichotomy
 		   most-negative-fixnum
-- 
2.9.4






^ permalink raw reply related	[flat|nested] 9+ messages in thread

* bug#27706: MacOS: decode-time hang
  2017-10-01  9:27       ` Charles A. Roelli
@ 2017-10-01 17:11         ` Charles A. Roelli
  2017-10-07 15:33           ` Charles A. Roelli
  0 siblings, 1 reply; 9+ messages in thread
From: Charles A. Roelli @ 2017-10-01 17:11 UTC (permalink / raw)
  To: 27706; +Cc: alan, npostavs

I pushed the fix to emacs-26:

  commit bd49b6f1b39cffeaf6098bc7b0182552683b1c07

  Workaround for faulty localtime() under macOS 10.6

  * lisp/org/org-clock.el (org-clock--oldest-date): Only execute
  'decode-time' on times later than year -2**31 under macOS 10.6.
  See Bug#27706.

I'll close this bug in the next few days.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#27706: MacOS: decode-time hang
  2017-10-01 17:11         ` Charles A. Roelli
@ 2017-10-07 15:33           ` Charles A. Roelli
  0 siblings, 0 replies; 9+ messages in thread
From: Charles A. Roelli @ 2017-10-07 15:33 UTC (permalink / raw)
  To: Charles A. Roelli; +Cc: alan, 27706-done, npostavs

> Date: Sun, 01 Oct 2017 19:11:01 +0200
> From: charles@aurox.ch (Charles A. Roelli)
> CC: npostavs@users.sourceforge.net, alan@idiocy.org
> 
> I pushed the fix to emacs-26:
> 
>   commit bd49b6f1b39cffeaf6098bc7b0182552683b1c07
> 
>   Workaround for faulty localtime() under macOS 10.6
> 
>   * lisp/org/org-clock.el (org-clock--oldest-date): Only execute
>   'decode-time' on times later than year -2**31 under macOS 10.6.
>   See Bug#27706.
> 
> I'll close this bug in the next few days.

Works, closing.





^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2017-10-07 15:33 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-15 14:19 bug#27706: MacOS: decode-time hang Charles A. Roelli
2017-07-15 21:32 ` Alan Third
2017-07-16 16:11   ` Charles A. Roelli
2017-09-30 19:09 ` Charles A. Roelli
2017-09-30 20:21   ` Alan Third
2017-09-30 21:21     ` Noam Postavsky
2017-10-01  9:27       ` Charles A. Roelli
2017-10-01 17:11         ` Charles A. Roelli
2017-10-07 15:33           ` Charles A. Roelli

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).