mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
mruby-socket: add error helper function to eliminate goto
Add invalid_address_error() helper function to replace goto statements used for error handling. This function is marked with mrb_noreturn attribute since it calls mrb_raise() which never returns. Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -872,6 +872,12 @@ mrb_ipsocket_ntop(mrb_state *mrb, mrb_value klass)
|
||||
*
|
||||
* IPSocket.pton(Socket::AF_INET, "127.0.0.1") #=> "\x7f\x00\x00\x01"
|
||||
*/
|
||||
static mrb_noreturn void
|
||||
invalid_address_error(mrb_state *mrb)
|
||||
{
|
||||
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid address");
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
mrb_ipsocket_pton(mrb_state *mrb, mrb_value klass)
|
||||
{
|
||||
@@ -880,29 +886,30 @@ mrb_ipsocket_pton(mrb_state *mrb, mrb_value klass)
|
||||
char buf[50];
|
||||
|
||||
mrb_get_args(mrb, "is", &af, &bp, &n);
|
||||
if ((size_t)n > sizeof(buf) - 1) goto invalid;
|
||||
if ((size_t)n > sizeof(buf) - 1) {
|
||||
invalid_address_error(mrb);
|
||||
}
|
||||
memcpy(buf, bp, n);
|
||||
buf[n] = '\0';
|
||||
|
||||
if (af == AF_INET) {
|
||||
struct in_addr in;
|
||||
if (mrb_hal_socket_inet_pton(AF_INET, buf, (void*)&in.s_addr) != 1)
|
||||
goto invalid;
|
||||
if (mrb_hal_socket_inet_pton(AF_INET, buf, (void*)&in.s_addr) != 1) {
|
||||
invalid_address_error(mrb);
|
||||
}
|
||||
return mrb_str_new(mrb, (char*)&in.s_addr, 4);
|
||||
}
|
||||
else if (af == AF_INET6) {
|
||||
struct in6_addr in6;
|
||||
if (mrb_hal_socket_inet_pton(AF_INET6, buf, (void*)&in6.s6_addr) != 1)
|
||||
goto invalid;
|
||||
if (mrb_hal_socket_inet_pton(AF_INET6, buf, (void*)&in6.s6_addr) != 1) {
|
||||
invalid_address_error(mrb);
|
||||
}
|
||||
return mrb_str_new(mrb, (char*)&in6.s6_addr, 16);
|
||||
}
|
||||
else {
|
||||
mrb_raise(mrb, E_ARGUMENT_ERROR, "unsupported address family");
|
||||
}
|
||||
|
||||
invalid:
|
||||
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid address");
|
||||
return mrb_nil_value(); /* dummy */
|
||||
return mrb_nil_value(); /* not reached */
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user