fix: undefined behaviour in parseJsonData
This commit is contained in:
parent
b5cd321263
commit
1b4788f469
1 changed files with 10 additions and 11 deletions
21
src/aws.zig
21
src/aws.zig
|
@ -688,7 +688,6 @@ pub fn Request(comptime request_action: anytype) type {
|
||||||
|
|
||||||
fn ParsedJsonData(comptime T: type) type {
|
fn ParsedJsonData(comptime T: type) type {
|
||||||
return struct {
|
return struct {
|
||||||
raw_response_parsed: bool,
|
|
||||||
parsed_response_ptr: *T,
|
parsed_response_ptr: *T,
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
|
|
||||||
|
@ -697,8 +696,7 @@ pub fn Request(comptime request_action: anytype) type {
|
||||||
pub fn deinit(self: MySelf) void {
|
pub fn deinit(self: MySelf) void {
|
||||||
// This feels like it should result in a use after free, but it
|
// This feels like it should result in a use after free, but it
|
||||||
// seems to be working?
|
// seems to be working?
|
||||||
if (self.raw_response_parsed)
|
self.allocator.destroy(self.parsed_response_ptr);
|
||||||
self.allocator.destroy(self.parsed_response_ptr);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -713,11 +711,13 @@ pub fn Request(comptime request_action: anytype) type {
|
||||||
std.mem.eql(u8, key, action.action_name ++ "Response") or
|
std.mem.eql(u8, key, action.action_name ++ "Response") or
|
||||||
std.mem.eql(u8, key, action.action_name ++ "Result") or
|
std.mem.eql(u8, key, action.action_name ++ "Result") or
|
||||||
isOtherNormalResponse(response_types.NormalResponse, key);
|
isOtherNormalResponse(response_types.NormalResponse, key);
|
||||||
var raw_response_parsed = false;
|
|
||||||
var stream = json.TokenStream.init(data);
|
var stream = json.TokenStream.init(data);
|
||||||
const parsed_response_ptr = blk: {
|
const parsed_response_ptr = blk: {
|
||||||
if (!response_types.isRawPossible or found_normal_json_response)
|
const ptr = try options.client.allocator.create(response_types.NormalResponse);
|
||||||
break :blk &(json.parse(response_types.NormalResponse, &stream, parser_options) catch |e| {
|
errdefer options.client.allocator.destroy(ptr);
|
||||||
|
|
||||||
|
if (!response_types.isRawPossible or found_normal_json_response) {
|
||||||
|
ptr.* = (json.parse(response_types.NormalResponse, &stream, parser_options) catch |e| {
|
||||||
log.err(
|
log.err(
|
||||||
\\Call successful, but unexpected response from service.
|
\\Call successful, but unexpected response from service.
|
||||||
\\This could be the result of a bug or a stale set of code generated
|
\\This could be the result of a bug or a stale set of code generated
|
||||||
|
@ -733,10 +733,10 @@ pub fn Request(comptime request_action: anytype) type {
|
||||||
return e;
|
return e;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
break :blk ptr;
|
||||||
|
}
|
||||||
|
|
||||||
log.debug("Appears server has provided a raw response", .{});
|
log.debug("Appears server has provided a raw response", .{});
|
||||||
raw_response_parsed = true;
|
|
||||||
const ptr = try options.client.allocator.create(response_types.NormalResponse);
|
|
||||||
errdefer options.client.allocator.destroy(ptr);
|
|
||||||
@field(ptr.*, std.meta.fields(action.Response)[0].name) =
|
@field(ptr.*, std.meta.fields(action.Response)[0].name) =
|
||||||
json.parse(response_types.RawResponse, &stream, parser_options) catch |e| {
|
json.parse(response_types.RawResponse, &stream, parser_options) catch |e| {
|
||||||
log.err(
|
log.err(
|
||||||
|
@ -756,8 +756,7 @@ pub fn Request(comptime request_action: anytype) type {
|
||||||
break :blk ptr;
|
break :blk ptr;
|
||||||
};
|
};
|
||||||
return ParsedJsonData(response_types.NormalResponse){
|
return ParsedJsonData(response_types.NormalResponse){
|
||||||
.raw_response_parsed = raw_response_parsed,
|
.parsed_response_ptr = parsed_response_ptr,
|
||||||
.parsed_response_ptr = @constCast(parsed_response_ptr), //TODO: why doesn't changing const->var above fix this?
|
|
||||||
.allocator = options.client.allocator,
|
.allocator = options.client.allocator,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue