HaikuDepot: preliminary fix for crash in JSON listener
* Fix use-after-free in the auto-generated JSON listener code (was calling method of instance after 'delete this') Will also submit a patch for the code generation script in the haikudepotserver repo so it won't get lost -- this is just a temporary fix-up until then. * Fixes some random occasional crashes
This commit is contained in:
@@ -326,9 +326,12 @@ GeneralObjectStackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
|
||||
break;
|
||||
|
||||
case B_JSON_OBJECT_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -374,9 +377,12 @@ GeneralArrayStackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
|
||||
break;
|
||||
|
||||
case B_JSON_ARRAY_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -419,9 +425,12 @@ DumpExportPkg_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
|
||||
break;
|
||||
|
||||
case B_JSON_OBJECT_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_STRING:
|
||||
|
||||
@@ -539,9 +548,12 @@ DumpExportPkg_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent& ev
|
||||
switch (event.EventType()) {
|
||||
|
||||
case B_JSON_ARRAY_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_OBJECT_START:
|
||||
{
|
||||
@@ -597,9 +609,12 @@ DumpExportPkgVersion_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent&
|
||||
break;
|
||||
|
||||
case B_JSON_OBJECT_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_STRING:
|
||||
|
||||
@@ -732,9 +747,12 @@ DumpExportPkgVersion_List_StackedDumpExportPkgJsonListener::Handle(const BJsonEv
|
||||
switch (event.EventType()) {
|
||||
|
||||
case B_JSON_ARRAY_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_OBJECT_START:
|
||||
{
|
||||
@@ -790,9 +808,12 @@ DumpExportPkgScreenshot_StackedDumpExportPkgJsonListener::Handle(const BJsonEven
|
||||
break;
|
||||
|
||||
case B_JSON_OBJECT_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_STRING:
|
||||
|
||||
@@ -895,9 +916,12 @@ DumpExportPkgScreenshot_List_StackedDumpExportPkgJsonListener::Handle(const BJso
|
||||
switch (event.EventType()) {
|
||||
|
||||
case B_JSON_ARRAY_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_OBJECT_START:
|
||||
{
|
||||
@@ -953,9 +977,12 @@ DumpExportPkgCategory_StackedDumpExportPkgJsonListener::Handle(const BJsonEvent&
|
||||
break;
|
||||
|
||||
case B_JSON_OBJECT_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_STRING:
|
||||
|
||||
@@ -1034,9 +1061,12 @@ DumpExportPkgCategory_List_StackedDumpExportPkgJsonListener::Handle(const BJsonE
|
||||
switch (event.EventType()) {
|
||||
|
||||
case B_JSON_ARRAY_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_OBJECT_START:
|
||||
{
|
||||
@@ -1119,9 +1149,12 @@ BulkContainerStackedDumpExportPkgJsonListener::Handle(const BJsonEvent& event)
|
||||
break;
|
||||
|
||||
case B_JSON_OBJECT_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
default:
|
||||
// ignore
|
||||
@@ -1157,9 +1190,12 @@ BulkContainerItemsStackedDumpExportPkgJsonListener::Handle(const BJsonEvent& eve
|
||||
break;
|
||||
|
||||
case B_JSON_ARRAY_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
default:
|
||||
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected json event");
|
||||
|
||||
+33
-11
@@ -5,7 +5,6 @@
|
||||
*/
|
||||
#include "DumpExportRepositoryJsonListener.h"
|
||||
#include "List.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
// #pragma mark - private interfaces for the stacked listeners
|
||||
@@ -264,10 +263,12 @@ GeneralObjectStackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& e
|
||||
break;
|
||||
|
||||
case B_JSON_OBJECT_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
return ErrorStatus() == B_OK;
|
||||
@@ -312,10 +313,12 @@ GeneralArrayStackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& ev
|
||||
break;
|
||||
|
||||
case B_JSON_ARRAY_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
return ErrorStatus() == B_OK;
|
||||
@@ -357,9 +360,12 @@ DumpExportRepository_StackedDumpExportRepositoryJsonListener::Handle(const BJson
|
||||
break;
|
||||
|
||||
case B_JSON_OBJECT_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_STRING:
|
||||
|
||||
@@ -461,9 +467,12 @@ DumpExportRepository_List_StackedDumpExportRepositoryJsonListener::Handle(const
|
||||
switch (event.EventType()) {
|
||||
|
||||
case B_JSON_ARRAY_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_OBJECT_START:
|
||||
{
|
||||
@@ -519,9 +528,12 @@ DumpExportRepositorySource_StackedDumpExportRepositoryJsonListener::Handle(const
|
||||
break;
|
||||
|
||||
case B_JSON_OBJECT_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_STRING:
|
||||
|
||||
@@ -606,9 +618,12 @@ DumpExportRepositorySource_List_StackedDumpExportRepositoryJsonListener::Handle(
|
||||
switch (event.EventType()) {
|
||||
|
||||
case B_JSON_ARRAY_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
case B_JSON_OBJECT_START:
|
||||
{
|
||||
@@ -691,9 +706,12 @@ BulkContainerStackedDumpExportRepositoryJsonListener::Handle(const BJsonEvent& e
|
||||
break;
|
||||
|
||||
case B_JSON_OBJECT_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
default:
|
||||
// ignore
|
||||
@@ -729,9 +747,12 @@ BulkContainerItemsStackedDumpExportRepositoryJsonListener::Handle(const BJsonEve
|
||||
break;
|
||||
|
||||
case B_JSON_ARRAY_END:
|
||||
{
|
||||
Pop();
|
||||
bool status = (ErrorStatus() == B_OK);
|
||||
delete this;
|
||||
break;
|
||||
return status;
|
||||
}
|
||||
|
||||
default:
|
||||
HandleError(B_NOT_ALLOWED, JSON_EVENT_LISTENER_ANY_LINE, "illegal state - unexpected json event");
|
||||
@@ -874,6 +895,7 @@ BulkContainerDumpExportRepositoryJsonListener::Handle(const BJsonEvent& event)
|
||||
BulkContainerStackedDumpExportRepositoryJsonListener* nextListener =
|
||||
new BulkContainerStackedDumpExportRepositoryJsonListener(
|
||||
this, NULL, fItemListener);
|
||||
|
||||
SetStackedListener(nextListener);
|
||||
return true;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user