Skip to content

Commit 18c37ad

Browse files
authored
Fix segfault for inference response error (triton-inference-server#85)
1 parent 96c7f75 commit 18c37ad

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

src/infer_response.cc

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -66,28 +66,31 @@ InferResponse::SaveToSharedMemory(
6666
response_shm->has_error = false;
6767
response_shm->is_error_set = false;
6868

69-
Tensor* output_tensors_shm;
70-
off_t output_tensors_offset;
71-
shm_pool->Map(
72-
(char**)&output_tensors_shm, sizeof(Tensor) * output_tensor_length,
73-
output_tensors_offset);
74-
response_shm->outputs = output_tensors_offset;
75-
response_shm->outputs_size = output_tensor_length;
76-
77-
size_t j = 0;
78-
for (auto& output_tensor : output_tensors_) {
79-
Tensor* output_tensor_shm = &output_tensors_shm[j];
80-
output_tensor->SaveToSharedMemory(shm_pool, output_tensor_shm, copy);
81-
j++;
82-
}
83-
69+
// Only save the output tensors to shared memory when the inference response
70+
// doesn't have error.
8471
if (this->HasError()) {
8572
response_shm->has_error = true;
8673
off_t error_offset;
8774
SaveStringToSharedMemory(
8875
shm_pool, error_offset, this->Error()->Message().c_str());
8976
response_shm->is_error_set = true;
9077
response_shm->error = error_offset;
78+
response_shm->outputs_size = 0;
79+
} else {
80+
Tensor* output_tensors_shm;
81+
off_t output_tensors_offset;
82+
shm_pool->Map(
83+
(char**)&output_tensors_shm, sizeof(Tensor) * output_tensor_length,
84+
output_tensors_offset);
85+
response_shm->outputs = output_tensors_offset;
86+
response_shm->outputs_size = output_tensor_length;
87+
88+
size_t j = 0;
89+
for (auto& output_tensor : output_tensors_) {
90+
Tensor* output_tensor_shm = &output_tensors_shm[j];
91+
output_tensor->SaveToSharedMemory(shm_pool, output_tensor_shm, copy);
92+
j++;
93+
}
9194
}
9295
}
9396

@@ -100,6 +103,9 @@ InferResponse::LoadFromSharedMemory(
100103
uint32_t requested_output_count = response->outputs_size;
101104

102105
std::shared_ptr<PbError> pb_error;
106+
std::vector<std::shared_ptr<PbTensor>> py_output_tensors;
107+
108+
// If the error field is set, do not load output tensors from shared memory.
103109
if (response->has_error) {
104110
pb_error = std::make_shared<PbError>("");
105111

@@ -108,20 +114,19 @@ InferResponse::LoadFromSharedMemory(
108114
LoadStringFromSharedMemory(shm_pool, response->error, error_string);
109115
pb_error = std::make_shared<PbError>(error_string);
110116
}
111-
}
112-
113-
std::vector<std::shared_ptr<PbTensor>> py_output_tensors;
114-
for (size_t idx = 0; idx < requested_output_count; ++idx) {
115-
std::shared_ptr<PbTensor> pb_tensor = PbTensor::LoadFromSharedMemory(
116-
shm_pool, response->outputs + sizeof(Tensor) * idx);
117-
py_output_tensors.emplace_back(std::move(pb_tensor));
117+
} else {
118+
for (size_t idx = 0; idx < requested_output_count; ++idx) {
119+
std::shared_ptr<PbTensor> pb_tensor = PbTensor::LoadFromSharedMemory(
120+
shm_pool, response->outputs + sizeof(Tensor) * idx);
121+
py_output_tensors.emplace_back(std::move(pb_tensor));
122+
}
118123
}
119124

120125
std::unique_ptr<InferResponse> infer_response =
121126
std::make_unique<InferResponse>(py_output_tensors, pb_error);
122127
if (response->is_error_set)
123128
infer_response->is_message_set_ = true;
124-
129+
125130
return infer_response;
126131
}
127132

0 commit comments

Comments
 (0)