aboutsummaryrefslogtreecommitdiff
path: root/module
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2020-07-27 00:06:31 +0200
committerHugo Hörnquist <hugo@lysator.liu.se>2020-07-27 00:06:31 +0200
commitc60b7b34759f866549752a97a83c12f04f8a903e (patch)
treea732b950e38036bf007b2ae694146ccf99638a1a /module
parentChange html-id to randomly generate. (diff)
downloadcalp-c60b7b34759f866549752a97a83c12f04f8a903e.tar.gz
calp-c60b7b34759f866549752a97a83c12f04f8a903e.tar.xz
Crash properly on overflow on remove event.
Diffstat (limited to 'module')
-rw-r--r--module/entry-points/server.scm6
-rw-r--r--module/vcomponent.scm29
2 files changed, 19 insertions, 16 deletions
diff --git a/module/entry-points/server.scm b/module/entry-points/server.scm
index 711119e4..5c3108cc 100644
--- a/module/entry-points/server.scm
+++ b/module/entry-points/server.scm
@@ -117,12 +117,16 @@
;; It's hard to properly remove a file. I also want a way to undo accidental
;; deletions. Therefore I simply save the X-HNH-REMOVED flag to the file, and
;; then simple don't use those events when loading.
+ (catch 'stack-overflow (lambda () (remove-event it))
+ (lambda _
+ (display "It overflew...\n" (current-error-port))
+ (return (build-response code: 500)
+ "It overflew again...")))
(set! (prop it 'X-HNH-REMOVED) #t)
(set! (param (prop* it 'X-HNH-REMOVED) 'VALUE) "BOOLEAN")
(unless ((@ (output vdir) save-event) it)
(return (build-response code: 500)
"Saving event to disk failed."))
- (remove-event it)
(return (build-response code: 204) ""))
(return (build-response code: 400)
(format #f "No event with UID '~a'" uid))))
diff --git a/module/vcomponent.scm b/module/vcomponent.scm
index 215ab984..2e13f1c8 100644
--- a/module/vcomponent.scm
+++ b/module/vcomponent.scm
@@ -105,23 +105,22 @@
(define-public (remove-event event)
-
- (let ((events (getf 'events)))
- (setf 'events (delete event events)))
+ (let ((events (delete event (getf 'events))))
+ (setf 'events events))
(if (repeating? event)
- (let ((repeating (getf 'repeating-events)))
- (setf 'repeating-events (delete event repeating)))
- (let ((regular (getf 'fixed-events)))
- (setf 'fixed-events (delete event regular))))
-
- (let ((event-set (getf 'event-set)))
- (setf 'event-set
- (stream-remove
- (lambda (ev)
- (equal? (prop ev 'UID)
- (prop event 'UID)))
- event-set)))
+ (let ((repeating (delete event (getf 'repeating-events))))
+ (setf 'repeating-events repeating))
+ (let ((regular (delete event (getf 'fixed-events))))
+ (setf 'fixed-events regular)))
+
+ (let ((event-set
+ (stream-remove
+ (lambda (ev)
+ (equal? (prop ev 'UID)
+ (prop event 'UID)))
+ (getf 'event-set))))
+ (setf 'event-set event-set))
(hash-set! (getf 'uid-map) (prop event 'UID)
#f))