jacquayj / GoRODS

Golang binding for iRODS C API: An iRODS client library written in Golang + C
https://godoc.org/github.com/jjacquay712/GoRODS
BSD 3-Clause "New" or "Revised" License
17 stars 5 forks source link

QueryMeta() crashes with query strings containing spaces #18

Closed simont closed 8 years ago

simont commented 8 years ago

Calling Connection.QueryMeta() with a query string like "name = Bill" works fine, using a query string that looks like "name = Bill Smith" causes things to come crashing down. Quoting didn't seem to help (e.g. "name = 'Bill Smith'")

Here's the stack trace that I see, the first line is the log record for the POST to the search form, then the fun begins.

S.

POST /search/results HTTP/1.1
fatal error: unexpected signal during runtime execution
[signal 0xb code=0x1 addr=0x0 pc=0x7f037a3ef65c]

runtime stack:
runtime.throw(0xb32780, 0x2a)
    /usr/local/go/src/runtime/panic.go:530 +0x90
runtime.sigpanic()
    /usr/local/go/src/runtime/sigpanic_unix.go:12 +0x5a
runtime.asmcgocall(0xc8201dce70, 0x481fba)
    /usr/local/go/src/runtime/asm_amd64.s:586 +0x70

goroutine 5 [syscall, locked to thread]:
runtime.cgocall(0x811a10, 0xc8201dced8, 0x0)
    /usr/local/go/src/runtime/cgocall.go:123 +0x11b fp=0xc8201dcea0 sp=0xc8201dce70
github.com/jjacquay712/GoRods._Cfunc_free(0xbb54de)
    ??:0 +0x36 fp=0xc8201dced8 sp=0xc8201dcea0
github.com/jjacquay712/GoRods.(*Connection).QueryMeta(0xc82044c3f0, 0xc8201f7ae0, 0x12, 0x0, 0x0, 0x0, 0x7f037bf29b40, 0xc82044c450)
    /home/alice/go/src/github.com/jjacquay712/GoRods/connection.go:368 +0x808 fp=0xc8201dd060 sp=0xc8201dced8
main.results(0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/github.com/bioteam/dai/route_search.go:73 +0x8cc fp=0xc8201dd428 sp=0xc8201dd060
net/http.HandlerFunc.ServeHTTP(0xb71528, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /usr/local/go/src/net/http/server.go:1618 +0x3a fp=0xc8201dd448 sp=0xc8201dd428
goji.io/internal.ContextWrapper.ServeHTTPC(0x7f037bf27bc0, 0xb71528, 0x7f037bf28e60, 0xc82044c1e0, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/goji.io/internal/http.go:18 +0x4f fp=0xc8201dd480 sp=0xc8201dd448
goji.io/internal.(*ContextWrapper).ServeHTTPC(0xc82005d790, 0x7f037bf28e60, 0xc82044c1e0, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    <autogenerated>:2 +0xca fp=0xc8201dd4c0 sp=0xc8201dd480
goji%2eio.dispatch.ServeHTTPC(0x7f037bf28e60, 0xc82044c1e0, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/goji.io/dispatch.go:17 +0xfa fp=0xc8201dd518 sp=0xc8201dd4c0
goji%2eio.(*dispatch).ServeHTTPC(0x100b198, 0x7f037bf28e60, 0xc82044c1e0, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    <autogenerated>:2 +0xbf fp=0xc8201dd550 sp=0xc8201dd518
main.authHandler.func1(0x7f037bf28ee0, 0xc82044c090, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/github.com/bioteam/dai/middleware.go:37 +0x3c4 fp=0xc8201dd858 sp=0xc8201dd550
goji%2eio.HandlerFunc.ServeHTTPC(0xc8200cb320, 0x7f037bf28ee0, 0xc82044c090, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/goji.io/goji.go:93 +0x4e fp=0xc8201dd888 sp=0xc8201dd858
main.alogger.func1(0x7f037bf28ee0, 0xc82044c090, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/github.com/bioteam/dai/middleware.go:53 +0x24a fp=0xc8201dd938 sp=0xc8201dd888
goji%2eio.HandlerFunc.ServeHTTPC(0xc8200cb340, 0x7f037bf28ee0, 0xc82044c090, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/goji.io/goji.go:93 +0x4e fp=0xc8201dd968 sp=0xc8201dd938
main.Apply404.func1(0x7f037bf28ee0, 0xc82044c090, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/github.com/bioteam/dai/middleware.go:66 +0x202 fp=0xc8201dda08 sp=0xc8201dd968
goji%2eio.HandlerFunc.ServeHTTPC(0xc8200cb360, 0x7f037bf28ee0, 0xc82044c090, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/goji.io/goji.go:93 +0x4e fp=0xc8201dda38 sp=0xc8201dda08
goji%2eio.(*Mux).ServeHTTPC(0xc820080080, 0x7f037bf28ee0, 0xc82044c090, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/goji.io/mux.go:87 +0x276 fp=0xc8201ddb08 sp=0xc8201dda38
goji%2eio.(*Mux).ServeHTTP(0xc820080080, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /home/alice/go/src/goji.io/mux.go:76 +0x82 fp=0xc8201ddb60 sp=0xc8201ddb08
net/http.serverHandler.ServeHTTP(0xc820080300, 0x7f037bf28de8, 0xc8201395f0, 0xc820160b60)
    /usr/local/go/src/net/http/server.go:2081 +0x19e fp=0xc8201ddbc0 sp=0xc8201ddb60
net/http.(*conn).serve(0xc8201c4000)
    /usr/local/go/src/net/http/server.go:1472 +0xf2e fp=0xc8201ddf88 sp=0xc8201ddbc0
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1998 +0x1 fp=0xc8201ddf90 sp=0xc8201ddf88
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:2137 +0x44e

goroutine 1 [IO wait]:
net.runtime_pollWait(0x7f037bf28c10, 0x72, 0x0)
    /usr/local/go/src/runtime/netpoll.go:160 +0x60
net.(*pollDesc).Wait(0xc820114c30, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(*pollDesc).WaitRead(0xc820114c30, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:78 +0x36
net.(*netFD).accept(0xc820114bd0, 0x0, 0x7f037bf28d08, 0xc82000cde0)
    /usr/local/go/src/net/fd_unix.go:426 +0x27c
net.(*TCPListener).AcceptTCP(0xc82007c058, 0x4d1350, 0x0, 0x0)
    /usr/local/go/src/net/tcpsock_posix.go:254 +0x4d
net/http.tcpKeepAliveListener.Accept(0xc82007c058, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:2427 +0x41
net/http.(*Server).Serve(0xc820080300, 0x7f037bf28cd0, 0xc82007c058, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:2117 +0x129
net/http.(*Server).ListenAndServe(0xc820080300, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:2098 +0x136
main.main()
    /home/alice/go/src/github.com/bioteam/dai/main.go:83 +0xd72

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1998 +0x1

goroutine 19 [chan receive]:
database/sql.(*DB).connectionOpener(0xc8200f9970)
    /usr/local/go/src/database/sql/sql.go:727 +0x45
created by database/sql.Open
    /usr/local/go/src/database/sql/sql.go:493 +0x33f

goroutine 20 [IO wait]:
net.runtime_pollWait(0x7f037bf28b50, 0x72, 0xc82015c000)
    /usr/local/go/src/runtime/netpoll.go:160 +0x60
net.(*pollDesc).Wait(0xc820114ca0, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(*pollDesc).WaitRead(0xc820114ca0, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:78 +0x36
net.(*netFD).Read(0xc820114c40, 0xc82015c000, 0x1000, 0x1000, 0x0, 0x7f037bf1f028, 0xc82005c090)
    /usr/local/go/src/net/fd_unix.go:250 +0x23a
net.(*conn).Read(0xc82007c060, 0xc82015c000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/net.go:172 +0xe4
net/http.(*connReader).Read(0xc82000c140, 0xc82015c000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:526 +0x196
bufio.(*Reader).fill(0xc82015a000)
    /usr/local/go/src/bufio/bufio.go:97 +0x1e9
bufio.(*Reader).ReadSlice(0xc82015a000, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:328 +0x21a
bufio.(*Reader).ReadLine(0xc82015a000, 0x0, 0x0, 0x0, 0xa5fd00, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:357 +0x53
net/textproto.(*Reader).readLineSlice(0xc8200136e0, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:55 +0x81
net/textproto.(*Reader).ReadLine(0xc8200136e0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:36 +0x40
net/http.readRequest(0xc82015a000, 0xb71700, 0xc820162700, 0x0, 0x0)
    /usr/local/go/src/net/http/request.go:721 +0xb6
net/http.(*conn).readRequest(0xc820080380, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:705 +0x359
net/http.(*conn).serve(0xc820080380)
    /usr/local/go/src/net/http/server.go:1425 +0x947
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:2137 +0x44e

goroutine 21 [IO wait]:
net.runtime_pollWait(0x7f037bf28a90, 0x72, 0xc820164000)
    /usr/local/go/src/runtime/netpoll.go:160 +0x60
net.(*pollDesc).Wait(0xc820114d10, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(*pollDesc).WaitRead(0xc820114d10, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:78 +0x36
net.(*netFD).Read(0xc820114cb0, 0xc820164000, 0x1000, 0x1000, 0x0, 0x7f037bf1f028, 0xc82005c090)
    /usr/local/go/src/net/fd_unix.go:250 +0x23a
net.(*conn).Read(0xc82007c068, 0xc820164000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/net.go:172 +0xe4
net/http.(*connReader).Read(0xc8200cb4e0, 0xc820164000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:526 +0x196
bufio.(*Reader).fill(0xc8200584e0)
    /usr/local/go/src/bufio/bufio.go:97 +0x1e9
bufio.(*Reader).ReadSlice(0xc8200584e0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:328 +0x21a
bufio.(*Reader).ReadLine(0xc8200584e0, 0x0, 0x0, 0x0, 0xa5fd00, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:357 +0x53
net/textproto.(*Reader).readLineSlice(0xc820156c30, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:55 +0x81
net/textproto.(*Reader).ReadLine(0xc820156c30, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:36 +0x40
net/http.readRequest(0xc8200584e0, 0xb71700, 0xc8201609a0, 0x0, 0x0)
    /usr/local/go/src/net/http/request.go:721 +0xb6
net/http.(*conn).readRequest(0xc820080400, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:705 +0x359
net/http.(*conn).serve(0xc820080400)
    /usr/local/go/src/net/http/server.go:1425 +0x947
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:2137 +0x44e

goroutine 22 [IO wait]:
net.runtime_pollWait(0x7f037bf289d0, 0x72, 0xc82015e000)
    /usr/local/go/src/runtime/netpoll.go:160 +0x60
net.(*pollDesc).Wait(0xc820114d80, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(*pollDesc).WaitRead(0xc820114d80, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:78 +0x36
net.(*netFD).Read(0xc820114d20, 0xc82015e000, 0x1000, 0x1000, 0x0, 0x7f037bf1f028, 0xc82005c090)
    /usr/local/go/src/net/fd_unix.go:250 +0x23a
net.(*conn).Read(0xc82007c070, 0xc82015e000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/net.go:172 +0xe4
net/http.(*connReader).Read(0xc8200cb580, 0xc82015e000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:526 +0x196
bufio.(*Reader).fill(0xc820058480)
    /usr/local/go/src/bufio/bufio.go:97 +0x1e9
bufio.(*Reader).ReadSlice(0xc820058480, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:328 +0x21a
bufio.(*Reader).ReadLine(0xc820058480, 0x0, 0x0, 0x0, 0xa5fd00, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:357 +0x53
net/textproto.(*Reader).readLineSlice(0xc820156c60, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:55 +0x81
net/textproto.(*Reader).ReadLine(0xc820156c60, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:36 +0x40
net/http.readRequest(0xc820058480, 0xb71700, 0xc8201622a0, 0x0, 0x0)
    /usr/local/go/src/net/http/request.go:721 +0xb6
net/http.(*conn).readRequest(0xc820080480, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:705 +0x359
net/http.(*conn).serve(0xc820080480)
    /usr/local/go/src/net/http/server.go:1425 +0x947
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:2137 +0x44e

goroutine 26 [IO wait]:
net.runtime_pollWait(0x7f037bf28850, 0x72, 0xc8201c2000)
    /usr/local/go/src/runtime/netpoll.go:160 +0x60
net.(*pollDesc).Wait(0xc8201c0680, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(*pollDesc).WaitRead(0xc8201c0680, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:78 +0x36
net.(*netFD).Read(0xc8201c0620, 0xc8201c2000, 0x1000, 0x1000, 0x0, 0x7f037bf1f028, 0xc82005c090)
    /usr/local/go/src/net/fd_unix.go:250 +0x23a
net.(*conn).Read(0xc82007c128, 0xc8201c2000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/net.go:172 +0xe4
net/http.(*connReader).Read(0xc82016b7c0, 0xc8201c2000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:526 +0x196
bufio.(*Reader).fill(0xc820058b40)
    /usr/local/go/src/bufio/bufio.go:97 +0x1e9
bufio.(*Reader).ReadSlice(0xc820058b40, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:328 +0x21a
bufio.(*Reader).ReadLine(0xc820058b40, 0x0, 0x0, 0x0, 0xa5fd00, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:357 +0x53
net/textproto.(*Reader).readLineSlice(0xc820012060, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:55 +0x81
net/textproto.(*Reader).ReadLine(0xc820012060, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:36 +0x40
net/http.readRequest(0xc820058b40, 0xb71700, 0xc820162460, 0x0, 0x0)
    /usr/local/go/src/net/http/request.go:721 +0xb6
net/http.(*conn).readRequest(0xc820080b00, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:705 +0x359
net/http.(*conn).serve(0xc820080b00)
    /usr/local/go/src/net/http/server.go:1425 +0x947
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:2137 +0x44e

goroutine 6 [IO wait]:
net.runtime_pollWait(0x7f037bf28550, 0x72, 0xc8201e7000)
    /usr/local/go/src/runtime/netpoll.go:160 +0x60
net.(*pollDesc).Wait(0xc82004e290, 0x72, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:73 +0x3a
net.(*pollDesc).WaitRead(0xc82004e290, 0x0, 0x0)
    /usr/local/go/src/net/fd_poll_runtime.go:78 +0x36
net.(*netFD).Read(0xc82004e230, 0xc8201e7000, 0x1000, 0x1000, 0x0, 0x7f037bf1f028, 0xc82005c090)
    /usr/local/go/src/net/fd_unix.go:250 +0x23a
net.(*conn).Read(0xc820020040, 0xc8201e7000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/net.go:172 +0xe4
net/http.(*connReader).Read(0xc82000ce20, 0xc8201e7000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:526 +0x196
bufio.(*Reader).fill(0xc82015a1e0)
    /usr/local/go/src/bufio/bufio.go:97 +0x1e9
bufio.(*Reader).ReadSlice(0xc82015a1e0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:328 +0x21a
bufio.(*Reader).ReadLine(0xc82015a1e0, 0x0, 0x0, 0x0, 0xa5fd00, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:357 +0x53
net/textproto.(*Reader).readLineSlice(0xc8201bed50, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:55 +0x81
net/textproto.(*Reader).ReadLine(0xc8201bed50, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/textproto/reader.go:36 +0x40
net/http.readRequest(0xc82015a1e0, 0xb71700, 0xc820162380, 0x0, 0x0)
    /usr/local/go/src/net/http/request.go:721 +0xb6
net/http.(*conn).readRequest(0xc8201c4380, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/http/server.go:705 +0x359
net/http.(*conn).serve(0xc8201c4380)
    /usr/local/go/src/net/http/server.go:1425 +0x947
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:2137 +0x44e
jjacquay712 commented 8 years ago

The issue was relating to calling C.free on error strings defined as literals (rather than dynamically malloc'd). You will need to use quotes for spaces to work in queries. I take that back, needs more investigation.

if objs, err := irods.QueryMeta("testattr = 'test again'"); err == nil {
    // Success
} else {
    // Fail
}
simont commented 8 years ago

Yes, I tried with single quotes originally and it didn't solve the issue.

simont commented 8 years ago

Thanks John, this now works with query strings with spaces in them, etc, I am passing the query string into GoRods with single quotes around the query string and that seems to do the trick.

S.