upb: fix Ruby bug which allowed map.delete(key) on a frozen map

Also clean up some compiler warnings about exiting from non-void functions without returning a value.

PiperOrigin-RevId: 595185251
pull/15250/head
Eric Salo 1 year ago committed by Copybara-Service
parent 255f95e5b1
commit df57e5474b
  1. 2
      ruby/ext/google/protobuf_c/map.c
  2. 15
      ruby/ext/google/protobuf_c/shared_message.c

@ -444,7 +444,7 @@ static VALUE Map_delete(VALUE _self, VALUE key) {
Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
upb_MessageValue val_upb;
if (upb_Map_Delete(self->map, key_upb, &val_upb)) {
if (upb_Map_Delete(Map_GetMutable(_self), key_upb, &val_upb)) {
return Convert_UpbToRuby(val_upb, self->value_type_info, self->arena);
} else {
return Qnil;

@ -29,11 +29,11 @@ uint64_t shared_Message_Hash(const upb_Message* msg, const upb_MessageDef* m,
uint64_t ret = _upb_Hash(data, size, seed);
upb_Arena_Free(arena);
return ret;
} else {
upb_Arena_Free(arena);
upb_Status_SetErrorMessage(status, "Error calculating hash");
return 0;
}
upb_Arena_Free(arena);
upb_Status_SetErrorMessage(status, "Error calculating hash");
return 0;
}
// Support function for Message_Equal
@ -59,8 +59,9 @@ bool shared_Message_Equal(const upb_Message* m1, const upb_Message* m2,
bool ret = (size1 == size2) && (memcmp(data1, data2, size1) == 0);
upb_Arena_Free(arena_tmp);
return ret;
} else {
upb_Arena_Free(arena_tmp);
upb_Status_SetErrorMessage(status, "Error comparing messages");
}
upb_Arena_Free(arena_tmp);
upb_Status_SetErrorMessage(status, "Error comparing messages");
return 0;
}

Loading…
Cancel
Save