Skip to content

Commit ed4d2ec

Browse files
committed
50: improve code
1 parent 1cca53e commit ed4d2ec

File tree

3 files changed

+19
-13
lines changed

3 files changed

+19
-13
lines changed
-29.5 KB
Binary file not shown.
-29.5 KB
Binary file not shown.

50-tc-extract-http-header/main.bpf.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,30 @@ struct result_t {
2222
};
2323

2424
// extract "User-Agent"
25-
// don't true the result if the request is coming from user
25+
// don't trust the result if the request is coming from user
2626
static __always_inline int extract_user_agent_header(
2727
struct __sk_buff *skb, u32 offset, int msg_len, struct result_t *result) {
2828
int i, start_pos = -1;
2929
long err;
30+
u32 initial_offset = offset; // Store initial offset for later use
3031

32+
// Limit search length to prevent excessive processing
3133
int search_len = msg_len;
3234
if (search_len > MAX_HEADER_LEN) {
3335
search_len = MAX_HEADER_LEN;
3436
}
3537

38+
// Search for "User-Agent: " header (12 characters)
3639
char word[] = "User-Agent: ";
3740
#pragma unroll
38-
for (i = 0; i <= search_len - 8; i++) {
41+
for (i = 0; i <= search_len - 12; i++) {
3942
err = bpf_skb_load_bytes(skb, offset, &word, sizeof(word)-1);
4043
if (err < 0) {
4144
bpf_printk("BPF read word failed at offset %d, err %d", offset, err);
4245
break;
4346
}
4447
bpf_printk("offset %d, word: %s", offset, word);
45-
// "User-Agent: "
48+
// Check for exact match with "User-Agent: "
4649
if (word[0] == 'U' && word[1] == 's' && word[2] == 'e' &&
4750
word[3] == 'r' && word[4] == '-' && word[5] == 'A' &&
4851
word[6] == 'g' && word[7] == 'e' && word[8] == 'n' &&
@@ -53,32 +56,35 @@ static __always_inline int extract_user_agent_header(
5356
offset++;
5457
}
5558

59+
// If "User-Agent: " not found, return error
5660
if (start_pos < 0) {
57-
bpf_printk("'User-Agent: ' not found"); // Optional debug print
58-
return -1; // Pattern not found
61+
bpf_printk("'User-Agent: ' not found");
62+
return -1;
5963
}
64+
65+
// Check if there's enough data to read User-Agent value
6066
if (search_len - start_pos <= 0) {
6167
bpf_printk("invalid data");
6268
return -1;
6369
}
70+
offset = initial_offset + start_pos;
6471

72+
// Read the User-Agent value until CR, LF or buffer full
6573
int j = 0;
6674
#pragma unroll
67-
for (j = 0; j<= search_len - start_pos; j++) {
75+
for (j = 0; j <= MAX_VALUE_SIZE - 1 && j <= search_len - start_pos; j++) {
6876
char c;
69-
err = bpf_skb_load_bytes(skb, offset, &c, sizeof(c));
77+
err = bpf_skb_load_bytes(skb, offset + j, &c, sizeof(c));
7078
if (err < 0) {
71-
bpf_printk("BPF read word failed at offset %d, err %d", i, err);
79+
bpf_printk("BPF read failed at offset %d, err %d", offset + j, err);
7280
break;
7381
}
74-
offset++;
82+
83+
// Stop at line break
7584
if (c == '\r' || c == '\n') {
7685
break;
7786
}
78-
if (j >= MAX_VALUE_SIZE - 1) {
79-
bpf_printk("Buffer overflow");
80-
break;
81-
}
87+
8288
result->value[j] = c;
8389
}
8490
result->value[j] = '\0'; // Null-terminate the string

0 commit comments

Comments
 (0)