Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/mruby.h
Original file line number Diff line number Diff line change
Expand Up @@ -1566,4 +1566,6 @@ mrbmemset(void *s, int c, size_t n)

MRB_END_DECL

#include <mruby/addition.h>

#endif /* MRUBY_H */
30 changes: 30 additions & 0 deletions include/mruby/addition.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
** mruby/addition.h - additional defines for mruby.h
**
** See Copyright Notice in mruby.h
**
** This file collects the things that would prevent documentation generation if defined in mruby.h.
*/

#ifndef MRUBY_ADDITION_H
#define MRUBY_ADDITION_H

MRB_BEGIN_DECL

mrb_noreturn void mrb_raise_str(mrb_state *mrb, struct RClass *c, mrb_value mesg_str);

#define mrb_raise(mrb, c, mesg) do { \
mrb_value _exc_mesg = mrb_str_new_cstr(mrb, mesg); \
struct RClass *_exc_class = (c); \
mrb_raise_str(mrb, _exc_class, _exc_mesg); \
} while (0)

#define mrb_raisef(mrb, c, ...) do { \
mrb_value _exc_mesg = mrb_format(mrb, __VA_ARGS__); \
struct RClass *_exc_class = (c); \
mrb_raise_str(mrb, _exc_class, _exc_mesg); \
} while (0)

MRB_END_DECL

#endif /* MRUBY_ADDITION_H */
3 changes: 3 additions & 0 deletions mrbgems/mruby-sprintf/src/sprintf.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,9 @@ check_name_arg(mrb_state *mrb, int posarg, const char *name, size_t len)
check_pos_arg(mrb, posarg, n),\
(posarg = -1, GETNTHARG(n)))

// Since a string literal is given, use-after-free does not occur when using the original mrb_raise
#undef mrb_raise

#define GETNTHARG(nth) \
((nth >= argc) ? (mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments"), mrb_undef_value()) : argv[nth])

Expand Down
47 changes: 28 additions & 19 deletions src/error.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,12 +214,6 @@ mrb_exc_raise(mrb_state *mrb, mrb_value exc)
exc_throw(mrb, exc);
}

MRB_API mrb_noreturn void
mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg)
{
mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mrb_str_new_cstr(mrb, msg)));
}

/*
* <code>vsprintf</code> like formatting.
*
Expand Down Expand Up @@ -397,19 +391,6 @@ error_va(mrb_state *mrb, struct RClass *c, const char *fmt, va_list ap)
return mrb_exc_new_str(mrb, c, mrb_vformat(mrb, fmt, ap));
}

MRB_API mrb_noreturn void
mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);

mrb_value exc = error_va(mrb, c, fmt, ap);
va_end(ap);

mrb_exc_raise(mrb, exc);
}

MRB_API mrb_noreturn void
mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...)
{
Expand Down Expand Up @@ -719,3 +700,31 @@ mrb_init_exception(mrb_state *mrb)
mrb->arena_err = mrb_obj_ptr(mrb_exc_new_lit(mrb, nomem_error, "arena overflow error"));
#endif
}

#undef mrb_raise
#undef mrb_raisef

MRB_API mrb_noreturn void
mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg)
{
mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mrb_str_new_cstr(mrb, msg)));
}

MRB_API mrb_noreturn void
mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);

mrb_value exc = error_va(mrb, c, fmt, ap);
va_end(ap);

mrb_exc_raise(mrb, exc);
}

mrb_noreturn void
mrb_raise_str(mrb_state *mrb, struct RClass *c, mrb_value msg)
{
mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, msg));
}