test_bind_stream_fuzzer.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #ifdef ZMQ_USE_FUZZING_ENGINE
4 #include <fuzzer/FuzzedDataProvider.h>
5 #endif
6 
7 #include "testutil.hpp"
8 #include "testutil_unity.hpp"
9 
10 // Test that the ZMTP engine handles invalid handshake when binding
11 // https://rfc.zeromq.org/spec/37/
12 extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size)
13 {
17  // As per API by default there's no limit to the size of a message,
18  // but the sanitizer allocator will barf over a gig or so
19  int64_t max_msg_size = 64 * 1024 * 1024;
21  zmq_setsockopt (server, ZMQ_MAXMSGSIZE, &max_msg_size, sizeof (int64_t)));
24 
25  // If there is not enough data for a full greeting, just send what we can
26  // Otherwise send greeting first, as expected by the protocol
27  uint8_t buf[64];
28  if (size >= 64) {
29  send (client, (void *) data, 64, MSG_NOSIGNAL);
30  data += 64;
31  size -= 64;
32  }
33  recv (client, buf, 64, MSG_DONTWAIT);
34  msleep (250);
35  for (ssize_t sent = 0; size > 0 && (sent != -1 || errno == EINTR);
36  size -= sent > 0 ? sent : 0, data += sent > 0 ? sent : 0)
37  sent = send (client, (const char *) data, size, MSG_NOSIGNAL);
38  msleep (250);
39 
40  zmq_msg_t msg;
41  zmq_msg_init (&msg);
42  while (-1 != zmq_msg_recv (&msg, server, ZMQ_DONTWAIT)) {
43  zmq_msg_close (&msg);
44  zmq_msg_init (&msg);
45  }
46 
47  void *client_good = test_context_socket (ZMQ_DEALER);
49 
50  TEST_ASSERT_EQUAL_INT (6, zmq_send_const (client_good, "HELLO", 6, 0));
51  zmq_msg_t routing_id;
53  TEST_ASSERT_SUCCESS_ERRNO (zmq_msg_recv (&routing_id, server, 0));
54  TEST_ASSERT_TRUE (zmq_msg_more (&routing_id));
55  char const *peer_address = zmq_msg_gets (&routing_id, "Peer-Address");
56  zmq_msg_close (&routing_id);
57  TEST_ASSERT_NOT_NULL (peer_address);
58  TEST_ASSERT_EQUAL_STRING ("127.0.0.1", peer_address);
61  zmq_msg_init (&msg);
62  while (-1 != zmq_msg_recv (&msg, server, ZMQ_DONTWAIT)) {
63  zmq_msg_close (&msg);
64  zmq_msg_init (&msg);
65  }
66 
67  close (client);
71 
72  return 0;
73 }
74 
75 #ifndef ZMQ_USE_FUZZING_ENGINE
77 {
78  uint8_t **data;
79  size_t *len, num_cases = 0;
81  "tests/libzmq-fuzz-corpora/test_bind_stream_fuzzer_seed_corpus",
82  &data, &len, &num_cases)
83  != 0)
84  exit (77);
85 
86  while (num_cases-- > 0) {
88  LLVMFuzzerTestOneInput (data[num_cases], len[num_cases]));
89  free (data[num_cases]);
90  }
91 
92  free (data);
93  free (len);
94 }
95 
96 int main (int argc, char **argv)
97 {
99 
100  UNITY_BEGIN ();
102 
103  return UNITY_END ();
104 }
105 #endif
TEST_ASSERT_EQUAL_STRING
#define TEST_ASSERT_EQUAL_STRING(expected, actual)
Definition: unity.h:235
UNITY_END
return UNITY_END()
EINTR
#define EINTR
Definition: errno.hpp:7
ZMQ_STREAM
#define ZMQ_STREAM
Definition: zmq.h:269
msleep
void msleep(int milliseconds_)
Definition: testutil.cpp:227
TEST_ASSERT_TRUE
#define TEST_ASSERT_TRUE(condition)
Definition: unity.h:121
RUN_TEST
#define RUN_TEST(func)
Definition: unity_internals.h:615
setup_test_context
void setup_test_context()
Definition: testutil_unity.cpp:179
errno
int errno
bind_loopback_ipv4
void bind_loopback_ipv4(void *socket_, char *my_endpoint_, size_t len_)
Definition: testutil_unity.cpp:246
teardown_test_context
void teardown_test_context()
Definition: testutil_unity.cpp:189
client
void client(int num)
Definition: test_multithread.cpp:134
send
void send(fd_t fd_, const char(&data_)[N])
Definition: test_security_curve.cpp:209
test_context_socket_close_zero_linger
void * test_context_socket_close_zero_linger(void *socket_)
Definition: testutil_unity.cpp:215
zmq_connect
ZMQ_EXPORT int zmq_connect(void *s_, const char *addr_)
Definition: zmq.cpp:307
testutil_unity.hpp
zmq_msg_gets
const ZMQ_EXPORT char * zmq_msg_gets(const zmq_msg_t *msg_, const char *property_)
Definition: zmq.cpp:711
ZMQ_DEALER
#define ZMQ_DEALER
Definition: zmq.h:263
zmq_send_const
ZMQ_EXPORT int zmq_send_const(void *s_, const void *buf_, size_t len_, int flags_)
Definition: zmq.cpp:400
fuzzer_corpus_encode
int fuzzer_corpus_encode(const char *dirname, uint8_t ***data, size_t **len, size_t *num_cases)
Definition: testutil.cpp:534
zmq_setsockopt
ZMQ_EXPORT int zmq_setsockopt(void *s_, int option_, const void *optval_, size_t optvallen_)
Definition: zmq.cpp:250
testutil.hpp
zmq_msg_t
Definition: zmq.h:218
connect_socket
fd_t connect_socket(const char *endpoint_, const int af_, const int protocol_)
Definition: testutil.cpp:353
my_endpoint
char my_endpoint[MAX_SOCKET_STRING]
Definition: test_security_curve.cpp:31
test_bind_stream_fuzzer
void test_bind_stream_fuzzer()
Definition: test_bind_stream_fuzzer.cpp:76
MAX_SOCKET_STRING
#define MAX_SOCKET_STRING
Definition: libzmq/tests/testutil.hpp:35
size
#define size
Definition: glcorearb.h:2944
zmq_msg_recv
ZMQ_EXPORT int zmq_msg_recv(zmq_msg_t *msg_, void *s_, int flags_)
Definition: zmq.cpp:617
test_context_socket
void * test_context_socket(int type_)
Definition: testutil_unity.cpp:200
ZMQ_DONTWAIT
#define ZMQ_DONTWAIT
Definition: zmq.h:358
server
void * server
Definition: test_security_curve.cpp:29
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glcorearb.h:4175
TEST_ASSERT_EQUAL_INT
#define TEST_ASSERT_EQUAL_INT(expected, actual)
Definition: unity.h:128
zmq_msg_init
ZMQ_EXPORT int zmq_msg_init(zmq_msg_t *msg_)
Definition: zmq.cpp:587
main
int main(int argc, char **argv)
Definition: test_bind_stream_fuzzer.cpp:96
len
int len
Definition: php/ext/google/protobuf/map.c:206
zmq_recv
ZMQ_EXPORT int zmq_recv(void *s_, void *buf_, size_t len_, int flags_)
Definition: zmq.cpp:487
size
GLsizeiptr size
Definition: glcorearb.h:2943
setup_test_environment
void setup_test_environment(int timeout_seconds_)
Definition: testutil.cpp:201
UNITY_BEGIN
UNITY_BEGIN()
fd_t
zmq_fd_t fd_t
Definition: libzmq/tests/testutil.hpp:98
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: glcorearb.h:2879
ZMQ_MAXMSGSIZE
#define ZMQ_MAXMSGSIZE
Definition: zmq.h:292
zmq_msg_more
ZMQ_EXPORT int zmq_msg_more(const zmq_msg_t *msg_)
Definition: zmq.cpp:652
TEST_ASSERT_NOT_NULL
#define TEST_ASSERT_NOT_NULL(pointer)
Definition: unity.h:125
zmq_msg_close
ZMQ_EXPORT int zmq_msg_close(zmq_msg_t *msg_)
Definition: zmq.cpp:625
LLVMFuzzerTestOneInput
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
Definition: test_bind_stream_fuzzer.cpp:12
TEST_ASSERT_SUCCESS_ERRNO
#define TEST_ASSERT_SUCCESS_ERRNO(expr)
Definition: proxy_thr.cpp:47
MSG_NOSIGNAL
#define MSG_NOSIGNAL
Definition: libzmq/tests/testutil.hpp:71


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:59