Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit 68f3ce4

Browse files
committed
[ CID 37679 ] engine: module-engine.cpp: Unchecked return value in __create_named_custom_typeinfo
Fixed by introducing MCNamed*TypeInfoCreate functions to replace commonly reimplemented code.
1 parent aea191a commit 68f3ce4

File tree

11 files changed

+225
-228
lines changed

11 files changed

+225
-228
lines changed

engine/src/module-canvas.cpp

Lines changed: 99 additions & 77 deletions
Large diffs are not rendered by default.

engine/src/module-engine.cpp

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -593,39 +593,16 @@ MCTypeInfoRef kMCEngineScriptObjectDoesNotExistErrorTypeInfo = nil;
593593

594594
////////////////////////////////////////////////////////////////////////////////
595595

596-
static void __create_named_custom_typeinfo(MCTypeInfoRef p_base, const MCValueCustomCallbacks *p_callbacks, MCNameRef p_name, MCTypeInfoRef& r_typeinfo)
597-
{
598-
MCAutoTypeInfoRef t_unnamed;
599-
/* UNCHECKED */ MCCustomTypeInfoCreate(p_base, p_callbacks, &t_unnamed);
600-
/* UNCHECKED */ MCNamedTypeInfoCreate(p_name, r_typeinfo);
601-
/* UNCHECKED */ MCNamedTypeInfoBind(r_typeinfo, *t_unnamed);
602-
}
603-
604-
static bool __create_named_error_typeinfo(MCNameRef p_domain, MCNameRef p_name, MCStringRef p_message, MCTypeInfoRef &r_typeinfo)
596+
bool MCEngineModuleInitialize(void)
605597
{
606-
MCAutoTypeInfoRef t_type, t_named_type;
607-
608-
if (!MCErrorTypeInfoCreate(p_domain, p_message, &t_type))
598+
if (!MCNamedErrorTypeInfoCreate(MCNAME("com.livecode.engine.ScriptObjectDoesNotExistError"), MCNAME("engine"), MCSTR("object does not exist"), kMCEngineScriptObjectDoesNotExistErrorTypeInfo))
609599
return false;
610600

611-
if (!MCNamedTypeInfoCreate(p_name, &t_named_type))
601+
if (!MCNamedCustomTypeInfoCreate(MCNAME("com.livecode.engine.ScriptObject"), kMCNullTypeInfo, &kMCScriptObjectCustomValueCallbacks, kMCEngineScriptObjectTypeInfo))
612602
return false;
613603

614-
if (!MCNamedTypeInfoBind(*t_named_type, *t_type))
604+
if (!MCStringCreateMutable(0, s_log_buffer))
615605
return false;
616-
617-
r_typeinfo = MCValueRetain(*t_named_type);
618-
619-
return true;
620-
}
621-
622-
bool MCEngineModuleInitialize(void)
623-
{
624-
/* UNCHECKED */ __create_named_error_typeinfo(MCNAME("engine"), MCNAME("com.livecode.engine.ScriptObjectDoesNotExistError"), MCSTR("object does not exist"), kMCEngineScriptObjectDoesNotExistErrorTypeInfo);
625-
626-
/* UNCHECKED */ __create_named_custom_typeinfo(kMCNullTypeInfo, &kMCScriptObjectCustomValueCallbacks, MCNAME("com.livecode.engine.ScriptObject"), kMCEngineScriptObjectTypeInfo);
627-
628-
/* UNCHECKED */ MCStringCreateMutable(0, s_log_buffer);
629606

630607
return true;
631608
}

libfoundation/include/foundation.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1565,6 +1565,17 @@ MC_DLLEXPORT bool MCErrorTypeInfoCreate(MCNameRef domain, MCStringRef message, M
15651565
MC_DLLEXPORT MCNameRef MCErrorTypeInfoGetDomain(MCTypeInfoRef error);
15661566
MC_DLLEXPORT MCStringRef MCErrorTypeInfoGetMessage(MCTypeInfoRef error);
15671567

1568+
//////////
1569+
1570+
// Create a named typeinfo bound to an error typeinfo.
1571+
MC_DLLEXPORT bool MCNamedErrorTypeInfoCreate(MCNameRef p_name, MCNameRef p_domain, MCStringRef p_message, MCTypeInfoRef &r_typeinfo);
1572+
1573+
// Create a named typeinfo bound to a custom typeinfo.
1574+
MC_DLLEXPORT bool MCNamedCustomTypeInfoCreate(MCNameRef p_name, MCTypeInfoRef base, const MCValueCustomCallbacks *callbacks, MCTypeInfoRef& r_typeinfo);
1575+
1576+
// Create a named typeinfo bound to a foreign typeinfo.
1577+
MC_DLLEXPORT bool MCNamedForeignTypeInfoCreate(MCNameRef p_name, const MCForeignTypeDescriptor *p_descriptor, MCTypeInfoRef& r_typeinfo);
1578+
15681579
////////////////////////////////////////////////////////////////////////////////
15691580
//
15701581
// BOOLEAN DEFINITIONS

libfoundation/src/foundation-error.cpp

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -359,20 +359,10 @@ bool __MCErrorCopyDescription(__MCError *self, MCStringRef& r_string)
359359

360360
bool __MCErrorInitialize(void)
361361
{
362-
MCAutoTypeInfoRef t_oom_typeinfo;
363-
if (!MCErrorTypeInfoCreate(MCNAME("runtime"), MCSTR("out of memory"), &t_oom_typeinfo))
362+
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.lang.OutOfMemoryError"), MCNAME("runtime"), MCSTR("out of memory"), kMCOutOfMemoryErrorTypeInfo))
364363
return false;
365-
if (!MCNamedTypeInfoCreate(MCNAME("livecode.lang.OutOfMemoryError"), kMCOutOfMemoryErrorTypeInfo))
366-
return false;
367-
if (!MCNamedTypeInfoBind(kMCOutOfMemoryErrorTypeInfo, *t_oom_typeinfo))
368-
return false;
369-
370-
MCAutoTypeInfoRef t_ge_typeinfo;
371-
if (!MCErrorTypeInfoCreate(MCNAME("runtime"), MCSTR("%{reason}"), &t_ge_typeinfo))
372-
return false;
373-
if (!MCNamedTypeInfoCreate(MCNAME("livecode.lang.GenericError"), kMCGenericErrorTypeInfo))
374-
return false;
375-
if (!MCNamedTypeInfoBind(kMCGenericErrorTypeInfo, *t_ge_typeinfo))
364+
365+
if (!MCNamedErrorTypeInfoCreate(MCNAME("livecode.lang.GenericError"), MCNAME("runtime"), MCSTR("%{reason}"), kMCGenericErrorTypeInfo))
376366
return false;
377367

378368
if (!MCErrorCreate(kMCOutOfMemoryErrorTypeInfo, nil, s_out_of_memory_error))

libfoundation/src/foundation-foreign.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -377,19 +377,10 @@ static bool __build_typeinfo(const char *p_name, MCForeignTypeDescriptor *p_desc
377377
MCNewAutoNameRef t_name_name;
378378
if (!MCNameCreate(*t_name_string, &t_name_name))
379379
return false;
380-
381-
MCAutoTypeInfoRef t_base_typeinfo;
382-
if (!MCForeignTypeInfoCreate(p_desc, &t_base_typeinfo))
383-
return false;
384-
385-
MCTypeInfoRef t_named_typeinfo;
386-
if (!MCNamedTypeInfoCreate(*t_name_name, t_named_typeinfo))
387-
return false;
388-
if (!MCNamedTypeInfoBind(t_named_typeinfo, *t_base_typeinfo))
389-
return false;
390-
391-
r_typeinfo = t_named_typeinfo;
392-
380+
381+
if (!MCNamedForeignTypeInfoCreate(*t_name_name, p_desc, r_typeinfo))
382+
return false;
383+
393384
return true;
394385
}
395386

libfoundation/src/foundation-stream.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -765,14 +765,9 @@ bool MCStreamReadValue(MCStreamRef stream, MCValueRef& r_value)
765765

766766
bool __MCStreamInitialize(void)
767767
{
768-
if (!MCCustomTypeInfoCreate(kMCNullTypeInfo, &kMCStreamCustomValueCallbacks, kMCStreamTypeInfo))
769-
return false;
770-
771-
MCAutoTypeInfoRef t_unnamed;
772-
/* UNCHECKED */ MCCustomTypeInfoCreate(kMCNullTypeInfo, &kMCStreamCustomValueCallbacks, &t_unnamed);
773-
/* UNCHECKED */ MCNamedTypeInfoCreate(MCNAME("livecode.lang.Stream"), kMCStreamTypeInfo);
774-
/* UNCHECKED */ MCNamedTypeInfoBind(kMCStreamTypeInfo, *t_unnamed);
775-
768+
if (!MCNamedCustomTypeInfoCreate(MCNAME("livecode.lang.Stream"), kMCNullTypeInfo, &kMCStreamCustomValueCallbacks, kMCStreamTypeInfo))
769+
return false;
770+
776771
return true;
777772
}
778773

libfoundation/src/foundation-typeinfo.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,62 @@ MCStringRef MCErrorTypeInfoGetMessage(MCTypeInfoRef unresolved_self)
812812

813813
////////////////////////////////////////////////////////////////////////////////
814814

815+
bool MCNamedErrorTypeInfoCreate(MCNameRef p_name, MCNameRef p_domain, MCStringRef p_message, MCTypeInfoRef &r_typeinfo)
816+
{
817+
MCAutoTypeInfoRef t_type, t_named_type;
818+
819+
if (!MCErrorTypeInfoCreate(p_domain, p_message, &t_type))
820+
return false;
821+
822+
if (!MCNamedTypeInfoCreate(p_name, &t_named_type))
823+
return false;
824+
825+
if (!MCNamedTypeInfoBind(*t_named_type, *t_type))
826+
return false;
827+
828+
r_typeinfo = MCValueRetain(*t_named_type);
829+
830+
return true;
831+
}
832+
833+
bool MCNamedCustomTypeInfoCreate(MCNameRef p_name, MCTypeInfoRef base, const MCValueCustomCallbacks *callbacks, MCTypeInfoRef& r_typeinfo)
834+
{
835+
MCAutoTypeInfoRef t_type, t_named_type;
836+
837+
if (!MCCustomTypeInfoCreate(base, callbacks, &t_type))
838+
return false;
839+
840+
if (!MCNamedTypeInfoCreate(p_name, &t_named_type))
841+
return false;
842+
843+
if (!MCNamedTypeInfoBind(*t_named_type, *t_type))
844+
return false;
845+
846+
r_typeinfo = MCValueRetain(*t_named_type);
847+
848+
return true;
849+
}
850+
851+
bool MCNamedForeignTypeInfoCreate(MCNameRef p_name, const MCForeignTypeDescriptor *p_descriptor, MCTypeInfoRef& r_typeinfo)
852+
{
853+
MCAutoTypeInfoRef t_type, t_named_type;
854+
855+
if (!MCForeignTypeInfoCreate(p_descriptor, &t_type))
856+
return false;
857+
858+
if (!MCNamedTypeInfoCreate(p_name, &t_named_type))
859+
return false;
860+
861+
if (!MCNamedTypeInfoBind(*t_named_type, *t_type))
862+
return false;
863+
864+
r_typeinfo = MCValueRetain(*t_named_type);
865+
866+
return true;
867+
}
868+
869+
////////////////////////////////////////////////////////////////////////////////
870+
815871
bool MCCustomTypeInfoCreate(MCTypeInfoRef p_base, const MCValueCustomCallbacks *p_callbacks, MCTypeInfoRef& r_typeinfo)
816872
{
817873
__MCTypeInfo *self;

libfoundation/src/system-file.cpp

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -205,44 +205,27 @@ MCTypeInfoRef kMCSFileIOErrorTypeInfo;
205205
MCTypeInfoRef kMCSFileEndOfFileErrorTypeInfo;
206206
MCTypeInfoRef kMCSFileInvalidPathErrorTypeInfo;
207207

208-
static bool
209-
__MCSFileCreateNamedErrorType (MCNameRef p_name,
210-
MCStringRef p_message,
211-
MCTypeInfoRef & r_error_type)
212-
{
213-
MCAutoTypeInfoRef t_raw_typeinfo, t_typeinfo;
214-
215-
if (!MCErrorTypeInfoCreate (MCNAME("file"), p_message, &t_raw_typeinfo))
216-
return false;
217-
218-
if (!MCNamedTypeInfoCreate (p_name, &t_typeinfo))
219-
return false;
220-
221-
if (!MCNamedTypeInfoBind (*t_typeinfo, *t_raw_typeinfo))
222-
return false;
223-
224-
r_error_type = MCValueRetain (*t_typeinfo);
225-
return true;
226-
}
227-
228208
bool
229209
__MCSFileInitialize (void)
230210
{
231211
/* Create error types */
232-
if (!__MCSFileCreateNamedErrorType (
212+
if (!MCNamedErrorTypeInfoCreate(
233213
MCNAME("livecode.lang.FileIOError"),
214+
MCNAME("file"),
234215
MCSTR("File input/output error for '%{path}': %{description}"),
235216
kMCSFileIOErrorTypeInfo))
236217
return false;
237218

238-
if (!__MCSFileCreateNamedErrorType (
219+
if (!MCNamedErrorTypeInfoCreate (
239220
MCNAME("livecode.lang.EndOfFileError"),
221+
MCNAME("file"),
240222
MCSTR("End of file '%{path}'"),
241223
kMCSFileEndOfFileErrorTypeInfo))
242224
return false;
243225

244-
if (!__MCSFileCreateNamedErrorType (
226+
if (!MCNamedErrorTypeInfoCreate (
245227
MCNAME("livecode.lang.InvalidFilenameError"),
228+
MCNAME("file"),
246229
MCSTR("No valid native path representation for path '%{path}'"),
247230
kMCSFileInvalidPathErrorTypeInfo))
248231
return false;

libfoundation/src/system-stream.cpp

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -78,37 +78,19 @@ along with LiveCode. If not see <http://www.gnu.org/licenses/>. */
7878
static MCTypeInfoRef kMCSStreamIOErrorTypeInfo;
7979
static MCTypeInfoRef kMCSStreamEndOfFileErrorTypeInfo;
8080

81-
static bool
82-
__MCSStreamCreateNamedErrorType (MCNameRef p_name,
83-
MCStringRef p_message,
84-
MCTypeInfoRef & r_error_type)
85-
{
86-
MCAutoTypeInfoRef t_raw_typeinfo, t_typeinfo;
87-
88-
if (!MCErrorTypeInfoCreate (MCNAME("stdio"), p_message, &t_raw_typeinfo))
89-
return false;
90-
91-
if (!MCNamedTypeInfoCreate (p_name, &t_typeinfo))
92-
return false;
93-
94-
if (!MCNamedTypeInfoBind (*t_typeinfo, *t_raw_typeinfo))
95-
return false;
96-
97-
r_error_type = MCValueRetain (*t_typeinfo);
98-
return true;
99-
}
100-
10181
static bool
10282
__MCSStreamInitializeErrors (void)
10383
{
104-
if (!__MCSStreamCreateNamedErrorType(
84+
if (!MCNamedErrorTypeInfoCreate(
10585
MCNAME("com.livecode.stream.IOError"),
86+
MCNAME("stdio"),
10687
MCSTR("Stream input/output error: %{description}"),
10788
kMCSStreamIOErrorTypeInfo))
10889
return false;
10990

110-
if (!__MCSStreamCreateNamedErrorType(
91+
if (!MCNamedErrorTypeInfoCreate(
11192
MCNAME("com.livecode.stream.EndOfFileError"),
93+
MCNAME("stdio"),
11294
MCSTR("Reached end of file while reading from stream"),
11395
kMCSStreamEndOfFileErrorTypeInfo))
11496
return false;

libscript/src/module-foreign.cpp

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -126,18 +126,9 @@ static bool __build_typeinfo(const char *p_name, MCForeignTypeDescriptor *p_desc
126126
MCNewAutoNameRef t_name_name;
127127
if (!MCNameCreate(*t_name_string, &t_name_name))
128128
return false;
129-
130-
MCAutoTypeInfoRef t_base_typeinfo;
131-
if (!MCForeignTypeInfoCreate(p_desc, &t_base_typeinfo))
132-
return false;
133-
134-
MCTypeInfoRef t_named_typeinfo;
135-
if (!MCNamedTypeInfoCreate(*t_name_name, t_named_typeinfo))
136-
return false;
137-
if (!MCNamedTypeInfoBind(t_named_typeinfo, *t_base_typeinfo))
138-
return false;
139-
140-
r_typeinfo = t_named_typeinfo;
129+
130+
if (!MCNamedForeignTypeInfoCreate(*t_name_name, p_desc, r_typeinfo))
131+
return false;
141132

142133
return true;
143134
}

0 commit comments

Comments
 (0)