Libsass: MSVC x86_64 Pufferüberlauf in der Fehlerberichterstattung (Regression zwischen 3.3.5 und 3.3.6)

Erstellt am 24. Apr. 2016  ·  14Kommentare  ·  Quelle: sass/libsass

Dies stammt ursprünglich von https://github.com/dahlia/libsass-python/pull/149

Es fällt mir schwer, genau zu wissen, _warum_ das passiert, aber ich werde posten, was ich bisher habe :)

Dieser Commit scheint das Problem zu verursachen, das ich sehe: https://github.com/sass/libsass/commit/527f3a8 (#2025)
Das Auschecken der Revision davor (f8cad4e) scheint erfolgreich zu sein.

Mein kleines Testgeschirr

Sie können den Code hier anzeigen, wenn das einfacher ist: https://github.com/asottile/libsass/commit/f40ae24025234b73ca86adece62dec0e35884eb1

main.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

Ausgabe bei 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

Ausgabe bei 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

Beim Anhängen des Debuggers bei einem Fehler wird die folgende Meldung angezeigt:

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

Und setzt einen Breakpoint unter: https://github.com/sass/libsass/blob/527f3a8/src/sass_context.cpp#L143

Bug - Confirmed Dev - PR Ready

Alle 14 Kommentare

Zuerst :clap: für diesen Fehlerbericht, so ziemlich vor Ort, wie wir es wollen. Wenn Sie sich die Zeit nehmen, D:\Programs durch ProgramFiles(x86) zu ersetzen und Visual Studio das nächste Mal in einem Standardpfad ( Microsoft Visual Studio 12.0 AFAIK) zu installieren, werde ich es offiziell für den Fehlerbericht von . nominieren das jahr :grins:

Hier ist es schon spät, aber ich werde einen kurzen Blick darauf werfen ...

Das Entfernen von /GL (Programmoptimierung) scheint das Problem zu lösen ...
Zur Verdeutlichung bekomme ich segfault wenn die Optimierung aktiviert ist.. ok, siehe da hast du das gleiche.
Da Sie sagen, dass es mit dem neu hinzugefügten Versuch kam, vermute ich Probleme beim Abwickeln des Stapels.
Dies hängt oft mit Compileroptionen zusammen, aber es ist zu früh, um etwas Bestimmtes zu sagen.

Werde machen und berichten. Ich habe keinen Speicherplatz auf meiner SSD, daher muss ich wahrscheinlich eine VM hochfahren

Der Wechsel zu /GR hilft! -- Ich denke, ich kann das in den Flags beheben, die ich an setuptools (Python) übergebe.

Danke für den Tipp!

Hmmm ... das ist etwas schwierig, da dies einige Standardeinstellungen sind, die schwer zu überschreiben sind -- irgendeine Idee, warum dieses Commit /GL bricht?

Ja, weil der Speicher wahrscheinlich mehr verschlüsselt ist, ist es wahrscheinlich auch einfacher, Segfaults über baumelnde Zeiger oder Pufferüberläufe usw erstes Mal. Fix ist im Gange, werde noch ein bisschen mehr in der PR schreiben.

<3 du bist die beste

Wenn Sie selbst darüber nachdenken möchten, ist dies die beleidigende Zeile:

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

Siehe https://github.com/sass/libsass/pull/2048 für vorgeschlagene Korrekturen. Danke für den Bericht!

Ich erinnere mich an etwas Ähnliches in einem Code, den ich vor langer Zeit geschrieben habe - ich dachte, der Standard schützte davor, dass die Zeichenfolge vorübergehend gesammelt wird, aber vielleicht nicht.

Dieser Patch scheint den Code erfolgreich zu machen:

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;

oh süß, wir sind zu dem gleichen Schluss gekommen :D

Ja, das habe ich schon einmal bei der Speicherverwaltung gesehen, wo der Destruktor in einer ungeraden Reihenfolge aufgerufen wurde, die im Grunde zum gleichen Problem (gleicher Compiler) führte.

Ah, jetzt erinnere ich mich, genau aus diesem Grund (AFAIR) haben wir das SASS_MEMORY_NEW Makro zur Zuweisung neuer Objekte. Das war diese PR: https://github.com/sass/libsass/pull/1462 ... nicht 100% sicher, aber mein Bauch sagt, dass sie beide die gleiche gemeinsame Wurzel haben.

Schöner Fang ihr alle
Am 25.04.2016 um 9:29 Uhr schrieb "Marcel Greter" [email protected] :

Geschlossen #2046 https://github.com/sass/libsass/issues/2046 über #2048
https://github.com/sass/libsass/pull/2048.


Sie erhalten dies, weil Sie diesen Thread abonniert haben.
Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/sass/libsass/issues/2046#event -639249983

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Nimce picture Nimce  ·  4Kommentare

ashleykolodziej picture ashleykolodziej  ·  3Kommentare

GottZ picture GottZ  ·  3Kommentare

xzyfer picture xzyfer  ·  11Kommentare

bertusgroenewegen picture bertusgroenewegen  ·  6Kommentare