newLISP Fan Club

Forum => newLISP in the real world => Topic started by: bludra84 on September 28, 2009, 10:22:47 PM

Title: Odd crash
Post by: bludra84 on September 28, 2009, 10:22:47 PM
I have been messing with some code to respond to simple HTTP requests and have run into a weird bug. The following code results in a crash with this error:
 
Quote*** glibc detected *** /usr/bin/newlisp: double free or corruption (fasttop): 0x


#!/usr/bin/newlisp

(constant 'max-bytes 1024)

(define (error num)
    (format "Error: %d" num))

(define (process-request request)
    (set 'request (parse request " "))
    (case (first request)
        ("GET"  (get-request (request 1)))
        ("HEAD" (create-head (request 1)))
        (true   (error 501))))

(define (get-request item)
    (set 'item (replace "../" item ""))
    (if (ends-with item {.css|.html} 1) (send-file (1 item))
        (string "file not allowedn")))

(define (send-file filename)
    (if (file? filename) (read-file filename)
        (error 404)))

(define (create-head item)
    (string "head"))


;
; PROGRAM START
;
(if (not (setf listen (net-listen 8080)))
    (print (net-error)))

(while (not (net-error))
    (setf connection (net-accept listen))
    (net-receive connection message max-bytes)
    (net-send connection (process-request message))
    (close connection))


;(while true
;    (print (process-request "GET /test.html")))

(exit)


I test this by running: echo "GET /test.html" | nc localhost 8080

The while loop commented out at the bottom will run fine for me. So all the code should be ok except for the loop where I manage the connection. Have I done something weird there, or is this a bug in newlisp?
Title:
Post by: bludra84 on September 28, 2009, 10:27:09 PM
Oh, and this is in linux version 10.1.5. Thank you in advance.
Title:
Post by: TedWalther on September 29, 2009, 12:19:17 AM
Did you enable IPv6?



Ted
Title:
Post by: bludra84 on September 29, 2009, 08:34:40 AM
No, I am just using IPv4.
Title:
Post by: Lutz on September 29, 2009, 09:36:41 AM
I found a problem in the "ends-with/start-with" function, when using regular expressions.



You could either change the code in your program from:


   (if (ends-with item {.css|.html} 1) (send-file (1 item))
        (string "file not allowedn")))


to:


   (if (find {.html$|.css$} item 1) (send-file (1 item))
        (string "file not allowedn")))


or make the following change in nl-liststr.c in function startsEndsWith()



from:


       {
        free(keydollar);
        if(pos + klen == slen)
            return(trueCell);
        }


to:


       if(pos + klen == slen)
            {
            free(keydollar);
            return(trueCell);
            }


in the newLISP source code.
Title:
Post by: Lutz on September 29, 2009, 09:41:53 AM
... but the test will still fail in your program because 'item' contains a trailing line-feed.


(println "=>" item "<=")

=>/test.html
<=
Title:
Post by: bludra84 on September 29, 2009, 09:43:02 AM
Ahh, thanks for the help! So is this a bug that will be fixed or was I missinterpreting how to use ends-with?
Title:
Post by: Lutz on September 29, 2009, 09:44:06 AM
you have used 'ends-with' correctly.
Title:
Post by: Lutz on September 29, 2009, 09:46:51 AM
You could use 'trim' to get rid of the trailing line feed.
Title:
Post by: bludra84 on September 29, 2009, 09:47:23 AM
Great, thanks for the tip.