Segfault on read.socket with long message

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Segfault on read.socket with long message

Russell Almond

I'm trying to implement a connection between two processes using a
simple socket mechanism.  The messages are rather long object stored as
JSON.

R is crashing with a segmentation fault when I try to read my test
message (which is 5305 bytes long).  I first send the length in bytes
and then I send the actual message.

Here is my R code:

library(jsonlite)
library(futile.logger)
listenerloop <- function (port) {
   flog.trace("Opening Socket on port %d",port)
   sock <- make.socket("localhost",port,server=TRUE)
   on.exit({
     close.socket(sock)
     flog.trace("Closing Socket on port %d",port)
     })
   repeat {
     ## Input a hunk of stuff up to a blank line.
     output <- character()
     repeat {
       inlen <- read.socket(sock,loop=TRUE)
       flog.trace("Got message of length %s",inlen)
       if (inlen=="quit") break
       inmess <- fromJSON(read.socket(sock,as.integer(inlen)),false)
       outmess <- doProcess(inmess)
       output <- toJSON(outmess)
       flog.trace("Sending message of length %s",nchar(output))
       write.socket(sock,paste(nchar(output),"\n"))
       write.socket(sock,output)
     }
   }
}

doProcess() is the payload, but it is not getting that far.  Instead I get:

 > listenerloop(12525)
TRACE [2020-05-11 15:21:00] Opening Socket on port 12525
TRACE [2020-05-11 15:21:03] Got message of length 5305
{"StudentRecord":null,"Message":{"_id":624,"app":"ecd://terc.edu/Zoombinis/","uid":2,"context":"PIZZA_PASS1","sender":"DataArcade","mess":"Last
Transaction","timestamp":"1570279373.109","processed":false,"data":{"PP29_N_Rejects_Current_Z":0,"PP106_Avg

  *** caught segfault ***
address 0x7ffdf533d0a8, cause 'memory not mapped'

Traceback:
  1: read.socket(sock, as.integer(inlen))
  2: fromJSON(read.socket(sock, as.integer(inlen)), false)
  3: listenerloop(12525)

I have two questions:

1) Can somebody file a bug report on this?  I strongly suspect that
there is an uncaught error in read.socket().  I'm happy to help, but I
don't have access to bugzilla.

2) Anybody know how to read/write long messages to a socket in R?

Thanks in advance.
   --Russell Almond




--
Russell G. Almond
https://ralmond.net
[hidden email]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: Segfault on read.socket with long message

Tomas Kalibera
Thanks for the report, but it is unlikely anyone would be able to help
just based on this code fragment. We need a small and minimal but
complete reproducible example. That example should not use any
contributed packages (a contributed package may be corrupting memory,
which may cause R to crash).

It is easy to get a bugzilla account - please see
https://www.r-project.org/bugs.html for more and for advice on how to
write bug reports. You could even send the bug report to this list, but
the key thing is the reproducible example.

Thanks
Tomas

On 5/11/20 9:40 PM, Russell Almond wrote:

>
> I'm trying to implement a connection between two processes using a
> simple socket mechanism.  The messages are rather long object stored
> as JSON.
>
> R is crashing with a segmentation fault when I try to read my test
> message (which is 5305 bytes long).  I first send the length in bytes
> and then I send the actual message.
>
> Here is my R code:
>
> library(jsonlite)
> library(futile.logger)
> listenerloop <- function (port) {
>   flog.trace("Opening Socket on port %d",port)
>   sock <- make.socket("localhost",port,server=TRUE)
>   on.exit({
>     close.socket(sock)
>     flog.trace("Closing Socket on port %d",port)
>     })
>   repeat {
>     ## Input a hunk of stuff up to a blank line.
>     output <- character()
>     repeat {
>       inlen <- read.socket(sock,loop=TRUE)
>       flog.trace("Got message of length %s",inlen)
>       if (inlen=="quit") break
>       inmess <- fromJSON(read.socket(sock,as.integer(inlen)),false)
>       outmess <- doProcess(inmess)
>       output <- toJSON(outmess)
>       flog.trace("Sending message of length %s",nchar(output))
>       write.socket(sock,paste(nchar(output),"\n"))
>       write.socket(sock,output)
>     }
>   }
> }
>
> doProcess() is the payload, but it is not getting that far. Instead I
> get:
>
> > listenerloop(12525)
> TRACE [2020-05-11 15:21:00] Opening Socket on port 12525
> TRACE [2020-05-11 15:21:03] Got message of length 5305
> {"StudentRecord":null,"Message":{"_id":624,"app":"ecd://terc.edu/Zoombinis/","uid":2,"context":"PIZZA_PASS1","sender":"DataArcade","mess":"Last
> Transaction","timestamp":"1570279373.109","processed":false,"data":{"PP29_N_Rejects_Current_Z":0,"PP106_Avg
>
>
>  *** caught segfault ***
> address 0x7ffdf533d0a8, cause 'memory not mapped'
>
> Traceback:
>  1: read.socket(sock, as.integer(inlen))
>  2: fromJSON(read.socket(sock, as.integer(inlen)), false)
>  3: listenerloop(12525)
>
> I have two questions:
>
> 1) Can somebody file a bug report on this?  I strongly suspect that
> there is an uncaught error in read.socket().  I'm happy to help, but I
> don't have access to bugzilla.
>
> 2) Anybody know how to read/write long messages to a socket in R?
>
> Thanks in advance.
>   --Russell Almond
>
>
>
>

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: Segfault on read.socket with long message

Russell Almond
Thanks for the link.  Somehow the information about how to join the
bugzilla site was not available at bugzilla and buried in the CRAN web
site instructions on reporting bugs (which pointed me at Bugzilla and
not the page you showed me).

The example is pretty minimal.  I left the tracing statements
(flog.trace()) and the toJSON, fromJSON in as I thought they might
provide some context for another method of approaching my problem.

It looks like I'm getting better results using socketConnection() rather
than read.socket(), so I'll pursue that solution (but still file a bug
report, as it seg faults are never good).

     --Russell


On 5/12/20 5:30 AM, Tomas Kalibera wrote:

> Thanks for the report, but it is unlikely anyone would be able to help
> just based on this code fragment. We need a small and minimal but
> complete reproducible example. That example should not use any
> contributed packages (a contributed package may be corrupting memory,
> which may cause R to crash).
>
> It is easy to get a bugzilla account - please see
> https://www.r-project.org/bugs.html for more and for advice on how to
> write bug reports. You could even send the bug report to this list,
> but the key thing is the reproducible example.
>
> Thanks
> Tomas
>
> On 5/11/20 9:40 PM, Russell Almond wrote:
>>
>> I'm trying to implement a connection between two processes using a
>> simple socket mechanism.  The messages are rather long object stored
>> as JSON.
>>
>> R is crashing with a segmentation fault when I try to read my test
>> message (which is 5305 bytes long).  I first send the length in bytes
>> and then I send the actual message.
>>
>> Here is my R code:
>>
>> library(jsonlite)
>> library(futile.logger)
>> listenerloop <- function (port) {
>>   flog.trace("Opening Socket on port %d",port)
>>   sock <- make.socket("localhost",port,server=TRUE)
>>   on.exit({
>>     close.socket(sock)
>>     flog.trace("Closing Socket on port %d",port)
>>     })
>>   repeat {
>>     ## Input a hunk of stuff up to a blank line.
>>     output <- character()
>>     repeat {
>>       inlen <- read.socket(sock,loop=TRUE)
>>       flog.trace("Got message of length %s",inlen)
>>       if (inlen=="quit") break
>>       inmess <- fromJSON(read.socket(sock,as.integer(inlen)),false)
>>       outmess <- doProcess(inmess)
>>       output <- toJSON(outmess)
>>       flog.trace("Sending message of length %s",nchar(output))
>>       write.socket(sock,paste(nchar(output),"\n"))
>>       write.socket(sock,output)
>>     }
>>   }
>> }
>>
>> doProcess() is the payload, but it is not getting that far. Instead I
>> get:
>>
>> > listenerloop(12525)
>> TRACE [2020-05-11 15:21:00] Opening Socket on port 12525
>> TRACE [2020-05-11 15:21:03] Got message of length 5305
>> {"StudentRecord":null,"Message":{"_id":624,"app":"ecd://terc.edu/Zoombinis/","uid":2,"context":"PIZZA_PASS1","sender":"DataArcade","mess":"Last
>> Transaction","timestamp":"1570279373.109","processed":false,"data":{"PP29_N_Rejects_Current_Z":0,"PP106_Avg
>>
>>
>>  *** caught segfault ***
>> address 0x7ffdf533d0a8, cause 'memory not mapped'
>>
>> Traceback:
>>  1: read.socket(sock, as.integer(inlen))
>>  2: fromJSON(read.socket(sock, as.integer(inlen)), false)
>>  3: listenerloop(12525)
>>
>> I have two questions:
>>
>> 1) Can somebody file a bug report on this?  I strongly suspect that
>> there is an uncaught error in read.socket().  I'm happy to help, but
>> I don't have access to bugzilla.
>>
>> 2) Anybody know how to read/write long messages to a socket in R?
>>
>> Thanks in advance.
>>   --Russell Almond
>>
>>
>>
>>
>
--
Russell G. Almond
https://ralmond.net
[hidden email]


        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|

Re: Segfault on read.socket with long message

Tomas Kalibera

On 5/12/20 5:25 PM, Russell Almond wrote:

>
> Thanks for the link.  Somehow the information about how to join the
> bugzilla site was not available at bugzilla and buried in the CRAN web
> site instructions on reporting bugs (which pointed me at Bugzilla and
> not the page you showed me).
>
> The example is pretty minimal.  I left the tracing statements
> (flog.trace()) and the toJSON, fromJSON in as I thought they might
> provide some context for another method of approaching my problem.
>
> It looks like I'm getting better results using socketConnection()
> rather than read.socket(), so I'll pursue that solution (but still
> file a bug report, as it seg faults are never good).
>
Thanks, a report with that example would be useful - if using
socketConnection() fixes the problem, I guess it makes it more likely
that the bug is in R, but one never knows before the case is fully analyzed.

Tomas

>     --Russell
>
>
> On 5/12/20 5:30 AM, Tomas Kalibera wrote:
>> Thanks for the report, but it is unlikely anyone would be able to
>> help just based on this code fragment. We need a small and minimal
>> but complete reproducible example. That example should not use any
>> contributed packages (a contributed package may be corrupting memory,
>> which may cause R to crash).
>>
>> It is easy to get a bugzilla account - please see
>> https://www.r-project.org/bugs.html for more and for advice on how to
>> write bug reports. You could even send the bug report to this list,
>> but the key thing is the reproducible example.
>>
>> Thanks
>> Tomas
>>
>> On 5/11/20 9:40 PM, Russell Almond wrote:
>>>
>>> I'm trying to implement a connection between two processes using a
>>> simple socket mechanism.  The messages are rather long object stored
>>> as JSON.
>>>
>>> R is crashing with a segmentation fault when I try to read my test
>>> message (which is 5305 bytes long).  I first send the length in
>>> bytes and then I send the actual message.
>>>
>>> Here is my R code:
>>>
>>> library(jsonlite)
>>> library(futile.logger)
>>> listenerloop <- function (port) {
>>>   flog.trace("Opening Socket on port %d",port)
>>>   sock <- make.socket("localhost",port,server=TRUE)
>>>   on.exit({
>>>     close.socket(sock)
>>>     flog.trace("Closing Socket on port %d",port)
>>>     })
>>>   repeat {
>>>     ## Input a hunk of stuff up to a blank line.
>>>     output <- character()
>>>     repeat {
>>>       inlen <- read.socket(sock,loop=TRUE)
>>>       flog.trace("Got message of length %s",inlen)
>>>       if (inlen=="quit") break
>>>       inmess <- fromJSON(read.socket(sock,as.integer(inlen)),false)
>>>       outmess <- doProcess(inmess)
>>>       output <- toJSON(outmess)
>>>       flog.trace("Sending message of length %s",nchar(output))
>>>       write.socket(sock,paste(nchar(output),"\n"))
>>>       write.socket(sock,output)
>>>     }
>>>   }
>>> }
>>>
>>> doProcess() is the payload, but it is not getting that far. Instead
>>> I get:
>>>
>>> > listenerloop(12525)
>>> TRACE [2020-05-11 15:21:00] Opening Socket on port 12525
>>> TRACE [2020-05-11 15:21:03] Got message of length 5305
>>> {"StudentRecord":null,"Message":{"_id":624,"app":"ecd://terc.edu/Zoombinis/","uid":2,"context":"PIZZA_PASS1","sender":"DataArcade","mess":"Last
>>> Transaction","timestamp":"1570279373.109","processed":false,"data":{"PP29_N_Rejects_Current_Z":0,"PP106_Avg
>>>
>>>
>>>  *** caught segfault ***
>>> address 0x7ffdf533d0a8, cause 'memory not mapped'
>>>
>>> Traceback:
>>>  1: read.socket(sock, as.integer(inlen))
>>>  2: fromJSON(read.socket(sock, as.integer(inlen)), false)
>>>  3: listenerloop(12525)
>>>
>>> I have two questions:
>>>
>>> 1) Can somebody file a bug report on this?  I strongly suspect that
>>> there is an uncaught error in read.socket().  I'm happy to help, but
>>> I don't have access to bugzilla.
>>>
>>> 2) Anybody know how to read/write long messages to a socket in R?
>>>
>>> Thanks in advance.
>>>   --Russell Almond
>>>
>>>
>>>
>>>
>>
> --
> Russell G. Almond
> https://ralmond.net
> [hidden email]



        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel