From ac103ac300a985a742ca7f96f51eb33d598c4ae4 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 11 Nov 2025 11:17:20 +0900 Subject: [PATCH] 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 --- mrbgems/mruby-socket/src/socket.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/mrbgems/mruby-socket/src/socket.c b/mrbgems/mruby-socket/src/socket.c index 04d1e8690..f3fa663d4 100644 --- a/mrbgems/mruby-socket/src/socket.c +++ b/mrbgems/mruby-socket/src/socket.c @@ -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 */ } /*