ソースを参照

Test case to exploit dladdr bug

Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono@st.com>
Carmelo Amoroso 16 年 前
コミット
6c61a9fdfb
2 ファイル変更27 行追加1 行削除
  1. 2 1
      test/dlopen/Makefile
  2. 25 0
      test/dlopen/dladdr.c

+ 2 - 1
test/dlopen/Makefile

@@ -4,7 +4,7 @@
 # rules need a little love to work with glibc ...
 export UCLIBC_ONLY := 1
 
-TESTS := dltest dltest2 dlstatic test1 test2 test3 dlundef dlafk
+TESTS := dltest dltest2 dlstatic test1 test2 test3 dlundef dlafk dladdr
 
 include ../Test.mak
 
@@ -19,6 +19,7 @@ LDFLAGS_dlafk    := -ldl ./libafk.so -Wl,-rpath,.
 LDFLAGS_test1    := -ldl
 LDFLAGS_test2    := -ldl
 LDFLAGS_test3    := -ldl ./libtest1.so ./libtest2.so -Wl,-rpath,.
+LDFLAGS_dladdr   := -ldl
 
 DEBUG_LIBS := X
 WRAPPER := env $(DEBUG_LIBS)=all LD_LIBRARY_PATH="$$PWD:.:$(LD_LIBRARY_PATH)"

+ 25 - 0
test/dlopen/dladdr.c

@@ -0,0 +1,25 @@
+#include <dlfcn.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc, char **argv)
+{
+	Dl_info info;
+	int res = 0;
+
+	memset(&info, '\0', sizeof(Dl_info));
+	res = dladdr((void *)1, &info);
+	if (res != 0) {
+		fprintf(stderr, "dladdr() should fail\n");
+		fprintf(stderr, "dli_fname = %s\n", info.dli_fname);
+		fprintf(stderr, "dli_fbase = 0x%08x\n", (unsigned int)info.dli_fbase);
+		fprintf(stderr, "dli_sname = %s\n", info.dli_sname);
+		fprintf(stderr, "dli_saddr = 0x%08x\n", (unsigned int)info.dli_saddr);
+		exit(1);
+        }
+
+	fprintf(stderr, "dladdr() failed as expected\n");
+	return EXIT_SUCCESS;
+}
+