pastebin - collaborative debugging tool
rovema.kpaste.net RSS

Difference between
modified post ce2 by Anonymous on Wed 6th Jul 2022 12:53
original post a1ab9a3 by Anonymous on Wed 6th Jul 2022 12:17
Download diff
Show old version | new version | both versions

    
11
--- /dev/null	2022-04-19 22:28:32.062891741 +0200
2-
+++ pthread_mutex_init_log.c	2022-07-06 13:16:29.462859109 +0200
2+
+++ pthread_interceptor.c	2022-07-06 13:47:43.337141261 +0200
3-
@@ -0,0 +1,82 @@
3+
@@ -0,0 +1,86 @@
44
+/*
5-
+ * phread_mutext_init_log.c
5+
+ * pthread_interceptor.c
66
+ *
7-
+ * intercept |pthread_mutex_init()| via LD_PRELOAD
7+
+ * intercept pthread calls liek |pthread_mutex_init()| via LD_PRELOAD
88
+ *
99
+ * Written by Roland Mainz <roland.mainz@nrubsig.org>
1010
+ */
1111
+
1212
+#define _GNU_SOURCE 1 /* needed for |RTLD_NEXT| */
1313
+
1414
+#include <pthread.h>
1515
+#include <unistd.h>
1616
+#include <errno.h>
1717
+#include <stdio.h>
1818
+#include <string.h>
1919
+#include <stdbool.h>
2020
+#include <dlfcn.h>
2121
+
2222
+/* config */
23-
+#define PMICFG_PRINT_ONCE_MSG 1
23+
+#define PICFG_PRINT_ONCE_MSG 1
24-
+#define PMICFG_ENFORCE_PRIO_INHERIT 1
24+
+#define PICFG_ENFORCE_PRIO_INHERIT 1
2525
+
26+
+/* misc */
2727
+#define STDERR_MSG(msg) \
2828
+	(void)write(STDERR_FILENO, (msg), strlen(msg))
2929
+
30+
+
3034
+int pthread_mutex_init(pthread_mutex_t *restrict mutex,
3135
+		const pthread_mutexattr_t *restrict attr) {
3236
+	pthread_mutexattr_t *xattr = (pthread_mutexattr_t *)attr;
3337
+	int pmi_res;
3438
+	int pmi_errno;
3539
+
36-
+#if PMICFG_PRINT_ONCE_MSG
40+
+#if PICFG_PRINT_ONCE_MSG
3741
+	static int once = 0;
38-
+	const char *mymessage = "pthread_mutex_init_log.so: "
42+
+	const char *mymessage = "pthread_interceptor.so: "
3943
+		"Once: In our own pthread_mutex_init()\n";
4044
+	/* just print message ONCE */
4145
+	if (once++ == 0)
4246
+		STDERR_MSG(mymessage);
43-
+#endif /* PMICFG_PRINT_ONCE_MSG */
47+
+#endif /* PICFG_PRINT_ONCE_MSG */
4448
+
4549
+	int (*original_pthread_mutex_init)(pthread_mutex_t *restrict mutex,
4650
+		const pthread_mutexattr_t *restrict attr);
4751
+	original_pthread_mutex_init = dlsym(RTLD_NEXT, "pthread_mutex_init");
4852
+
4953
+	pthread_mutexattr_t myattr;
5054
+	bool myattr_used = false;
5155
+
5256
+	if (!xattr) {
5357
+		(void)pthread_mutexattr_init(&myattr);
5458
+		myattr_used = true;
5559
+		xattr = &myattr;
5660
+	}
5761
+
58-
+#if PMICFG_ENFORCE_PRIO_INHERIT
62+
+#if PICFG_ENFORCE_PRIO_INHERIT
5963
+	int mutex_protocol = -666;
6064
+	(void)pthread_mutexattr_getprotocol(xattr, &mutex_protocol);
6165
+	if (mutex_protocol != PTHREAD_PRIO_INHERIT) {
6266
+		char msgbuff[256]; /* fixed size, but no |malloc()| allowed here */
6367
+
6468
+		(void)pthread_mutexattr_setprotocol(xattr, PTHREAD_PRIO_INHERIT);
6569
+		(void)snprintf(msgbuff,
6670
+			sizeof(msgbuff),
67-
+			"pthread_mutex_init_log.so: "
71+
+			"pthread_interceptor.so: "
6872
+			"PTHREAD_PRIO_INHERIT enforced "
69-
+			"for mutex=%lx, was protocol=%d\n",
73+
+			"for mutex=0x%lx, was protocol=%d\n",
70-
+			(void *)mutex,
74+
+			(unsigned long)(void *)mutex,
7175
+			mutex_protocol);
7276
+		STDERR_MSG(msgbuff);
7377
+	}
74-
+#endif /* PMICFG_ENFORCE_PRIO_INHERIT */
78+
+#endif /* PICFG_ENFORCE_PRIO_INHERIT */
7579
+
7680
+	pmi_res = (*original_pthread_mutex_init)(mutex, xattr);
7781
+	pmi_errno = errno;
7882
+
7983
+	if (myattr_used) {
8084
+		(void)pthread_mutexattr_destroy(&myattr);
8185
+	}
8286
+
8387
+	errno = pmi_errno;
8488
+	return pmi_res;
8589
+}
8690
--- /dev/null	2022-04-19 22:28:32.062891741 +0200
87-
+++ test1.c	2022-07-06 13:15:43.266402121 +0200
91+
+++ test1.c	2022-07-06 13:52:16.151772792 +0200
88-
@@ -0,0 +1,20 @@
92+
@@ -0,0 +1,27 @@
93+
+/*
9297
+
93-
+int main(void) {
98+
+#include <stdlib.h>
99+
+#include <stdio.h>
95102
+
103+
+int main(int ac, char *av[])
96107
+	pthread_mutex_t mutex1;
97108
+	pthread_mutex_t mutex2;
98109
+
99-
+	pthread_mutex_init(&mutex1, NULL);
110+
+	(void)pthread_mutex_init(&mutex1, NULL);
100111
+	perror("pthread_mutex_init(1) result");
101112
+
102-
+	pthread_mutex_init(&mutex2, NULL);
113+
+	(void)pthread_mutex_init(&mutex2, NULL);
103114
+	perror("pthread_mutex_init(2) result");
104115
+
105116
+	(void)puts("# end.");
106117
+
107-
+	return 0;
118+
+	return EXIT_SUCCESS;
108119
+}
109120
--- /dev/null	2022-04-19 22:28:32.062891741 +0200
110-
+++ Makefile	2022-07-06 13:07:04.461318913 +0200
121+
+++ Makefile	2022-07-06 13:50:52.426969179 +0200
111-
@@ -0,0 +1,22 @@
122+
@@ -0,0 +1,24 @@
113123
+#
114-
+# Makefile for pthread_mutex_init.so
124+
+# Makefile for LD_PRELOAD pthreadinterceptor
116125
+#
117126
+
118-
+pthread_mutex_init_log.o: pthread_mutex_init_log.c
127+
+CSTDFLAGS=-std=c11
119-
+	gcc -std=gnu11 -g pthread_mutex_init_log.c -fPIC -c -o pthread_mutex_init_log.o
128+
+CC=gcc # gcc or clang
122129
+
130+
+pthread_interceptor.o: pthread_interceptor.c
123135
+test1: test1.c
124-
+	gcc -std=gnu11 -g test1.c -o test1
136+
+	$(CC) $(CSTDFLAGS) -Wall -g test1.c -o test1
125137
+
126-
+run_test: test1 pthread_mutex_init_log.so
138+
+run_test: test1 pthread_interceptor.so
127-
+	ksh93 -c 'LD_PRELOAD=$$PWD/pthread_mutex_init_log.so ./test1'
139+
+	ksh93 -c 'LD_PRELOAD=$$PWD/pthread_interceptor.so ./test1'
128140
+
129141
+all:	run_test
130142
+
131143
+clean:
132144
+	rm -f *.o *.so test1
133145
+
146+
+# EOF.
134147

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at