Bug #7080

Segmentation Fault (sometimes) when running script

Added by Sam Nissen over 1 year ago. Updated over 1 year ago.

[ruby-core:47712]
Status:Third Party's Issue
Priority:Normal
Assignee:Luis Lavena
Category:-
Target version:-
ruby -v:ruby 1.9.3p194 (2012-04-20) [i386-mingw32] Backport:

Description

When I run the Ruby script in cmd line in Windows 7, most of the time I get this 'Segmentation fault'. Maybe one time in 20 a fault is not returned. Additionally one time I received more detailed Segmentation fault details, which I've pasted at the bottom. I wish I had a more sophisticated understanding of what is going on, but unfortunately I'm fairly new at this...

BEGIN COMMAND LINE (typical response)
C:\Users\first.last\rubystuff>ruby QAtest.rb
Not an admin.
Logged in!
QA
test.rb: [BUG] Segmentation fault
ruby 1.9.3p194 (2012-04-20) [i386-mingw32]

-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0002 b:0002 l:0012ac d:0012ac TOP

-- C level backtrace information -------------------------------------------
END COMMAND LINE (typical response)

BEGIN CODE
require 'rubygems'
require 'mysql'

class Login

def initialize()
    @no_html = "<>/"
    @check_for_html = /[#{@no_html.gsub(/./){|char| "\\#{char}"}}]/
    @min_length = 1
    @max_length = 35
end

def check_length_and_html(string_to_check, minlength, maxlength, varname)
    if string_to_check.length() > maxlength
        print "Sorry that #{varname} is longer than #{maxlength} characters. "
        return false
    elsif string_to_check.length() < minlength
        print "Sorry that #{varname} is shorter than #{minlength} characters. "
        return false
    elsif string_to_check =~ @check_for_html
        print "Sorry that #{varname} contains an invalid special character (#{@no_html}). "
        return false
    else
        return true
        #return string_to_check
    end
end # check_length_and_html(var)

def create_sesssion(username, password)
    username = username.to_s
    password = password.to_s

    if check_length_and_html(username, @min_length, @max_length, "username") and check_length_and_html(password, @min_length, @max_length, "password")
        is_admin(username, password)
    else
        return false
    end
end # create_sesssion()

def is_admin(username, password)
    begin
        mysql_connection = Mysql.new 'localhost', 'user12', '34klq*', 'mydb'
        is_admin = mysql_connection.query("SELECT * FROM test_users3 WHERE userName = '#{username}' AND password = '#{password}' AND is_admin = TRUE")
        is_admin_arr = Array.new

        is_admin.each do |row|
            is_admin_arr.unshift(row)
        end

        if is_admin_arr.length > 0
            puts "is_admin_arr is #{is_admin_arr}"
            puts "Logged in as admin."
            return true
        else
            puts "Not an admin."
            can_login(username, password)
        end
    end # sql begin
end # is_admin()

def can_login(username, password)
    begin
        mysql_connection = Mysql.new 'localhost', 'user12', '34klq*', 'mydb'
        matching_username_and_password = mysql_connection.query("SELECT * FROM test_users3 WHERE userName = '#{username}' AND password = '#{password}' AND is_admin = 'TRUE'")
        matching_username_and_password_arr = Array.new

        matching_username_and_password.each do |row|
            matching_username_and_password_arr.unshift(row)
        end

        if matching_username_and_password_arr.length > 0
            puts "Logged in!"
            return true
        else
            puts "Nice try."
            return false
        end

        matching_username_and_password = mysql_connection.query("SELECT * FROM test_users3 WHERE userName = '#{username}' AND password = '#{password}'")
        matching_username_and_password_arr = Array.new

        matching_username_and_password.each do |row|
            matching_username_and_password_arr.unshift(row)
        end

        if matching_username_and_password_arr.length > 0
            puts "Logged in!"
            return true
        else
            puts "Nice try."
            return false
        end

        rescue Mysql::Error => e
            puts e.errno
            puts e.error

        ensure
            mysql_connection.close if mysql_connection
    end # sql begin
end # can_login()

end # class Login

mysession = Login.new()
my
session.create_sesssion("foobar","barfoo123")
END CODE

BEGIN MYSQL DATA STRUCTURE

Name Type Collation Attributes Null Default Extra

1 userid int(11) No None

2 firstName varchar(35) latin1
swedishci Yes NULL

3 lastName varchar(35) latin1
swedishci Yes NULL

4 userName varchar(35) latin1
swedishci Yes NULL

5 password varchar(35) latin1
swedishci Yes NULL

6 signUpDate date Yes NULL

7 is
admin tinyint(1) No 0

END MYSQL DATA STRUCTURE

BEGIN MYSQL TABLE DATA
userid firstName lastName userName password signUpDate isadmin
1234 Foo Bar foobar barfoo123 41178 0
BEGIN MYSQL TABLE DATA

BEGIN COMMAND LINE (one-time response)
C:\Users\first.last\rubystuff>ruby QAtest.rb
Not an admin.
Logged in!
QA
test.rb: [BUG] Segmentation fault
ruby 1.9.3p194 (2012-04-20) [i386-mingw32]

-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0002 b:0002 l:00110c d:00110c TOP

-- C level backtrace information -------------------------------------------
C:\windows\SysWOW64\ntdll.dll(NtWaitForSingleObject+0x15) [0x7709f861]
C:\windows\syswow64\kernel32.dll(WaitForSingleObjectEx+0x43) [0x754e1184]
C:\windows\syswow64\kernel32.dll(WaitForSingleObject+0x12) [0x754e1138]
C:\Ruby\bin\msvcrt-ruby191.dll(rbvmbugreport+0xf9) [0x62e5c589]
C:\Ruby\bin\msvcrt-ruby191.dll(rbnameerrmesgnew+0x17a) [0x62d3a7e2]
C:\Ruby\bin\msvcrt-ruby191.dll(rbbug+0x2f) [0x62d3b4fb]
C:\Ruby\bin\msvcrt-ruby191.dll(rb
checksafestr+0x1a4) [0x62dee168]
[0x004011e6]
C:\windows\syswow64\kernel32.dll(CheckForReadOnlyResource+0x3bf) [0x75509d77]
C:\windows\SysWOW64\ntdll.dll(RtlKnownExceptionFilter+0xb7) [0x770f0df7]

-- Other runtime information -----------------------------------------------

  • Loaded script: QA_test.rb

  • Loaded features:

    0 enumerator.so
    1 C:/Ruby/lib/ruby/1.9.1/i386-mingw32/enc/encdb.so
    2 C:/Ruby/lib/ruby/1.9.1/i386-mingw32/enc/iso88591.so
    3 C:/Ruby/lib/ruby/1.9.1/i386-mingw32/enc/trans/transdb.so
    4 C:/Ruby/lib/ruby/siteruby/1.9.1/rubygems/defaults.rb
    5 C:/Ruby/lib/ruby/1.9.1/i386-mingw32/rbconfig.rb
    6 C:/Ruby/lib/ruby/site
    ruby/1.9.1/rubygems/deprecate.rb
    7 C:/Ruby/lib/ruby/siteruby/1.9.1/rubygems/exceptions.rb
    8 C:/Ruby/lib/ruby/site
    ruby/1.9.1/rubygems/defaults/operatingsystem.rb
    9 C:/Ruby/lib/ruby/site
    ruby/1.9.1/rubygems/customrequire.rb
    10 C:/Ruby/lib/ruby/site
    ruby/1.9.1/rubygems.rb
    11 C:/Ruby/lib/ruby/siteruby/1.9.1/rubygems/version.rb
    12 C:/Ruby/lib/ruby/site
    ruby/1.9.1/rubygems/requirement.rb
    13 C:/Ruby/lib/ruby/siteruby/1.9.1/rubygems/platform.rb
    14 C:/Ruby/lib/ruby/site
    ruby/1.9.1/rubygems/specification.rb
    15 C:/Ruby/lib/ruby/siteruby/1.9.1/rubygems/pathsupport.rb
    16 C:/Ruby/lib/ruby/1.9.1/i386-mingw32/enc/utf16le.so
    17 C:/Ruby/lib/ruby/1.9.1/i386-mingw32/enc/trans/utf
    1632.so
    18 C:/Ruby/lib/ruby/1.9.1/i386-mingw32/enc/trans/single
    byte.so
    19 C:/Ruby/lib/ruby/siteruby/1.9.1/rubygems/dependency.rb
    20 C:/Ruby/lib/ruby/gems/1.9.1/gems/mysql-2.8.1-x86-mingw32/lib/1.9/mysql
    api
    .so
    21 C:/Ruby/lib/ruby/gems/1.9.1/gems/mysql-2.8.1-x86-mingw32/lib/mysql.rb

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
END COMMAND LINE (one-time response)

History

#1 Updated by Luis Lavena over 1 year ago

  • Status changed from Open to Feedback
  • Assignee set to Luis Lavena

Seems you're using the binary version of mysql gem, which requires an exact version of libmysql.dll in your system.

Please read this:

http://blog.mmediasys.com/2011/07/07/installing-mysql-on-windows-7-x64-and-using-ruby-with-it/

Uninstall and compile the gem using the MySQL Connector/C dll and try again.

Let us know if that works.

#2 Updated by Sam Nissen over 1 year ago

This fix does work, with on caveat:

When your instructions say to run
"gem install mysql --platform=ruby -- --with-mysql-dir=C:/mysql-connector-c-noinstall-6.0.2-win32"

I had to download mysql 2.8.1-x86-mingw32 and install from my local directory.
"gem install C:/full/path/to/mysql-2.8.1-x86-mingw32.gem --platform=ruby -- --with-mysql-dir=C:/mysql-connector-c-noinstall-6.0.2-win32"

Thank you!

#3 Updated by Luis Lavena over 1 year ago

  • Status changed from Feedback to Third Party's Issue

scnissen (Sam Nissen) wrote:

This fix does work, with on caveat:

When your instructions say to run
"gem install mysql --platform=ruby -- --with-mysql-dir=C:/mysql-connector-c-noinstall-6.0.2-win32"

I had to download mysql 2.8.1-x86-mingw32 and install from my local directory.
"gem install C:/full/path/to/mysql-2.8.1-x86-mingw32.gem --platform=ruby -- --with-mysql-dir=C:/mysql-connector-c-noinstall-6.0.2-win32"

Dunno why you had to donwload the gem manually, but mysql-2.8.1-x86-mingw32.gem actually contains the pre-compiled extension.

You need to download mysql-2.8.1.gem instead.

Closing this as 3rd party issue.

Thank you!

Also available in: Atom PDF