From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 25463 invoked from network); 8 May 2023 18:14:53 -0000 Received: from second.openwall.net (193.110.157.125) by inbox.vuxu.org with ESMTPUTF8; 8 May 2023 18:14:53 -0000 Received: (qmail 15741 invoked by uid 550); 8 May 2023 18:14:34 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 15662 invoked from network); 8 May 2023 18:14:33 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1683569661; x=1686161661; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Mumz/MmaCerABOVPJCtnzq0VR5q/G4oBRBTvoLGJhVA=; b=SdfJuavhbC8vXhFLzILcUwBQDOGHaehnJ0NZwOPoJmD8mTjnUhGRLahUKpBoD4e+HW pEHjqGmGvBzkzlaawRKAQYZRW8g7m87AqfYALgEgU40RuLtSTSvWXB+D4xr7TOCdIR88 1Vf1RATTyz+L2Qm/iuFW8MU/QgUIX5vXZSY3MQwoj7bCMmGcvn2thcA8YCzbjauQcCcL atjplLOw1lk1pSjpmcGVm0YN8SMiWJeB8KRsf9q9BalZy2sv4Updeot1HpgMOz/VvCSi VlKHF35yvorNNCLoOS/t8E2G5U/TIAuhzAEjfsHi0Qgj/9Jr4hIlxG0a8mtLZ/NnHvQr nstg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683569661; x=1686161661; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Mumz/MmaCerABOVPJCtnzq0VR5q/G4oBRBTvoLGJhVA=; b=HnlZxbFvNUlVNhIiShmF5cAdDJFQKT6Uadsd66M5ch98Pwkwgh89cElwE2o5yfV1OX OMHP+v8O89dW+i5K8UXkzC0bfmvbLRmc5ljMi9dfjTH2Mi4emhAq5T4ycPsYLeD7qSk5 u98I2wBOtKQl/H6aZzyWkHBMG8pNCvkhvl6J1MBvmsri6nBXr5UMmqDOijxe7yobn8Ra jh/fLUQydFu+CUIvsEY+w2qW8hu41+ECgUfEB/0NReZSx5+HsdOj1F1KAUGKv8DZxW/k UjIQJE83UYpUTUptNSw7Dbe6QNXx6TQIvEs28HqAmeI2HsgyI7OF0gfLk9DR9P5/L7jv SeJw== X-Gm-Message-State: AC+VfDys3SU/jjWYO11tWpuclDYWts6HSbUFi86wIZ7GBRhDp7OeiU6w xAa0qXUBFIwM3+clzJp0SKKMJcyw5UKB+g== X-Google-Smtp-Source: ACHHUZ5vdGYucGkMoZtb2m3H5KQe/xDc6GJavV53t/VQGD9L9YC5GJTzjtVHTTes2CpqX1rzI3/Y6w== X-Received: by 2002:a05:600c:c5:b0:3f4:2610:5cd0 with SMTP id u5-20020a05600c00c500b003f426105cd0mr2288601wmm.7.1683569661424; Mon, 08 May 2023 11:14:21 -0700 (PDT) From: Pedro Falcato To: musl@lists.openwall.com Cc: Pedro Falcato Date: Mon, 8 May 2023 19:14:13 +0100 Message-Id: <20230508181413.194379-3-pedro.falcato@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230508181413.194379-1-pedro.falcato@gmail.com> References: <20230508181413.194379-1-pedro.falcato@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [musl] [RFC PATCH 2/2] ldso: Add fdlopen Add fdlopen as specified and implemented in FreeBSD (see fdlopen(3) in the FreeBSD manpages). Signed-off-by: Pedro Falcato --- include/dlfcn.h | 1 + ldso/dynlink.c | 43 +++++++++++++++++++++++++++++++++++++++---- src/ldso/fdlopen.c | 10 ++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/ldso/fdlopen.c diff --git a/include/dlfcn.h b/include/dlfcn.h index 13ab71dd..6a01106d 100644 --- a/include/dlfcn.h +++ b/include/dlfcn.h @@ -33,6 +33,7 @@ typedef struct { } Dl_info; int dladdr(const void *, Dl_info *); int dlinfo(void *, int, void *); +void *fdlopen(int, int); #endif #if _REDIR_TIME64 diff --git a/ldso/dynlink.c b/ldso/dynlink.c index 2272b768..161dde52 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -2040,7 +2040,7 @@ static void prepare_lazy(struct dso *p) lazy_head = p; } -void *dlopen(const char *file, int mode) +static void *dlopen_internal(int fd, const char *file, int mode) { struct dso *volatile p, *orig_tail, *orig_syms_tail, *orig_lazy_head, *next; struct tls_module *orig_tls_tail; @@ -2050,8 +2050,6 @@ void *dlopen(const char *file, int mode) jmp_buf jb; struct dso **volatile ctor_queue = 0; - if (!file) return head; - pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); pthread_rwlock_wrlock(&lock); __inhibit_ptc(); @@ -2104,7 +2102,32 @@ void *dlopen(const char *file, int mode) tail->next = 0; p = 0; goto end; - } else p = load_library(file, head); + } else { + if (fd != -1) { + /* We were called from fdlopen. First, we must dup the fd (as FreeBSD does). */ + fd = fcntl(fd, F_DUPFD_CLOEXEC, 0); + if (fd < 0) { + error("Failed to duplicate file descriptor: %m"); + goto end; + } + + /* Now try to figure out the path using procfs. If we fail, use a fallback. */ + char path[PATH_MAX + 1]; + const char *pathname = path; + + __procfdname(path, fd); + ssize_t st = readlink(path, path, PATH_MAX); + if (st < 0) { + pathname = ""; + } else { + path[st] = '\0'; + } + + p = load_library_core(fd, head, pathname, pathname); + } else { + p = load_library(file, head); + } + } if (!p) { error(noload ? @@ -2167,6 +2190,18 @@ end: return p; } +void *fdlopen(int fd, int mode) +{ + if (fd == -1) return head; + return dlopen_internal(fd, 0, mode); +} + +void *dlopen(const char *file, int mode) +{ + if (!file) return head; + return dlopen_internal(-1, file, mode); +} + hidden int __dl_invalid_handle(void *h) { struct dso *p; diff --git a/src/ldso/fdlopen.c b/src/ldso/fdlopen.c new file mode 100644 index 00000000..a9380b57 --- /dev/null +++ b/src/ldso/fdlopen.c @@ -0,0 +1,10 @@ +#include +#include "dynlink.h" + +static void *stub_fdlopen(int fd, int mode) +{ + __dl_seterr("Dynamic loading not supported"); + return 0; +} + +weak_alias(stub_fdlopen, fdlopen); -- 2.40.1