Re: Memory access problem with DBI or DBD-Mysql?

Patrick Galbraith <[email protected]>
Newsgroups gmane.comp.db.mysql.perl,gmane.comp.lang.perl.modules.dbi.general
Message-ID <[email protected]>
Federico Giannici wrote:

Federico,

Hmm.... One of the problems I had is that I didn't have a Open BSD box 
to test this out. Perhaps your second suggestion might be a solution to 
pursue. I would prefer that the argument to mysql_st_internal_execute 
take one type of argument.

BTW - how does it work if you use server-side prepare?

Kind regards,

Patrick

> Hi Patrick,
> I have seen that version 3.0007 has been released and it (should) have 
> fixed that bug.
> But...
>
> 1) In mysql_st_internal_execute() the "bind_type_guessing" variable is 
> correctly set, but then it's NOT used: "imp_dbh->bind_type_guessing" 
> is still used!
>
> 2) mysql_st_internal_execute() is used in only two places. Instead of 
> doing all that tests at the beginning of the function to handle both 
> cases (STH and DBH for the "h" parameter), why don't you change the 
> type of the first parameter into a "imp_dbh"? Wouldn't everything be 
> clearer this way?
>
>
> Bye.
>
>
>
> Federico Giannici wrote:
>
>> Hi Patrick,
>> are there any news about this bug?
>>
>> Someone made me notice that there a few other "tickets" open on this 
>> bug (under i386 and amd64), like this one:
>>
>> http://rt.cpan.org/Public/Bug/Display.html?id=20868
>>
>> Thanks.
>>
>>
>>
>> Patrick Galbraith wrote:
>>
>>> Federico,
>>>
>>> That may be the issue. I have encountered this issue in other parts 
>>> of the driver. There is a better way to do this, and I can look at 
>>> making sure what is being passed is the same data object.
>>>
>>> Thanks!
>>>
>>> Patrick
>>>
>>> Federico Giannici wrote:
>>>
>>>> Since there has been no reply to my previous message, I have done 
>>>> further investigations trying to find the problem.
>>>>
>>>> Please note that my knowledge of DBI/DBD is almost null, so the 
>>>> followings are only simple suppositions.
>>>>
>>>> I have seen that mysql_st_internal_execute() function is executed 
>>>> by both the "do" and "execute" methods. It seems that the problems 
>>>> are only with the "do" method and not with the "execute", so I 
>>>> looked for the differences between them.
>>>>
>>>> The main difference seems to be that "execute" passes a STATEMENT 
>>>> handle as first argument, while "do" passes a DATABASE handle. The 
>>>> mysql_st_internal_execute() function uses this handle to obtain the 
>>>> sth and then from this one the dbh.
>>>>
>>>> So, my hypothesis is that if the initial handle is a database one, 
>>>> the sth (and the derived dbh) obtained from this is not a valid one!
>>>>
>>>> Anybody can confirm (or negate) this wild hypothesis?
>>>>
>>>> Thanks.
>>>>
>>>> P.S.
>>>> I want to repeat that the problem manifest itself only under 
>>>> OpenBSD because of it's memory management that cause the program to 
>>>> segfault if try to access a non allocated memory. In other 
>>>> operating systems, a random value is get for 
>>>> "imp_dbh->bind_type_guessing", which is almost irrelevant.
>>>>
>>>>
>>>> Federico Giannici wrote:
>>>>
>>>>> It seems to me that there is some kind of memory access problem 
>>>>> with DBI or DBD-Mysql.
>>>>>
>>>>> I'm using OpenBSD 3.9-stable amd64. On OpenBSD 3.3 i386 the 
>>>>> problem didn't appeared. As you may know, recent version of 
>>>>> OpenBSD have a new kind of memory handling that make the programs 
>>>>> segfault when they try to access no (longer) allocated memory.
>>>>>
>>>>> I'm using DBI 1.45 and DBD-Mysql 2.9008. I tried DBI 1.52 and 
>>>>> DBD-Mysql 3.0006, but the problems were more frequent, so I 
>>>>> remained to the old versions.
>>>>>
>>>>> Here is the problem: frequently some "do" commands cause perl to 
>>>>> crash with signal 11. The crashes seems to depend on a lot of 
>>>>> factors. For example, loading more libraries could make the 
>>>>> program to start working. I think it depends on the structure of 
>>>>> the memory allocated to the program.
>>>>>
>>>>> Here is the "bt" output of the core dump:
>>>>>
>>>>> #0  0x000000005260a736 in mysql_st_internal_execute (h=0x4713b6e0, 
>>>>> statement=0x479b7140, attribs=0x4aa5fd40, numParams=0, params=0x0,
>>>>>     cdaPtr=0x7f7ffffc8610, svsock=0x43c90498, 
>>>>> use_mysql_use_result=0) at dbdimp.c:1654
>>>>> #1  0x0000000052612da3 in XS_DBD__mysql__db_do (cv=0x40970b20) at 
>>>>> mysql.xs:222
>>>>> #2  0x0000000050ddf07b in XS_DBI_dispatch () from 
>>>>> /usr/local/libdata/perl5/site_perl/amd64-openbsd/auto/DBI/DBI.so
>>>>> #3  0x000000004a5a1c47 in Perl_pp_entersub () at 
>>>>> /usr/src/gnu/usr.bin/perl/pp_hot.c:2890
>>>>> #4  0x000000004a60899e in Perl_runops_standard () at 
>>>>> /usr/src/gnu/usr.bin/perl/run.c:37
>>>>> #5  0x000000004a5f744d in S_run_body (oldscope=1) at 
>>>>> /usr/src/gnu/usr.bin/perl/perl.c:1936
>>>>> #6  0x000000004a5f7231 in perl_run (my_perl=0x45356258) at 
>>>>> /usr/src/gnu/usr.bin/perl/perl.c:1855
>>>>> #7  0x0000000000401afe in main ()
>>>>>
>>>>> I have found the problem is caused by accessing 
>>>>> "imp_dbh->bind_type_guessing" for the call to ParseParam() inside 
>>>>> mysql_st_internal_execute().
>>>>>
>>>>> I have verified that "imp_dbh" is NOT null, but trying to access 
>>>>> any member make the program segfault. So maybe the pointer is a 
>>>>> stale one?
>>>>>
>>>>> I have not enough knowledge of DBI to make more debugging.
>>>>>
>>>>>
>>>>> Bye.
>>>>
>
>


-- 
MySQL Perl Mailing List
For list archives: http://lists.mysql.com/perl
To unsubscribe:    http://lists.mysql.com/[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.