frame_handler.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2018 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
20 
22 
23 #include <limits.h>
24 #include <stdint.h>
25 #include <string.h>
26 
27 #include <algorithm>
28 
29 #include <grpc/support/alloc.h>
30 #include <grpc/support/log.h>
31 
33 
34 /* Use little endian to interpret a string of bytes as uint32_t. */
35 static uint32_t load_32_le(const unsigned char* buffer) {
36  return (static_cast<uint32_t>(buffer[3]) << 24) |
37  (static_cast<uint32_t>(buffer[2]) << 16) |
38  (static_cast<uint32_t>(buffer[1]) << 8) |
39  static_cast<uint32_t>(buffer[0]);
40 }
41 
42 /* Store uint32_t as a string of little endian bytes. */
43 static void store_32_le(uint32_t value, unsigned char* buffer) {
44  buffer[3] = static_cast<unsigned char>(value >> 24) & 0xFF;
45  buffer[2] = static_cast<unsigned char>(value >> 16) & 0xFF;
46  buffer[1] = static_cast<unsigned char>(value >> 8) & 0xFF;
47  buffer[0] = static_cast<unsigned char>(value) & 0xFF;
48 }
49 
50 /* Frame writer implementation. */
52  return grpc_core::Zalloc<alts_frame_writer>();
53 }
54 
56  const unsigned char* buffer, size_t length) {
57  if (buffer == nullptr) return false;
58  size_t max_input_size = SIZE_MAX - kFrameLengthFieldSize;
59  if (length > max_input_size) {
60  gpr_log(GPR_ERROR, "length must be at most %zu", max_input_size);
61  return false;
62  }
63  writer->input_buffer = buffer;
64  writer->input_size = length;
65  writer->input_bytes_written = 0;
66  writer->header_bytes_written = 0;
68  static_cast<uint32_t>(writer->input_size + kFrameMessageTypeFieldSize),
69  writer->header_buffer);
71  return true;
72 }
73 
75  size_t* bytes_size) {
76  if (bytes_size == nullptr || output == nullptr) return false;
78  *bytes_size = 0;
79  return true;
80  }
81  size_t bytes_written = 0;
82  /* Write some header bytes, if needed. */
83  if (writer->header_bytes_written != sizeof(writer->header_buffer)) {
84  size_t bytes_to_write =
85  std::min(*bytes_size,
86  sizeof(writer->header_buffer) - writer->header_bytes_written);
87  memcpy(output, writer->header_buffer + writer->header_bytes_written,
88  bytes_to_write);
89  bytes_written += bytes_to_write;
90  *bytes_size -= bytes_to_write;
91  writer->header_bytes_written += bytes_to_write;
92  output += bytes_to_write;
93  if (writer->header_bytes_written != sizeof(writer->header_buffer)) {
94  *bytes_size = bytes_written;
95  return true;
96  }
97  }
98  /* Write some non-header bytes. */
99  size_t bytes_to_write =
100  std::min(writer->input_size - writer->input_bytes_written, *bytes_size);
101  memcpy(output, writer->input_buffer, bytes_to_write);
102  writer->input_buffer += bytes_to_write;
103  bytes_written += bytes_to_write;
104  writer->input_bytes_written += bytes_to_write;
105  *bytes_size = bytes_written;
106  return true;
107 }
108 
110  return writer->input_buffer == nullptr ||
111  writer->input_size == writer->input_bytes_written;
112 }
113 
115  return (sizeof(writer->header_buffer) - writer->header_bytes_written) +
116  (writer->input_size - writer->input_bytes_written);
117 }
118 
120 
121 /* Frame reader implementation. */
123  alts_frame_reader* reader = grpc_core::Zalloc<alts_frame_reader>();
124  return reader;
125 }
126 
128  return reader->output_buffer == nullptr ||
129  (reader->header_bytes_read == sizeof(reader->header_buffer) &&
130  reader->bytes_remaining == 0);
131 }
132 
134  return sizeof(reader->header_buffer) == reader->header_bytes_read;
135 }
136 
138  return alts_has_read_frame_length(reader) ? reader->bytes_remaining : 0;
139 }
140 
142  unsigned char* buffer) {
143  reader->output_buffer = buffer;
144 }
145 
147  if (buffer == nullptr) return false;
148  reader->output_buffer = buffer;
149  reader->bytes_remaining = 0;
150  reader->header_bytes_read = 0;
151  reader->output_bytes_read = 0;
152  return true;
153 }
154 
156  const unsigned char* bytes, size_t* bytes_size) {
157  if (bytes_size == nullptr) return false;
158  if (bytes == nullptr) {
159  *bytes_size = 0;
160  return false;
161  }
163  *bytes_size = 0;
164  return true;
165  }
166  size_t bytes_processed = 0;
167  /* Process the header, if needed. */
168  if (reader->header_bytes_read != sizeof(reader->header_buffer)) {
169  size_t bytes_to_write = std::min(
170  *bytes_size, sizeof(reader->header_buffer) - reader->header_bytes_read);
171  memcpy(reader->header_buffer + reader->header_bytes_read, bytes,
172  bytes_to_write);
173  reader->header_bytes_read += bytes_to_write;
174  bytes_processed += bytes_to_write;
175  bytes += bytes_to_write;
176  *bytes_size -= bytes_to_write;
177  if (reader->header_bytes_read != sizeof(reader->header_buffer)) {
178  *bytes_size = bytes_processed;
179  return true;
180  }
181  size_t frame_length = load_32_le(reader->header_buffer);
185  "Bad frame length (should be at least %zu, and at most %zu)",
187  *bytes_size = 0;
188  return false;
189  }
190  size_t message_type =
191  load_32_le(reader->header_buffer + kFrameLengthFieldSize);
193  gpr_log(GPR_ERROR, "Unsupported message type %zu (should be %zu)",
195  *bytes_size = 0;
196  return false;
197  }
198  reader->bytes_remaining = frame_length - kFrameMessageTypeFieldSize;
199  }
200  /* Process the non-header bytes. */
201  size_t bytes_to_write = std::min(*bytes_size, reader->bytes_remaining);
202  memcpy(reader->output_buffer, bytes, bytes_to_write);
203  reader->output_buffer += bytes_to_write;
204  bytes_processed += bytes_to_write;
205  reader->bytes_remaining -= bytes_to_write;
206  reader->output_bytes_read += bytes_to_write;
207  *bytes_size = bytes_processed;
208  return true;
209 }
210 
212  return reader->output_bytes_read;
213 }
214 
216  return reader->output_buffer;
217 }
218 
alts_reset_frame_reader
bool alts_reset_frame_reader(alts_frame_reader *reader, unsigned char *buffer)
Definition: frame_handler.cc:146
alts_create_frame_writer
alts_frame_writer * alts_create_frame_writer()
Definition: frame_handler.cc:51
alts_reset_reader_output_buffer
void alts_reset_reader_output_buffer(alts_frame_reader *reader, unsigned char *buffer)
Definition: frame_handler.cc:141
log.h
frame_handler.h
phone_pb2.message_type
message_type
Definition: phone_pb2.py:200
string.h
alts_frame_writer
Definition: frame_handler.h:43
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
alts_is_frame_writer_done
bool alts_is_frame_writer_done(alts_frame_writer *writer)
Definition: frame_handler.cc:109
alts_get_output_buffer
unsigned char * alts_get_output_buffer(alts_frame_reader *reader)
Definition: frame_handler.cc:215
alts_destroy_frame_reader
void alts_destroy_frame_reader(alts_frame_reader *reader)
Definition: frame_handler.cc:219
memory.h
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
alts_read_frame_bytes
bool alts_read_frame_bytes(alts_frame_reader *reader, const unsigned char *bytes, size_t *bytes_size)
Definition: frame_handler.cc:155
frame_length
static size_t frame_length(size_t payload_length)
Definition: frame_handler_test.cc:42
kFrameMessageType
const size_t kFrameMessageType
Definition: frame_handler.h:27
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
kFrameLengthFieldSize
const size_t kFrameLengthFieldSize
Definition: frame_handler.h:28
SIZE_MAX
#define SIZE_MAX
Definition: stdint-msvc2008.h:206
gmock_output_test.output
output
Definition: bloaty/third_party/googletest/googlemock/test/gmock_output_test.py:175
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
alts_reset_frame_writer
bool alts_reset_frame_writer(alts_frame_writer *writer, const unsigned char *buffer, size_t length)
Definition: frame_handler.cc:55
alts_get_num_writer_bytes_remaining
size_t alts_get_num_writer_bytes_remaining(alts_frame_writer *writer)
Definition: frame_handler.cc:114
alts_is_frame_reader_done
bool alts_is_frame_reader_done(alts_frame_reader *reader)
Definition: frame_handler.cc:127
buffer
char buffer[1024]
Definition: libuv/docs/code/idle-compute/main.c:8
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
min
#define min(a, b)
Definition: qsort.h:83
stdint.h
alts_write_frame_bytes
bool alts_write_frame_bytes(alts_frame_writer *writer, unsigned char *output, size_t *bytes_size)
Definition: frame_handler.cc:74
writer
void writer(void *n)
Definition: libuv/docs/code/locks/main.c:22
load_32_le
static uint32_t load_32_le(const unsigned char *buffer)
Definition: frame_handler.cc:35
value
const char * value
Definition: hpack_parser_table.cc:165
kFrameMaxSize
const size_t kFrameMaxSize
Definition: frame_handler.h:30
alts_create_frame_reader
alts_frame_reader * alts_create_frame_reader()
Definition: frame_handler.cc:122
bytes
uint8 bytes[10]
Definition: bloaty/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc:153
alts_get_reader_bytes_remaining
size_t alts_get_reader_bytes_remaining(alts_frame_reader *reader)
Definition: frame_handler.cc:137
alts_destroy_frame_writer
void alts_destroy_frame_writer(alts_frame_writer *writer)
Definition: frame_handler.cc:119
alloc.h
alts_get_output_bytes_read
size_t alts_get_output_bytes_read(alts_frame_reader *reader)
Definition: frame_handler.cc:211
store_32_le
static void store_32_le(uint32_t value, unsigned char *buffer)
Definition: frame_handler.cc:43
bytes_written
static size_t bytes_written
Definition: test-ipc-heavy-traffic-deadlock-bug.c:46
kFrameMessageTypeFieldSize
const size_t kFrameMessageTypeFieldSize
Definition: frame_handler.h:29
alts_has_read_frame_length
bool alts_has_read_frame_length(alts_frame_reader *reader)
Definition: frame_handler.cc:133
length
std::size_t length
Definition: abseil-cpp/absl/time/internal/test_util.cc:57
reader
void reader(void *n)
Definition: libuv/docs/code/locks/main.c:8
port_platform.h
alts_frame_reader
Definition: frame_handler.h:55


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:59:22