Skip to content

Fix SEGV by stack extension in mrb_get_args()#3090

Merged
matz merged 1 commit into
mruby:masterfrom
kou:fix-segv-by-stack-extension-in-mrb-get-args
Jan 21, 2016
Merged

Fix SEGV by stack extension in mrb_get_args()#3090
matz merged 1 commit into
mruby:masterfrom
kou:fix-segv-by-stack-extension-in-mrb-get-args

Conversation

@kou

@kou kou commented Jan 21, 2016

Copy link
Copy Markdown
Contributor

mrb_get_args() keeps pointer of the current stack. But address of the
current stack maybe changed by method call.

'i' format character calls #to_i when the argument isn't integer but
has #to_i.

Here is a code that may call #to_i in mrb_get_args():

case 'i':
  // ...
        default:
          *p = mrb_fixnum(mrb_Integer(mrb, ARGV[arg_i]));
          break;
 // ...

Here is a code #to_i is called:

class X
  def initialize(i)
    @i = i
  end

  def to_i
    @i
  end
end

[][X.new(0), 0] # X#to_i is called

So, mrb_get_args() shouldn't keep pointer and use it. mrb_get_args()
should always refer mrb->ci->stack to use valid address of the current
stack.

mrb_get_args() keeps pointer of the current stack. But address of the
current stack maybe changed by method call.

'i' format character calls #to_i when the argument isn't integer but
has #to_i.

Here is a code that may call #to_i in mrb_get_args():

    case 'i':
      // ...
            default:
              *p = mrb_fixnum(mrb_Integer(mrb, ARGV[arg_i]));
              break;
     // ...

Here is a code #to_i is called:

    class X
      def initialize(i)
        @i = i
      end

      def to_i
        @i
      end
    end

    [][X.new(0), 0] # X#to_i is called

So, mrb_get_args() shouldn't keep pointer and use it. mrb_get_args()
should always refer mrb->ci->stack to use valid address of the current
stack.
matz added a commit that referenced this pull request Jan 21, 2016
…get-args

Fix SEGV by stack extension in mrb_get_args()
@matz matz merged commit 2723b10 into mruby:master Jan 21, 2016
@kou kou deleted the fix-segv-by-stack-extension-in-mrb-get-args branch January 22, 2016 08:36
@dearblue dearblue mentioned this pull request Sep 16, 2019
matz pushed a commit that referenced this pull request Sep 16, 2019
In terms of specifiers, argv is never referenced after a method call as
shown in #3090.

Reduction of object code can be expected.

If you need to refer to argv after a method call in the same loop,
update argv after the method call.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants