[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