[compiler-rt] [compiler-rt][sanitizer-common] intercept getaddrinfo_a for Linux. (PR #123167)

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 22 16:00:19 PST 2025


================
@@ -10263,6 +10263,58 @@ INTERCEPTOR(SSIZE_T, freadlink, int fd, char *buf, SIZE_T bufsiz) {
 #  define INIT_FREADLINK
 #endif
 
+#if SANITIZER_INTERCEPT_GETADDRINFO_A
+INTERCEPTOR(int, getaddrinfo_a, int mode, struct __sanitizer_gaicb *list,
+            int num, void *sevp) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, getaddrinfo_a, mode, list, num, sevp);
+  if (sevp)
+    COMMON_INTERCEPTOR_READ_RANGE(ctx, sevp, struct_sigevent_sz);
+  if (list) {
+    for (int i = 0; i < num; i++) {
+      struct __sanitizer_gaicb *cb = list[i];
+      COMMON_INTERCEPTOR_READ_RANGE(ctx, cb, sizeof(__sanitizer_gaicb));
+      if (cb->ar_name)
+        COMMON_INTERCEPTOR_READ_RANGE(ctx, cb->ar_name,
+                                      internal_strlen(cb->ar_name) + 1);
+      if (cb->ar_service)
+        COMMON_INTERCEPTOR_READ_RANGE(ctx, cb->ar_service,
+                                      internal_strlen(cb->ar_service) + 1);
+      if (cb->ar_request) {
+        COMMON_INTERCEPTOR_READ_RANGE(ctx, cb->ar_request,
+                                      sizeof(__sanitizer_addrinfo));
+      }
+    }
+  }
+
+  int res = REAL(getaddrinfo_a)(mode, list, num, sevp);
+  if (res == 0 && list) {
----------------
vitalybuka wrote:

it's probably incorrect for NOWAIT?

implementation can memcpy from internal buffers after we call WRITE_RANGE
I guess we need to replace sevp with own handler, and then WRITE_RANGE before calling the real one.

https://github.com/llvm/llvm-project/pull/123167


More information about the llvm-commits mailing list