Libsass: 였λ₯˜ 보고 μ‹œ MSVC x86_64 버퍼 μ˜€λ²„λŸ°(3.3.5μ—μ„œ 3.3.6 μ‚¬μ΄μ˜ νšŒκ·€)

에 λ§Œλ“  2016λ…„ 04μ›” 24일  Β·  14μ½”λ©˜νŠΈ  Β·  좜처: sass/libsass

이것은 μ›λž˜ https://github.com/dahlia/libsass-python/pull/149 μ—μ„œ μ˜΅λ‹ˆλ‹€.

λ‚˜λŠ” μ •ν™•νžˆ _μ™œ_ 이런 일이 μΌμ–΄λ‚˜λŠ”μ§€ 머리λ₯Ό κ°μ‹ΈλŠ” 데 어렀움을 κ²ͺκ³  μžˆμ§€λ§Œ μ§€κΈˆκΉŒμ§€ λ‚΄κ°€ 가진 것을 κ²Œμ‹œν•  κ²ƒμž…λ‹ˆλ‹€ :)

이 컀밋이 λ‚΄κ°€ 보고 μžˆλŠ” 문제λ₯Ό μΌμœΌν‚€λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€: https://github.com/sass/libsass/commit/527f3a8 (#2025)
이전 버전(f8cad4e)을 ν™•μΈν•˜λ©΄ μ„±κ³΅ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€.

λ‚˜μ˜ μž‘μ€ ν…ŒμŠ€νŠΈ ν•˜λ‹ˆμŠ€

더 μ‰¬μš΄ 경우 μ—¬κΈ°μ—μ„œ μ½”λ“œλ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. https://github.com/asottile/libsass/commit/f40ae24025234b73ca86adece62dec0e35884eb1

메인.cpp

#include <sass/context.h>
#include <iostream>

int main() {
    std::cout << "Making data context" << std::endl;
    struct Sass_Data_Context* context = sass_make_data_context(sass_copy_c_string(""));
    std::cout << "Compiling data context" << std::endl;
    sass_compile_data_context(context);
    std::cout << "Getting output context" << std::endl;
    struct Sass_Context* ctx = sass_data_context_get_context(context);
    std::cout << "Printing error status" << std::endl;
    std::cout << sass_context_get_error_status(ctx) << std::endl;
    std::cout << "Printing error message" << std::endl;
    std::cout << sass_context_get_error_message(ctx) << std::endl;
    sass_delete_data_context(context);

    return 0;
}

test.bat

"D:\Programs\VS2015\VC\BIN\amd64\cl.exe" ^
    /I.\include -ID:\Programs\VS2015\VC\INCLUDE ^
    /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT ^
    src/*.c
"D:\Programs\VS2015\VC\BIN\amd64\cl.exe" ^
    /I.\include ^
    "-ID:\Programs\VS2015\VC\INCLUDE" ^
    "-ID:\Programs\VS2015\VC\ATLMFC\INCLUDE" ^
    "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" ^
    "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um" ^
    "-IC:\Program Files (x86)\Windows Kits\8.1\include\\shared" ^
    "-IC:\Program Files (x86)\Windows Kits\8.1\include\\um" ^
    "-IC:\Program Files (x86)\Windows Kits\8.1\include\\winrt" ^
    /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT ^
    ./main.cpp src/*.cpp 
"D:\Programs\VS2015\VC\BIN\amd64\link.exe" ^
    "-LIBPATH:D:\Programs\VS2015\VC\LIB\amd64" ^
    "-LIBPATH:D:\Programs\VS2015\VC\ATLMFC\LIB\amd64" ^
    "-LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64" ^
    "-LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x64" ^
    "-LIBPATH:C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64" ^
    "-INCREMENTAL:NO" "-OUT:main.exe" "-Debug" "-nologo" "-LTCG" ^
    *.obj
main.exe

f8cad4eμ—μ„œ 좜λ ₯

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\cl.exe"     /I.\include -ID:\Programs\VS2015\VC\INCLUDE     /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT     src/*.c
c99func.c
cencode.c

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\cl.exe"     /I.\include     "-ID:\Programs\VS2015\VC\INCLUDE"     "-ID:\Programs\VS2015\VC\ATLMFC\INCLUDE"     "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt"     "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\shared"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\um"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\winrt"     /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT     ./main.cpp src/*.cpp
main.cpp
ast.cpp
base64vlq.cpp
bind.cpp
src/bind.cpp(175): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data
color_maps.cpp
constants.cpp
context.cpp
cssize.cpp
emitter.cpp
environment.cpp
error_handling.cpp
eval.cpp
expand.cpp
extend.cpp
file.cpp
functions.cpp
inspect.cpp
json.cpp
lexer.cpp
listize.cpp
Compiling...
memory_manager.cpp
node.cpp
output.cpp
parser.cpp
plugins.cpp
position.cpp
prelexer.cpp
remove_placeholders.cpp
sass.cpp
sass2scss.cpp
sass_context.cpp
sass_functions.cpp
sass_util.cpp
sass_values.cpp
source_map.cpp
to_c.cpp
to_value.cpp
units.cpp
utf8_string.cpp
util.cpp
Compiling...
values.cpp

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\link.exe"     "-LIBPATH:D:\Programs\VS2015\VC\LIB\amd64"     "-LIBPATH:D:\Programs\VS2015\VC\ATLMFC\LIB\amd64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64"     "-INCREMENTAL:NO" "-OUT:main.exe" "-Debug" "-nologo" "-LTCG"     *.obj
Generating code
Finished generating code

C:\Users\Anthony\Desktop\git\libsass-python\libsass>main.exe
Making data context
Compiling data context
Getting output context
Printing error status
3
Printing error message
Internal Error: Data context created with empty source string

527f3a8μ—μ„œ 좜λ ₯

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\cl.exe"     /I.\include -ID:\Programs\VS2015\VC\INCLUDE     /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT     src/*.c
c99func.c
cencode.c

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\cl.exe"     /I.\include     "-ID:\Programs\VS2015\VC\INCLUDE"     "-ID:\Programs\VS2015\VC\ATLMFC\INCLUDE"     "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt"     "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\shared"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\um"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\winrt"     /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT     ./main.cpp src/*.cpp
main.cpp
ast.cpp
base64vlq.cpp
bind.cpp
src/bind.cpp(175): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data
color_maps.cpp
constants.cpp
context.cpp
cssize.cpp
emitter.cpp
environment.cpp
error_handling.cpp
eval.cpp
expand.cpp
extend.cpp
file.cpp
functions.cpp
inspect.cpp
json.cpp
lexer.cpp
listize.cpp
Compiling...
memory_manager.cpp
node.cpp
output.cpp
parser.cpp
plugins.cpp
position.cpp
prelexer.cpp
remove_placeholders.cpp
sass.cpp
sass2scss.cpp
sass_context.cpp
sass_functions.cpp
sass_util.cpp
sass_values.cpp
source_map.cpp
to_c.cpp
to_value.cpp
units.cpp
utf8_string.cpp
util.cpp
Compiling...
values.cpp

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\link.exe"     "-LIBPATH:D:\Programs\VS2015\VC\LIB\amd64"     "-LIBPATH:D:\Programs\VS2015\VC\ATLMFC\LIB\amd64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64"     "-INCREMENTAL:NO" "-OUT:main.exe" "-Debug" "-nologo" "-LTCG"     *.obj
Generating code
Finished generating code

C:\Users\Anthony\Desktop\git\libsass-python\libsass>main.exe
Making data context

μ‹€νŒ¨ μ‹œ 디버거λ₯Ό μ—°κ²°ν•˜λ©΄ λ‹€μŒ λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

Unhandled exception at 0x00007FF77A8F8814 in main.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.

https://github.com/sass/libsass/blob/527f3a8/src/sass_context.cpp#L143 μ—μ„œ 쀑단점을 μ‚­μ œν•©λ‹ˆλ‹€.

Bug - Confirmed Dev - PR Ready

λͺ¨λ“  14 λŒ“κΈ€

첫 번째 :λ°•μˆ˜: ν•΄λ‹Ή 버그 λ³΄κ³ μ„œμ— λŒ€ν•΄ μš°λ¦¬κ°€ μ›ν•˜λŠ” λŒ€λ‘œ 거의 κ·Έ μžλ¦¬μ— μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ— μ‹œκ°„μ„ λ‚΄μ–΄ D:\Programs λ₯Ό ProgramFiles(x86) 둜 κ΅μ²΄ν•˜κ³  Visual Studioλ₯Ό ν‘œμ€€ 경둜( Microsoft Visual Studio 12.0 AFAIK)에 μ„€μΉ˜ν•΄ μ£Όμ‹œλ©΄ λ‹€μŒ 버그 μ‹ κ³  λŒ€μƒμœΌλ‘œ 곡식 지λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€. λ…„:μ›ƒλŠ”:

이미 λŠ¦μ€ μ‹œκ°„μ΄μ§€λ§Œ 천천히 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€...

/GL (ν”„λ‘œκ·Έλž¨ μ΅œμ ν™”)λ₯Ό μ œκ±°ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€...
λͺ…ν™•νžˆν•˜κΈ° μœ„ν•΄ μ΅œμ ν™”κ°€ ν™œμ„±ν™”λ˜λ©΄ segfaultκ°€ λ°œμƒν•©λ‹ˆλ‹€ .. μ’‹μ•„, λ™μΌν•œ 것을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.
μƒˆλ‘œ μΆ”κ°€λœ μ‹œλ„μ™€ ν•¨κ»˜ μ œκ³΅λœλ‹€κ³  λ§μ”€ν•˜μ…¨κΈ° λ•Œλ¬Έμ— μŠ€νƒ ν•΄μ œ λ¬Έμ œκ°€ μ˜μ‹¬λ©λ‹ˆλ‹€.
이것은 μ’…μ’… 컴파일러 μ˜΅μ…˜κ³Ό 관련이 μžˆμ§€λ§Œ λͺ…ν™•ν•œ 것을 λ§ν•˜κΈ°μ—λŠ” λ„ˆλ¬΄ 이λ₯΄λ‹€.

ν•˜κ³  λ³΄κ³ ν•©λ‹ˆλ‹€. SSD의 곡간이 λΆ€μ‘±ν•˜μ—¬ VM을 가동해야 ν•  κ²ƒμž…λ‹ˆλ‹€.

/GR λ³€κ²½ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ©λ‹ˆλ‹€! -- setuptools(python)에 μ „λ‹¬ν•˜λŠ” ν”Œλž˜κ·Έμ—μ„œ μˆ˜μ •ν•  수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

팁 κ³ λ§ˆμ›Œ!

흠... μž¬μ •μ˜ν•˜κΈ° μ–΄λ €μš΄ 일뢀 κΈ°λ³Έκ°’ λ•Œλ¬Έμ— μˆ˜ν–‰ν•˜κΈ°κ°€ μ•½κ°„ μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 이 컀밋이 /GL μ€‘λ‹¨ν•˜λŠ” 이유λ₯Ό μ•Œ 수 μžˆμŠ΅λ‹ˆκΉŒ?

예, λ©”λͺ¨λ¦¬κ°€ μ•„λ§ˆλ„ 더 μŠ€ν¬λž¨λΈ”λ˜κΈ° λ•Œλ¬Έμ— λŒ•κΈ€λ§ ν¬μΈν„°λ‚˜ 버퍼 μ˜€λ²„λŸ° 등을 톡해 μ„Έκ·Έν΄νŠΈλ₯Ό μ–»λŠ” 것이 더 μ‰¬μšΈ κ²ƒμž…λ‹ˆλ‹€. 처음으둜. μˆ˜μ •μ΄ 진행 쀑이며 PR에 쑰금 더 μ“Έ κ²ƒμž…λ‹ˆλ‹€.

<3 당신은 μ΅œκ³ μž…λ‹ˆλ‹€

슀슀둜 생각해보고 μ‹Άλ‹€λ©΄ λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

sass_copy_c_string(msg_stream.str().c_str())

μ œμ•ˆλœ μˆ˜μ • 사항은 https://github.com/sass/libsass/pull/2048 을 μ°Έμ‘°

였래 전에 μž‘μ„±ν•œ 일뢀 μ½”λ“œμ—μ„œ 이와 μœ μ‚¬ν•œ 것을 κΈ°μ–΅ν•©λ‹ˆλ‹€. ν‘œμ€€μ΄ λ¬Έμžμ—΄ μž„μ‹œ μˆ˜μ§‘μ— λŒ€ν•΄ λ³΄ν˜Έλ˜μ§€λ§Œ μ•„λ§ˆλ„ 그렇지 μ•Šμ„ 것이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

이 νŒ¨μΉ˜λŠ” μ½”λ“œλ₯Ό μ„±κ³΅μ‹œν‚€λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

diff --git a/src/sass_context.cpp b/src/sass_context.cpp
index e3f34af..9105866 100644
--- a/src/sass_context.cpp
+++ b/src/sass_context.cpp
@@ -140,7 +140,8 @@ extern "C" {
       json_append_member(json_err, "message", json_mkstring(e.what()));
       json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
       try { c_ctx->error_json = json_stringify(json_err, "  "); } catch(...) {}
-      c_ctx->error_message = sass_copy_c_string(msg_stream.str().c_str());
+      std::string s = msg_stream.str();
+      c_ctx->error_message = sass_copy_c_string(s.c_str());
       c_ctx->error_text = sass_copy_c_string(e.what());
       c_ctx->error_status = 3;
       c_ctx->output_string = 0;

였 μŠ€μœ—, μš°λ¦¬λŠ” 같은 결둠에 λ„λ‹¬ν–ˆμŠ΅λ‹ˆλ‹€ :D

예, 이전에 λ©”λͺ¨λ¦¬ 관리와 κ΄€λ ¨ν•˜μ—¬ μ†Œλ©Έμžκ°€ 기본적으둜 λ™μΌν•œ 문제(λ™μΌν•œ 컴파일러)둜 μ΄μ–΄μ§€λŠ” μ΄μƒν•œ μˆœμ„œλ‘œ ν˜ΈμΆœλ˜λŠ” 것을 λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

μ•„, 이제 κΈ°μ–΅ν•©λ‹ˆλ‹€. 이것이 λ°”λ‘œ μƒˆ 개체 할당을 μœ„ν•œ SASS_MEMORY_NEW λ§€ν¬λ‘œκ°€ μžˆλŠ” 이유(AFAIR)μž…λ‹ˆλ‹€. 이것이 이 PRμ΄μ—ˆμŠ΅λ‹ˆλ‹€. https://github.com/sass/libsass/pull/1462 ... 100% ν™•μ‹€ν•˜μ§€λŠ” μ•Šμ§€λ§Œ λ‚΄ 직감은 λ‘˜ λ‹€ λ™μΌν•œ 곡톡 루트λ₯Ό 가지고 μžˆλ‹€κ³  λ§ν•©λ‹ˆλ‹€.

잘 μž‘μ•„μš” μ—¬λŸ¬λΆ„
2016λ…„ 4μ›” 25일 μ˜€μ „ 9μ‹œ 29뢄에 "Marcel Greter" [email protected]이 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

폐쇄 #2046 https://github.com/sass/libsass/issues/2046 톡해 #2048
https://github.com/sass/libsass/pull/2048.

β€”
이 μŠ€λ ˆλ“œμ— κ°€μž…ν–ˆκΈ° λ•Œλ¬Έμ— 이 λ©”μ‹œμ§€λ₯Ό λ°›κ³  μžˆμŠ΅λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/sass/libsass/issues/2046#event -639249983

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰