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

Commit a1eb9d3

Browse files
committed
libfoundation: Add type checks to exported MCStream functions
1 parent e096b9b commit a1eb9d3

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

libfoundation/src/foundation-private.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,12 @@ inline MCValueTypeCode __MCValueGetTypeCode(__MCValue *self)
301301
return (self -> flags >> 28);
302302
}
303303

304+
inline const MCValueCustomCallbacks *
305+
__MCValueGetCustomCallbacks(__MCValue *self)
306+
{
307+
return reinterpret_cast<__MCCustomValue *>(self)->callbacks;
308+
}
309+
304310
template<class T> inline bool __MCValueCreate(MCValueTypeCode p_type_code, T*& r_value)
305311
{
306312
__MCValue *t_value;

libfoundation/src/foundation-stream.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ static MCStreamCallbacks kMCMemoryInputStreamCallbacks =
130130

131131
bool MCMemoryInputStreamCreate(const void *p_block, size_t p_size, MCStreamRef& r_stream)
132132
{
133+
MCAssert(nil != p_block);
134+
133135
MCStreamRef t_stream;
134136
if (!MCStreamCreate(&kMCMemoryInputStreamCallbacks, sizeof(__MCMemoryInputStream), t_stream))
135137
return false;
@@ -200,6 +202,14 @@ static MCValueCustomCallbacks kMCStreamCustomValueCallbacks =
200202
__MCStreamDescribe,
201203
};
202204

205+
static inline void __MCAssertIsStream(MCStreamRef ref)
206+
{
207+
__MCValue *val = reinterpret_cast<__MCValue *>(ref);
208+
MCAssert(nil != val &&
209+
__MCValueGetTypeCode(val) == kMCValueTypeCodeCustom &&
210+
__MCValueGetCustomCallbacks(val) == &kMCStreamCustomValueCallbacks);
211+
}
212+
203213
bool MCStreamCreate(const MCStreamCallbacks *p_callbacks, size_t p_extra_bytes, MCStreamRef& r_stream)
204214
{
205215
__MCStream *self;
@@ -215,63 +225,85 @@ bool MCStreamCreate(const MCStreamCallbacks *p_callbacks, size_t p_extra_bytes,
215225

216226
const MCStreamCallbacks *MCStreamGetCallbacks(MCStreamRef self)
217227
{
228+
__MCAssertIsStream(self);
229+
218230
return self -> callbacks;
219231
}
220232

221233
////////////////////////////////////////////////////////////////////////////////
222234

223235
bool MCStreamIsReadable(MCStreamRef self)
224236
{
237+
__MCAssertIsStream(self);
238+
225239
return self -> callbacks -> read != nil;
226240
}
227241

228242
bool MCStreamIsWritable(MCStreamRef self)
229243
{
244+
__MCAssertIsStream(self);
245+
230246
return self -> callbacks -> write != nil;
231247
}
232248

233249
bool MCStreamIsMarkable(MCStreamRef self)
234250
{
251+
__MCAssertIsStream(self);
252+
235253
return self -> callbacks -> mark != nil;
236254
}
237255

238256
bool MCStreamIsSeekable(MCStreamRef self)
239257
{
258+
__MCAssertIsStream(self);
259+
240260
return self -> callbacks -> seek != nil;
241261
}
242262

243263
////////////////////////////////////////////////////////////////////////////////
244264

245265
bool MCStreamGetAvailableForRead(MCStreamRef self, size_t& r_available)
246266
{
267+
__MCAssertIsStream(self);
268+
247269
if (self -> callbacks -> get_available_for_read == nil)
248270
return false;
249271
return self -> callbacks -> get_available_for_read(self, r_available);
250272
}
251273

252274
bool MCStreamRead(MCStreamRef self, void *p_buffer, size_t p_amount)
253275
{
276+
__MCAssertIsStream(self);
277+
MCAssert(nil != p_buffer);
278+
254279
if (self -> callbacks -> read == nil)
255280
return false;
256281
return self -> callbacks -> read(self, p_buffer, p_amount);
257282
}
258283

259284
bool MCStreamGetAvailableForWrite(MCStreamRef self, size_t& r_available)
260285
{
286+
__MCAssertIsStream(self);
287+
261288
if (self -> callbacks -> get_available_for_write == nil)
262289
return false;
263290
return self -> callbacks -> get_available_for_write(self, r_available);
264291
}
265292

266293
bool MCStreamWrite(MCStreamRef self, const void *p_buffer, size_t p_amount)
267294
{
295+
__MCAssertIsStream(self);
296+
MCAssert(nil != p_buffer);
297+
268298
if (self -> callbacks -> write == nil)
269299
return false;
270300
return self -> callbacks -> write(self, p_buffer, p_amount);
271301
}
272302

273303
bool MCStreamSkip(MCStreamRef self, size_t p_amount)
274304
{
305+
__MCAssertIsStream(self);
306+
275307
if (self -> callbacks -> skip != nil)
276308
return self -> callbacks -> skip(self, p_amount);
277309
if (self -> callbacks -> seek != nil)
@@ -288,13 +320,17 @@ bool MCStreamSkip(MCStreamRef self, size_t p_amount)
288320

289321
bool MCStreamMark(MCStreamRef self, size_t p_read_limit)
290322
{
323+
__MCAssertIsStream(self);
324+
291325
if (self -> callbacks -> mark == nil)
292326
return false;
293327
return self -> callbacks -> mark(self, p_read_limit);
294328
}
295329

296330
bool MCStreamReset(MCStreamRef self)
297331
{
332+
__MCAssertIsStream(self);
333+
298334
if (self -> callbacks -> reset == nil)
299335
return false;
300336
return self -> callbacks -> reset(self);
@@ -304,13 +340,17 @@ bool MCStreamReset(MCStreamRef self)
304340

305341
bool MCStreamTell(MCStreamRef self, filepos_t& r_position)
306342
{
343+
__MCAssertIsStream(self);
344+
307345
if (self -> callbacks -> tell == nil)
308346
return false;
309347
return self -> callbacks -> tell(self, r_position);
310348
}
311349

312350
bool MCStreamSeek(MCStreamRef self, filepos_t p_position)
313351
{
352+
__MCAssertIsStream(self);
353+
314354
if (self -> callbacks -> seek == nil)
315355
return false;
316356
return self -> callbacks -> seek(self, p_position);

0 commit comments

Comments
 (0)