C Temelleri

Pointer'lar ve String'ler

Pointer’lar ve string’ler - BPF programları için EN KRİTİK C konusu. Kernel memory erişimi, packet parsing ve buffer okuma tamamen pointer’lar üzerinden yapılır.

1.8 Pointer’lar

Ön koşul: Önce array’leri tamamlayın.

  • Pointer tanımlama ve dereference etme (*ptr)
  • Pointer arithmetic (ptr + 1’in ne anlama geldiği)
  • void* kullanımı
  • Double pointer’lar (**ptr)

BPF’te kritik pattern - bounds checking:

// XDP'de, packet data'ya erişmeden önce:
if (data + sizeof(struct ethhdr) > data_end)
    return XDP_DROP;

Two-Stage Pointer Dereference

BPF’te sık karşılaşılan bir pattern - bir pointer array’deki her elemana erişim:

// 1. Array'den pointer'ı okuyun
bpf_probe_read_user(&arg_ptr, sizeof(arg_ptr), &argv[i]);
// 2. Pointer'dan string'i okuyun
bpf_probe_read_user_str(arg_buf, sizeof(arg_buf), arg_ptr);

BPF Memory Read Helper’ları

BPF’te doğrudan pointer dereference yasaklanmıştır. Helper fonksiyonlar kullanmalısınız:

  • bpf_probe_read_kernel(dst, size, src) - kernel memory’den okuma
  • bpf_probe_read_kernel_str(dst, size, src) - kernel memory’den string okuma
  • bpf_probe_read_user(dst, size, src) - user space memory’den okuma
  • bpf_probe_read_user_str(dst, size, src) - user space memory’den string okuma

İlgili eBPFHub alıştırmaları:

  • “Reading event data” - bpf_probe_read_kernel_str ile kernel memory’den güvenli okuma
  • “Tracing a system call” - bpf_probe_read_user_str ile user space memory’den okuma
  • “Reading syscall arrays” - two-stage pointer dereference pratiği
  • “Reading syscall buffers” - buffer pointer’ını map’te saklayıp exit’te (void *)*buf_ptr ile dereference etme

xdp-tutorial’da bakın: packet01-parsing/xdp_prog_kern.c:64-86 - data, data_end, bounds check.

Alıştırma:

  1. Bir int array oluşturun ve pointer ile gezinin
  2. ptr + 1 ile ptr + sizeof(*ptr) arasındaki farkı anlayın (AYNI ŞEY DEĞİLDİR!)

1.9 String’ler

Ön koşul: Önce pointer’ları tamamlayın (string = char pointer).

  • char array vs char pointer
  • NULL terminator (\0)
  • String fonksiyonları: strlen, strcpy, strcmp

BPF’te sınırlı:

  • bpf_probe_read_str veya bpf_probe_read_user_str ile okuma
  • Sabit boyut gerekli (verifier)
  • Standart string fonksiyonları yok

BPF string helper’ları:

  • bpf_strncmp(s1, s1_sz, s2) - değişken bir string’i sabit bir değerle karşılaştırma
  • bpf_strstr(haystack, needle) - substring arama (kernel 6.x+)
  • bpf_strchr(str, c) - karakter arama (kernel 6.x+)

İlgili eBPFHub alıştırmaları:

  • “Process context” - bpf_strncmp() ile process name’e göre filtreleme
  • “Reading TCP packets” - HTTP header’larında bpf_strstr() ile “Authorization: Bearer ” arama, token çıkarma

Alıştırma: Kendi strlen fonksiyonunuzu yazın (pointer ile gezin, \0’a kadar sayın).