Skip to content

Commit 6ac10b8

Browse files
fixed and wrote tess for util... . Made varint function naming constistant. Added flag to not log debug info.
1 parent 423016f commit 6ac10b8

15 files changed

Lines changed: 261 additions & 113 deletions

include/assertlib.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,21 @@
1212
//Combined https://stackoverflow.com/questions/5867834/assert-with-message plus that Nasa 10 commandments code c_assert code snippet.
1313
#define clean_errno() (errno == 0 ? "None" : strerror(errno))
1414

15+
#ifndef NDEBUGLOG
1516
#define log_error(M, ...)\
1617
fprintf(stderr, "%s [ERROR] %s (%s:%d: errno: %s) " M "\n",\
1718
RED, RESET, __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__)
1819

1920
#define warn(M, ...)\
2021
fprintf(stdout, "%s[WARNING]%s (%s:%d: errno: %s) " M "\n",\
2122
YELLOW, RESET, __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__)
23+
#else
24+
//no-op
25+
#define log_error(M, ...) (void)0
26+
27+
#define warn(M, ...) (void)0
28+
29+
#endif
2230

2331
#define c_assert(e, M, ...)\
2432
((e) ? (true) : \

include/util_packet_body.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#pragma once
2+
3+
#include <stdint.h>
4+
#include <sys/types.h>
5+
6+
typedef struct len_data_pair {
7+
size_t len;
8+
uint8_t* data;
9+
} lenDataPair;
10+
11+
lenDataPair** util_packet_parse_generic_body(
12+
const uint8_t* body,
13+
size_t body_len,
14+
int num_pairs
15+
);
16+
17+
18+
void util_packet_body_lenDataPair_pairs_free(
19+
lenDataPair** pairs,
20+
int num_pairs
21+
);
22+
23+
24+
void util_packet_body_lenDataPair_free(lenDataPair* pair);

include/varint.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ typedef struct varint {
88
uint8_t data[MAX_VARINT_LEN];
99
} Varint;
1010

11-
Varint* varint_int_to_vint(int n);
12-
int varint_vint_to_int(const Varint* v);
13-
int varint_bytes_to_int(const uint8_t* v);
11+
Varint* varint_vint_from_int(int n);
12+
int varint_int_from_vint(const Varint* v);
13+
int varint_int_from_bytes(const uint8_t* v);
1414
void varint_free(Varint* v);
1515
Varint* varint_vint_from_stream(int fd);
16+
Varint* varint_vint_from_bytes(const uint8_t* buff);

makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@ CFLAGS=-Wall -Wextra
44
run: main
55
./main
66

7+
78
valgrind: main
89
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --show-reachable=no ./main
910

1011
main: main.o packet.o varint.o assertlib.o mc_protocol.o
11-
$(CC) -o $@ $^
12+
$(CC) $(CFLAGS) -o $@ $^
13+
14+
util_packet_body: util_packet_body.o varint.o
15+
$(CC) $(CFLAGS) -o $@ $^
1216

1317
packet: packet.o varint.o
1418
$(CC) $(CFLAGS) -c $^ -o $@

src/mc_protocol.c

Lines changed: 5 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ typedef struct encryption_request_response_writable {
2424
uint8_t should_authenticate;
2525
} encryptionRequestResponseWritable;
2626

27-
typedef struct len_data_pair {
28-
size_t len;
29-
uint8_t* data;
30-
} lenDataPair;
31-
3227
/* enum SERVER_STATE { */
3328
/* STATE_STATUS = 1, */
3429
/* STATE_LOGIN = 2, */
@@ -38,13 +33,6 @@ typedef struct len_data_pair {
3833
//-------------------------------------
3934
//-----PRIVATE UTIL PREDECLARATION-----
4035
//-------------------------------------
41-
42-
lenDataPair** parse_generic_packet_body(
43-
const uint8_t* body,
44-
size_t body_len,
45-
int num_pairs
46-
);
47-
4836
uint8_t* get_handshake_packet_body(
4937
int protocol_version,
5038
const char server_addr[255],
@@ -66,9 +54,9 @@ uint8_t* get_handshake_packet_body(int protocol_version, const char server_addr[
6654

6755
size_t server_address_len = strnlen(server_addr, 254) + 1;
6856

69-
Varint *protocol_version_vint = varint_int_to_vint(protocol_version);
70-
Varint *server_addr_len_vint = varint_int_to_vint(server_address_len);
71-
Varint *next_state_vint = varint_int_to_vint(next_state);
57+
Varint *protocol_version_vint = varint_vint_from_int(protocol_version);
58+
Varint *server_addr_len_vint = varint_vint_from_int(server_address_len);
59+
Varint *next_state_vint = varint_vint_from_int(next_state);
7260

7361

7462
*buff_len =
@@ -98,81 +86,10 @@ uint8_t* get_handshake_packet_body(int protocol_version, const char server_addr[
9886
return buff;
9987
}
10088

101-
102-
lenDataPair** parse_generic_packet_body(
103-
const uint8_t* body,
104-
size_t body_len,
105-
int num_pairs
106-
) {
107-
bool failure = false;
108-
109-
lenDataPair** result = malloc(sizeof(lenDataPair*) * num_pairs);
110-
failure = !c_assert(
111-
result != NULL,
112-
"Could not allocate space for array of lenDataPair pointers"
113-
);
114-
115-
if(failure) {
116-
return NULL;
117-
}
118-
119-
size_t offset = 0;
120-
int i = 0;
121-
for(; i < num_pairs && body_len && !failure; i++) {
122-
result[i] = malloc(sizeof(lenDataPair));
123-
failure = !c_assert(
124-
result != NULL,
125-
"Could not allocate space for lenDataPair"
126-
);
127-
if(failure) break;
128-
129-
int chunk_len = varint_bytes_to_int(body);
130-
failure = !c_assert(
131-
chunk_len >= 0,
132-
"Could beginning of chunk to varint"
133-
);
134-
if(failure) break;
135-
offset += chunk_len;
136-
137-
result[i]->len = chunk_len;
138-
result[i]->data = malloc(chunk_len);
139-
failure = !c_assert(
140-
result[i]->data != NULL,
141-
"Could not allocate chunk body"
142-
);
143-
if(failure) break;
144-
145-
memcpy(result[i]->data, body + offset, chunk_len);
146-
offset += chunk_len;
147-
}
148-
149-
if(failure) {
150-
//don't go freeing all the way, we need to be careful with
151-
//freeing the last bit of data
152-
for(int j = 0; j < i - 1 ; j++) {
153-
free(result[j]->data);
154-
free(result[j]);
155-
}
156-
157-
if(result[i - 1] != NULL) {
158-
if(result[i - 1]->data != NULL) {
159-
free(result[i - 1]->data);
160-
}
161-
free(result[i - 1]);
162-
}
163-
164-
free(result);
165-
}
166-
167-
return failure ? NULL : result;
168-
}
169-
170-
171-
17289
//----------------------------
17390
//----- PUBLIC FUNCTIONS -----
17491
//----------------------------
175-
//
92+
17693
bool mc_protocol_handshake_custom(
17794
int sock,
17895
const char* server_addr,
@@ -267,7 +184,7 @@ bool mc_protocol_login_request(
267184
}
268185

269186
size_t username_length = strnlen(username, MAX_USERNAME_LENGTH);
270-
Varint* username_length_vint = varint_int_to_vint(username_length);
187+
Varint* username_length_vint = varint_vint_from_int(username_length);
271188
bool error = !c_assert(
272189
username_length_vint != NULL,
273190
"Could not convert username length into a varint"

src/packet.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ int read_all(int sock, void* buff, size_t buff_len) {
6868

6969

7070
size_t packet_writable_get_data_len(const packetWritable* p) {
71-
return varint_vint_to_int(p->packet_len) - p->packet_id->len;
71+
return varint_int_from_vint(p->packet_len) - p->packet_id->len;
7272
}
7373

7474

7575
size_t packet_writable_get_total_len(const packetWritable* p) {
76-
return varint_vint_to_int(p->packet_len) + p->packet_len->len;
76+
return varint_int_from_vint(p->packet_len) + p->packet_len->len;
7777
}
7878

7979

@@ -161,10 +161,10 @@ packetReadable* packet_readable_from_writable(
161161
.data_copied = copy_data,
162162
};
163163

164-
int packet_id = varint_vint_to_int(p->packet_id);
164+
int packet_id = varint_int_from_vint(p->packet_id);
165165

166166
size_t data_len =
167-
varint_vint_to_int(p->packet_len) - p->packet_id->len;
167+
varint_int_from_vint(p->packet_len) - p->packet_id->len;
168168

169169
packetReadable* p_readable = malloc(sizeof(packetReadable));
170170
*p_readable = (packetReadable){
@@ -233,7 +233,7 @@ packetWritable* packet_writable_from_readable(
233233
packetWritable* p_writable = malloc(sizeof(packetWritable));
234234
*p_writable = (packetWritable){
235235
.metadata = metadata,
236-
.packet_id = varint_int_to_vint(p->packet_id),
236+
.packet_id = varint_vint_from_int(p->packet_id),
237237
};
238238

239239
if(copy_data) {
@@ -245,7 +245,7 @@ packetWritable* packet_writable_from_readable(
245245
}
246246

247247
p_writable->packet_len =
248-
varint_int_to_vint(p->data_len + p_writable->packet_id->len);
248+
varint_vint_from_int(p->data_len + p_writable->packet_id->len);
249249

250250
return p_writable;
251251
}
@@ -307,7 +307,7 @@ packetWritable* packet_writable_from_stream(int fd) {
307307
);
308308
if(error) { return NULL; }
309309

310-
int packet_len = varint_vint_to_int(packet_len_vint);
310+
int packet_len = varint_int_from_vint(packet_len_vint);
311311

312312
Varint* packet_id_vint = varint_vint_from_stream(fd);
313313
error = !c_assert(packet_id_vint != NULL,
@@ -405,7 +405,7 @@ size_t packet_writable_length(const packetWritable* p) {
405405
errno = ERRNO_BAD_VAL;
406406
return 0;
407407
}
408-
return varint_vint_to_int(p->packet_len) +
408+
return varint_int_from_vint(p->packet_len) +
409409
p->packet_len->len;
410410
}
411411

src/util_packet_body.c

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
#include "../include/util_packet_body.h"
2+
#include "../include/varint.h"
3+
#include "../include/assertlib.h"
4+
5+
#include <stdbool.h>
6+
#include <string.h>
7+
#include <stdlib.h>
8+
#include <stdint.h>
9+
10+
lenDataPair** util_packet_parse_generic_body(
11+
const uint8_t* body,
12+
size_t body_len,
13+
int num_pairs
14+
) {
15+
bool precond_met = c_assert(body != NULL, "Passed NULL body");
16+
precond_met &= c_warn(body_len > 0 && num_pairs > 0,
17+
"body_len: %zu num_pairs: %d",
18+
body_len, num_pairs
19+
);
20+
if(!precond_met) {
21+
return NULL;
22+
}
23+
24+
bool failure = false;
25+
lenDataPair** result = malloc(sizeof(lenDataPair*) * num_pairs);
26+
failure = !c_assert(
27+
result != NULL,
28+
"Could not allocate space for array of lenDataPair pointers"
29+
);
30+
31+
if(failure) {
32+
return NULL;
33+
}
34+
35+
size_t offset = 0;
36+
int i = 0;
37+
for(; i < num_pairs && offset <= body_len && body_len; i++) {
38+
39+
result[i] = malloc(sizeof(lenDataPair));
40+
failure = !c_assert(
41+
result != NULL,
42+
"Could not allocate space for lenDataPair"
43+
);
44+
if(failure) break;
45+
46+
Varint* chunk_body_len_vint = varint_vint_from_bytes(body + offset);
47+
failure = !c_assert(
48+
chunk_body_len_vint != NULL,
49+
"Could not parse beginning of chunk to varint"
50+
);
51+
if(failure) break;
52+
53+
size_t chunk_body_len = (size_t)varint_int_from_vint(chunk_body_len_vint);
54+
offset += chunk_body_len_vint->len;
55+
varint_free(chunk_body_len_vint);
56+
failure = !c_assert(
57+
offset + chunk_body_len <= body_len,
58+
"Data chunk is larger than the space remaining in body."
59+
);
60+
if(failure) break;
61+
62+
failure = !c_assert(offset + chunk_body_len != body_len || i + 1 == num_pairs,
63+
"Number of chunks are less than number specified (%d < %d)",
64+
i + 1,
65+
num_pairs
66+
);
67+
if(failure) break;
68+
69+
//copy the chunk to a data len pair
70+
result[i]->len = chunk_body_len;
71+
result[i]->data = malloc(chunk_body_len);
72+
failure = !c_assert(
73+
result[i]->data != NULL,
74+
"Could not allocate chunk body"
75+
);
76+
if(failure) break;
77+
memcpy(result[i]->data, body + offset, chunk_body_len);
78+
offset += chunk_body_len;
79+
}
80+
failure |= !failure && !c_assert(offset == body_len,
81+
"Number of chunks is more than specificed"
82+
);
83+
84+
if(failure) {
85+
util_packet_body_lenDataPair_pairs_free(result, i);
86+
}
87+
88+
return failure ? NULL : result;
89+
}
90+
91+
void util_packet_body_lenDataPair_pairs_free(lenDataPair** pairs, int num_pairs) {
92+
bool precond_met = c_warn(pairs != NULL, "Passed NULL pairs");
93+
if(!precond_met) {
94+
return;
95+
}
96+
97+
for(int i = 0; i < num_pairs; i++) {
98+
bool is_null = !c_warn(pairs[i] != NULL, "pairs contains NULL pair");
99+
if(!is_null) {
100+
util_packet_body_lenDataPair_free(pairs[i]);
101+
}
102+
}
103+
104+
c_warn(num_pairs > 0, "Passed num_pairs = %d", num_pairs);
105+
free(pairs);
106+
}
107+
108+
109+
void util_packet_body_lenDataPair_free(lenDataPair* pair) {
110+
bool precond_met = c_warn(pair != NULL, "Passed NULL pair");
111+
if(!precond_met) {
112+
return;
113+
}
114+
115+
//may be legitimately be null on malloc(0)
116+
if(pair->data != NULL) {
117+
free(pair->data);
118+
}
119+
free(pair);
120+
}

0 commit comments

Comments
 (0)