[Asterisk-Users] app_dbodbc segfault

Mike Machado
2004-04-30T12:05:02Z

Is anyone out there using app_dbodbc
(http://www.bkw.org/~brian/app_dbodbc.c)? Any problems with it?

I was able to get it all working, but it causes * to segfault every now
and then. It does not appear to be related to any specific function
(ODBCget,ODBCput,ODBCdel,ODBCdelltree). It is 100% repeatable. If I
noload the module, everything works fine, but when its running, after
calls to any of the applications, * will randomly segfault. The data is
going in and out of the database with no problems. I compared the code
to app_db.c, and its very similar. I cannot see anything that would be
causing it.

I am using latest CVS as of an hour ago. ODBC connection is to a mysql
database.

For what its worth, I ported app_dbodbc.c to a new app_dbmysql.c and
created MySQLget, MySQLput, MySQLdel and MySQLdeltree, and experience
the exact same problem. If anyone wants the app_dbmysql.c, let me know.


I am using this to implement the call forward examples found at
voip-info.org. extensions.conf snippit:


[macro-sipexten]

exten => s,1,SetVar(OrigNum=${ARG1})

exten => s,2,ODBCput(CallReturn/${ARG1}=${CALLERIDNUM})
exten => s,3,ODBCget(temp=CFIM/${ARG1}) ; Get CFIM key, if not existing,
goto 104
exten => s,4,Goto(default|${temp}|1)   ; Unconditional forward
exten => s,5,Dial(SIP/${ARG1},20) ; 20sec timeout
exten => s,6,ODBCget(temp2=CFBS/${ARG1})  ; Get CFBS key, if not
existing, goto 107
exten => s,7,Goto(default|${temp2}|1) ; Forward on busy or unavailable

; No CFIM key
exten => s,104,Goto(s,5)

; No CFBS key - voicemail
exten => s,107,Voicemail(u${ARG1}) ; If no voicemail box for this user,
goto 208
exten => s,108,Hangup

exten => s,208,Playback(ss-noservice) ; Play no service message
exten => s,209,SayDigits(${ARG1})     ; and say back the number they
called
exten => s,210,Hangup




At startup:

 [app_dbodbc.so] => (Database access functions for Asterisk extension
logic)
  == Parsing '/etc/asterisk/odbc.conf': Found
       > app_dbodbc: dsn is MySQL-asterisk
       > app_dbodbc: username is asterisk
       > app_dbodbc: password is [secret]
       > app_dbodbc: Connected to MySQL-asterisk
  == Registered application 'ODBCget'
  == Registered application 'ODBCput'
  == Registered application 'ODBCdel'
  == Registered application 'ODBCdeltree'



Sample crash:


 -- Starting simple switch on 'Zap/23-1'
    -- Executing Macro("Zap/23-1", "sipexten|9161111111") in
new stack
    -- Executing SetVar("Zap/23-1", "OrigNum=9161111111") in
new stack
    -- Executing ODBCput("Zap/23-1",
"CallReturn/9161111111=9162222222")
in new stack
    -- odbcput: family=CallReturn, key=9161111111, value=9162222222
       > app_dbodbc: Query Successful!
       > app_dbodbc: Query Successful!
    -- Executing ODBCget("Zap/23-1", "temp=CFIM/9161111111")
in new
stack
    -- odbcget: varname=temp, family=CFIM, key=9161111111
       > app_dbodbc: Query Successful!
    -- odbcget: Value not found in database.
    -- Executing Goto("Zap/23-1", "s|5") in new stack
    -- Goto (macro-sipexten,s,5)
    -- Executing Dial("Zap/23-1", "SIP/9161111111|20") in
new stack
Segmentation fault
smf-ast1:~# Ouch ... error while writing audio data: : Broken pipe



As I said, if I change these back to DBxxx, and noload app_dbodbc.so, no
problems at all. 100% repeatable. When I look in the astdb mysql table,
all the data that was ODBCput is there.

Thoughts?