Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix stack-buffer-overflow in generated code #46260

Closed
wants to merge 1 commit into from
Closed

Conversation

Keno
Copy link
Member

@Keno Keno commented Aug 5, 2022

When generating code for a local, we were using the LLVM type
for the allocation. However, we were assuming that the allocation
was sized according to the julia datatype size. These two sizes
do not match, as the julia size is rounded up to alignment,
causing a stack buffer overflow.

When generating code for a local, we were using the LLVM type
for the allocation. However, we were assuming that the allocation
was sized according to the julia datatype size. These two sizes
do not match, as the julia size is rounded up to alignment,
causing a stack buffer overflow.
@@ -4721,7 +4721,7 @@ static void emit_upsilonnode(jl_codectx_t &ctx, ssize_t phic, jl_value_t *val)
}
else if (vi.value.V && !vi.value.constant && vi.value.typ != jl_bottom_type) {
assert(vi.value.ispointer());
Type *T = cast<AllocaInst>(vi.value.V)->getAllocatedType();
Type *T = cast<AllocaInst>(vi.value.V->stripPointerCasts())->getAllocatedType();
if (CountTrackedPointers(T).count) {
Copy link
Sponsor Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems now just to be i8, which would not be good

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, so we should use julia_type_to_llvm(vi.value.typ) then?

Copy link
Sponsor Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not entirely sure, since it seems like we might be losing the root here anyways. There was a thought that we might use the alloca type in the future to ensure we got all of the roots (even in the presence of stack-spills), but it was mostly never implemented.

Copy link
Sponsor Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might need to force this to become a boxroot

Copy link
Sponsor Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be similarly good to know how the other branch of this change is reached, since typically we may lose gc-roots if they get shoved onto the stack, so we should not do that

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let me change this to julia_type_to_llvm(vi.value.typ) for now, which will preserve current behavior and then we can separately track your concerns.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or I guess late-gc-lowering does look at the AllocaInst type ... sigh.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess for now, we could just insert an appropriate amount of padding at the LLVM type if the allocation is not aligned?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or maybe we could stop rounding up the datatype size?

Copy link
Sponsor Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should stop rounding, since at best it may waste space that could be useful

Keno added a commit that referenced this pull request Aug 11, 2022
Padding is then added when creating the struct layout, but otherwise
the memory layout should be unchanged. This is an alternative to
the proposal in #46260. LLVM size and julia size should now be
aligned.
Keno added a commit that referenced this pull request Aug 11, 2022
Padding is then added when creating the struct layout, but otherwise
the memory layout should be unchanged. This is an alternative to
the proposal in #46260. LLVM size and julia size should now be
aligned.
Keno added a commit that referenced this pull request Aug 11, 2022
Padding is then added when creating the struct layout, but otherwise
the memory layout should be unchanged. This is an alternative to
the proposal in #46260. LLVM size and julia size should now be
aligned.
Keno added a commit that referenced this pull request Aug 11, 2022
Padding is then added when creating the struct layout, but otherwise
the memory layout should be unchanged. This is an alternative to
the proposal in #46260. LLVM size and julia size should now be
aligned.
Keno added a commit that referenced this pull request Aug 12, 2022
Padding is then added when creating the struct layout, but otherwise
the memory layout should be unchanged. This is an alternative to
the proposal in #46260. LLVM size and julia size should now be
aligned.
@Keno Keno mentioned this pull request Aug 15, 2022
60 tasks
Keno added a commit that referenced this pull request Aug 16, 2022
Turns out when you declare an alloca alignment, it also rounds up
the allocated size. Replaces #46322 and #46260 and fixes the
same issue.
Keno added a commit that referenced this pull request Aug 16, 2022
Turns out when you declare an alloca alignment, it also rounds up
the allocated size. Replaces #46322 and #46260 and fixes the
same issue.
@Keno Keno closed this Aug 16, 2022
KristofferC pushed a commit that referenced this pull request Aug 26, 2022
Turns out when you declare an alloca alignment, it also rounds up
the allocated size. Replaces #46322 and #46260 and fixes the
same issue.

(cherry picked from commit e358a17)
KristofferC pushed a commit that referenced this pull request Aug 26, 2022
Turns out when you declare an alloca alignment, it also rounds up
the allocated size. Replaces #46322 and #46260 and fixes the
same issue.

(cherry picked from commit e358a17)
@vtjnash vtjnash deleted the kf/localoverflow branch September 2, 2022 00:12
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