diff options
Diffstat (limited to 'src/lib/libcrypto/dso')
-rw-r--r-- | src/lib/libcrypto/dso/Makefile | 142 | ||||
-rw-r--r-- | src/lib/libcrypto/dso/Makefile.ssl | 142 | ||||
-rw-r--r-- | src/lib/libcrypto/dso/README | 22 | ||||
-rw-r--r-- | src/lib/libcrypto/dso/dso.h | 52 | ||||
-rw-r--r-- | src/lib/libcrypto/dso/dso_dl.c | 317 | ||||
-rw-r--r-- | src/lib/libcrypto/dso/dso_dlfcn.c | 120 | ||||
-rw-r--r-- | src/lib/libcrypto/dso/dso_err.c | 22 | ||||
-rw-r--r-- | src/lib/libcrypto/dso/dso_lib.c | 29 | ||||
-rw-r--r-- | src/lib/libcrypto/dso/dso_null.c | 2 | ||||
-rw-r--r-- | src/lib/libcrypto/dso/dso_vms.c | 379 | ||||
-rw-r--r-- | src/lib/libcrypto/dso/dso_win32.c | 298 |
11 files changed, 1349 insertions, 176 deletions
diff --git a/src/lib/libcrypto/dso/Makefile b/src/lib/libcrypto/dso/Makefile new file mode 100644 index 0000000000..07f5d8d159 --- /dev/null +++ b/src/lib/libcrypto/dso/Makefile | |||
@@ -0,0 +1,142 @@ | |||
1 | # | ||
2 | # OpenSSL/crypto/dso/Makefile | ||
3 | # | ||
4 | |||
5 | DIR= dso | ||
6 | TOP= ../.. | ||
7 | CC= cc | ||
8 | INCLUDES= -I.. -I$(TOP) -I../../include | ||
9 | CFLAG=-g | ||
10 | MAKEFILE= Makefile | ||
11 | AR= ar r | ||
12 | |||
13 | CFLAGS= $(INCLUDES) $(CFLAG) | ||
14 | |||
15 | GENERAL=Makefile | ||
16 | TEST= | ||
17 | APPS= | ||
18 | |||
19 | LIB=$(TOP)/libcrypto.a | ||
20 | LIBSRC= dso_dl.c dso_dlfcn.c dso_err.c dso_lib.c dso_null.c \ | ||
21 | dso_openssl.c dso_win32.c dso_vms.c | ||
22 | LIBOBJ= dso_dl.o dso_dlfcn.o dso_err.o dso_lib.o dso_null.o \ | ||
23 | dso_openssl.o dso_win32.o dso_vms.o | ||
24 | |||
25 | SRC= $(LIBSRC) | ||
26 | |||
27 | EXHEADER= dso.h | ||
28 | HEADER= $(EXHEADER) | ||
29 | |||
30 | ALL= $(GENERAL) $(SRC) $(HEADER) | ||
31 | |||
32 | top: | ||
33 | (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all) | ||
34 | |||
35 | all: lib | ||
36 | |||
37 | lib: $(LIBOBJ) | ||
38 | $(AR) $(LIB) $(LIBOBJ) | ||
39 | $(RANLIB) $(LIB) || echo Never mind. | ||
40 | @touch lib | ||
41 | |||
42 | files: | ||
43 | $(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO | ||
44 | |||
45 | links: | ||
46 | @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER) | ||
47 | @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST) | ||
48 | @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS) | ||
49 | |||
50 | install: | ||
51 | @[ -n "$(INSTALLTOP)" ] # should be set by top Makefile... | ||
52 | @headerlist="$(EXHEADER)"; for i in $$headerlist ; \ | ||
53 | do \ | ||
54 | (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \ | ||
55 | chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \ | ||
56 | done; | ||
57 | |||
58 | tags: | ||
59 | ctags $(SRC) | ||
60 | |||
61 | tests: | ||
62 | |||
63 | lint: | ||
64 | lint -DLINT $(INCLUDES) $(SRC)>fluff | ||
65 | |||
66 | depend: | ||
67 | @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile... | ||
68 | $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) | ||
69 | |||
70 | dclean: | ||
71 | $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new | ||
72 | mv -f Makefile.new $(MAKEFILE) | ||
73 | |||
74 | clean: | ||
75 | rm -f *.o */*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff | ||
76 | |||
77 | # DO NOT DELETE THIS LINE -- make depend depends on it. | ||
78 | |||
79 | dso_dl.o: ../../e_os.h ../../include/openssl/bio.h | ||
80 | dso_dl.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
81 | dso_dl.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
82 | dso_dl.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
83 | dso_dl.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h | ||
84 | dso_dl.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h | ||
85 | dso_dl.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h | ||
86 | dso_dl.o: ../cryptlib.h dso_dl.c | ||
87 | dso_dlfcn.o: ../../e_os.h ../../include/openssl/bio.h | ||
88 | dso_dlfcn.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
89 | dso_dlfcn.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
90 | dso_dlfcn.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
91 | dso_dlfcn.o: ../../include/openssl/opensslconf.h | ||
92 | dso_dlfcn.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h | ||
93 | dso_dlfcn.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h | ||
94 | dso_dlfcn.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_dlfcn.c | ||
95 | dso_err.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h | ||
96 | dso_err.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
97 | dso_err.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
98 | dso_err.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h | ||
99 | dso_err.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h | ||
100 | dso_err.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h | ||
101 | dso_err.o: dso_err.c | ||
102 | dso_lib.o: ../../e_os.h ../../include/openssl/bio.h | ||
103 | dso_lib.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
104 | dso_lib.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
105 | dso_lib.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
106 | dso_lib.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h | ||
107 | dso_lib.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h | ||
108 | dso_lib.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h | ||
109 | dso_lib.o: ../cryptlib.h dso_lib.c | ||
110 | dso_null.o: ../../e_os.h ../../include/openssl/bio.h | ||
111 | dso_null.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
112 | dso_null.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
113 | dso_null.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
114 | dso_null.o: ../../include/openssl/opensslconf.h | ||
115 | dso_null.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h | ||
116 | dso_null.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h | ||
117 | dso_null.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_null.c | ||
118 | dso_openssl.o: ../../e_os.h ../../include/openssl/bio.h | ||
119 | dso_openssl.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
120 | dso_openssl.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
121 | dso_openssl.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
122 | dso_openssl.o: ../../include/openssl/opensslconf.h | ||
123 | dso_openssl.o: ../../include/openssl/opensslv.h | ||
124 | dso_openssl.o: ../../include/openssl/ossl_typ.h | ||
125 | dso_openssl.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h | ||
126 | dso_openssl.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_openssl.c | ||
127 | dso_vms.o: ../../e_os.h ../../include/openssl/bio.h | ||
128 | dso_vms.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
129 | dso_vms.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
130 | dso_vms.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
131 | dso_vms.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h | ||
132 | dso_vms.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h | ||
133 | dso_vms.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h | ||
134 | dso_vms.o: ../cryptlib.h dso_vms.c | ||
135 | dso_win32.o: ../../e_os.h ../../include/openssl/bio.h | ||
136 | dso_win32.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
137 | dso_win32.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
138 | dso_win32.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
139 | dso_win32.o: ../../include/openssl/opensslconf.h | ||
140 | dso_win32.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h | ||
141 | dso_win32.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h | ||
142 | dso_win32.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_win32.c | ||
diff --git a/src/lib/libcrypto/dso/Makefile.ssl b/src/lib/libcrypto/dso/Makefile.ssl new file mode 100644 index 0000000000..c0449d184e --- /dev/null +++ b/src/lib/libcrypto/dso/Makefile.ssl | |||
@@ -0,0 +1,142 @@ | |||
1 | # | ||
2 | # SSLeay/crypto/dso/Makefile | ||
3 | # | ||
4 | |||
5 | DIR= dso | ||
6 | TOP= ../.. | ||
7 | CC= cc | ||
8 | INCLUDES= -I.. -I$(TOP) -I../../include | ||
9 | CFLAG=-g | ||
10 | INSTALL_PREFIX= | ||
11 | OPENSSLDIR= /usr/local/ssl | ||
12 | INSTALLTOP=/usr/local/ssl | ||
13 | MAKE= make -f Makefile.ssl | ||
14 | MAKEDEPPROG= makedepend | ||
15 | MAKEDEPEND= $(TOP)/util/domd $(TOP) -MD $(MAKEDEPPROG) | ||
16 | MAKEFILE= Makefile.ssl | ||
17 | AR= ar r | ||
18 | |||
19 | CFLAGS= $(INCLUDES) $(CFLAG) | ||
20 | |||
21 | GENERAL=Makefile | ||
22 | TEST= | ||
23 | APPS= | ||
24 | |||
25 | LIB=$(TOP)/libcrypto.a | ||
26 | LIBSRC= dso_dl.c dso_dlfcn.c dso_err.c dso_lib.c dso_null.c \ | ||
27 | dso_openssl.c dso_win32.c dso_vms.c | ||
28 | LIBOBJ= dso_dl.o dso_dlfcn.o dso_err.o dso_lib.o dso_null.o \ | ||
29 | dso_openssl.o dso_win32.o dso_vms.o | ||
30 | |||
31 | SRC= $(LIBSRC) | ||
32 | |||
33 | EXHEADER= dso.h | ||
34 | HEADER= $(EXHEADER) | ||
35 | |||
36 | ALL= $(GENERAL) $(SRC) $(HEADER) | ||
37 | |||
38 | top: | ||
39 | (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all) | ||
40 | |||
41 | all: lib | ||
42 | |||
43 | lib: $(LIBOBJ) | ||
44 | $(AR) $(LIB) $(LIBOBJ) | ||
45 | $(RANLIB) $(LIB) || echo Never mind. | ||
46 | @touch lib | ||
47 | |||
48 | files: | ||
49 | $(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO | ||
50 | |||
51 | links: | ||
52 | @sh $(TOP)/util/point.sh Makefile.ssl Makefile | ||
53 | @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER) | ||
54 | @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST) | ||
55 | @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS) | ||
56 | |||
57 | install: | ||
58 | @for i in $(EXHEADER) ; \ | ||
59 | do \ | ||
60 | (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \ | ||
61 | chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \ | ||
62 | done; | ||
63 | |||
64 | tags: | ||
65 | ctags $(SRC) | ||
66 | |||
67 | tests: | ||
68 | |||
69 | lint: | ||
70 | lint -DLINT $(INCLUDES) $(SRC)>fluff | ||
71 | |||
72 | depend: | ||
73 | $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) | ||
74 | |||
75 | dclean: | ||
76 | $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new | ||
77 | mv -f Makefile.new $(MAKEFILE) | ||
78 | |||
79 | clean: | ||
80 | rm -f *.o */*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff | ||
81 | |||
82 | # DO NOT DELETE THIS LINE -- make depend depends on it. | ||
83 | |||
84 | dso_dl.o: ../../e_os.h ../../include/openssl/bio.h | ||
85 | dso_dl.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
86 | dso_dl.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
87 | dso_dl.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
88 | dso_dl.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h | ||
89 | dso_dl.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h | ||
90 | dso_dl.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_dl.c | ||
91 | dso_dlfcn.o: ../../e_os.h ../../include/openssl/bio.h | ||
92 | dso_dlfcn.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
93 | dso_dlfcn.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
94 | dso_dlfcn.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
95 | dso_dlfcn.o: ../../include/openssl/opensslconf.h | ||
96 | dso_dlfcn.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h | ||
97 | dso_dlfcn.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h | ||
98 | dso_dlfcn.o: ../cryptlib.h dso_dlfcn.c | ||
99 | dso_err.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h | ||
100 | dso_err.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
101 | dso_err.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
102 | dso_err.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h | ||
103 | dso_err.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h | ||
104 | dso_err.o: ../../include/openssl/symhacks.h dso_err.c | ||
105 | dso_lib.o: ../../e_os.h ../../include/openssl/bio.h | ||
106 | dso_lib.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
107 | dso_lib.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
108 | dso_lib.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
109 | dso_lib.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h | ||
110 | dso_lib.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h | ||
111 | dso_lib.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_lib.c | ||
112 | dso_null.o: ../../e_os.h ../../include/openssl/bio.h | ||
113 | dso_null.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
114 | dso_null.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
115 | dso_null.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
116 | dso_null.o: ../../include/openssl/opensslconf.h | ||
117 | dso_null.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h | ||
118 | dso_null.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h | ||
119 | dso_null.o: ../cryptlib.h dso_null.c | ||
120 | dso_openssl.o: ../../e_os.h ../../include/openssl/bio.h | ||
121 | dso_openssl.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
122 | dso_openssl.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
123 | dso_openssl.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
124 | dso_openssl.o: ../../include/openssl/opensslconf.h | ||
125 | dso_openssl.o: ../../include/openssl/opensslv.h | ||
126 | dso_openssl.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h | ||
127 | dso_openssl.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_openssl.c | ||
128 | dso_vms.o: ../../e_os.h ../../include/openssl/bio.h | ||
129 | dso_vms.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
130 | dso_vms.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
131 | dso_vms.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
132 | dso_vms.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h | ||
133 | dso_vms.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h | ||
134 | dso_vms.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_vms.c | ||
135 | dso_win32.o: ../../e_os.h ../../include/openssl/bio.h | ||
136 | dso_win32.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h | ||
137 | dso_win32.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h | ||
138 | dso_win32.o: ../../include/openssl/err.h ../../include/openssl/lhash.h | ||
139 | dso_win32.o: ../../include/openssl/opensslconf.h | ||
140 | dso_win32.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h | ||
141 | dso_win32.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h | ||
142 | dso_win32.o: ../cryptlib.h dso_win32.c | ||
diff --git a/src/lib/libcrypto/dso/README b/src/lib/libcrypto/dso/README new file mode 100644 index 0000000000..d0bc9a89fb --- /dev/null +++ b/src/lib/libcrypto/dso/README | |||
@@ -0,0 +1,22 @@ | |||
1 | NOTES | ||
2 | ----- | ||
3 | |||
4 | I've checked out HPUX (well, version 11 at least) and shl_t is | ||
5 | a pointer type so it's safe to use in the way it has been in | ||
6 | dso_dl.c. On the other hand, HPUX11 support dlfcn too and | ||
7 | according to their man page, prefer developers to move to that. | ||
8 | I'll leave Richard's changes there as I guess dso_dl is needed | ||
9 | for HPUX10.20. | ||
10 | |||
11 | There is now a callback scheme in place where filename conversion can | ||
12 | (a) be turned off altogether through the use of the | ||
13 | DSO_FLAG_NO_NAME_TRANSLATION flag, | ||
14 | (b) be handled by default using the default DSO_METHOD's converter | ||
15 | (c) overriden per-DSO by setting the override callback | ||
16 | (d) a mix of (b) and (c) - eg. implement an override callback that; | ||
17 | (i) checks if we're win32 (if(strstr(dso->meth->name, "win32")....) | ||
18 | and if so, convert "blah" into "blah32.dll" (the default is | ||
19 | otherwise to make it "blah.dll"). | ||
20 | (ii) default to the normal behaviour - we're not on win32, eg. | ||
21 | finish with (return dso->meth->dso_name_converter(dso,NULL)). | ||
22 | |||
diff --git a/src/lib/libcrypto/dso/dso.h b/src/lib/libcrypto/dso/dso.h index 3e51913a72..aa721f7feb 100644 --- a/src/lib/libcrypto/dso/dso.h +++ b/src/lib/libcrypto/dso/dso.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* dso.h -*- mode:C; c-file-style: "eay" -*- */ | 1 | /* dso.h */ |
2 | /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL | 2 | /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -95,13 +95,6 @@ extern "C" { | |||
95 | */ | 95 | */ |
96 | #define DSO_FLAG_UPCASE_SYMBOL 0x10 | 96 | #define DSO_FLAG_UPCASE_SYMBOL 0x10 |
97 | 97 | ||
98 | /* This flag loads the library with public symbols. | ||
99 | * Meaning: The exported symbols of this library are public | ||
100 | * to all libraries loaded after this library. | ||
101 | * At the moment only implemented in unix. | ||
102 | */ | ||
103 | #define DSO_FLAG_GLOBAL_SYMBOLS 0x20 | ||
104 | |||
105 | 98 | ||
106 | typedef void (*DSO_FUNC_TYPE)(void); | 99 | typedef void (*DSO_FUNC_TYPE)(void); |
107 | 100 | ||
@@ -114,22 +107,6 @@ typedef struct dso_st DSO; | |||
114 | * condition) or a newly allocated string containing the transformed form that | 107 | * condition) or a newly allocated string containing the transformed form that |
115 | * the caller will need to free with OPENSSL_free() when done. */ | 108 | * the caller will need to free with OPENSSL_free() when done. */ |
116 | typedef char* (*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *); | 109 | typedef char* (*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *); |
117 | /* The function prototype used for method functions (or caller-provided | ||
118 | * callbacks) that merge two file specifications. They are passed a | ||
119 | * DSO structure pointer (or NULL if they are to be used independantly of | ||
120 | * a DSO object) and two file specifications to merge. They should | ||
121 | * either return NULL (if there is an error condition) or a newly allocated | ||
122 | * string containing the result of merging that the caller will need | ||
123 | * to free with OPENSSL_free() when done. | ||
124 | * Here, merging means that bits and pieces are taken from each of the | ||
125 | * file specifications and added together in whatever fashion that is | ||
126 | * sensible for the DSO method in question. The only rule that really | ||
127 | * applies is that if the two specification contain pieces of the same | ||
128 | * type, the copy from the first string takes priority. One could see | ||
129 | * it as the first specification is the one given by the user and the | ||
130 | * second being a bunch of defaults to add on if they're missing in the | ||
131 | * first. */ | ||
132 | typedef char* (*DSO_MERGER_FUNC)(DSO *, const char *, const char *); | ||
133 | 110 | ||
134 | typedef struct dso_meth_st | 111 | typedef struct dso_meth_st |
135 | { | 112 | { |
@@ -163,9 +140,6 @@ typedef struct dso_meth_st | |||
163 | /* The default DSO_METHOD-specific function for converting filenames to | 140 | /* The default DSO_METHOD-specific function for converting filenames to |
164 | * a canonical native form. */ | 141 | * a canonical native form. */ |
165 | DSO_NAME_CONVERTER_FUNC dso_name_converter; | 142 | DSO_NAME_CONVERTER_FUNC dso_name_converter; |
166 | /* The default DSO_METHOD-specific function for converting filenames to | ||
167 | * a canonical native form. */ | ||
168 | DSO_MERGER_FUNC dso_merger; | ||
169 | 143 | ||
170 | /* [De]Initialisation handlers. */ | 144 | /* [De]Initialisation handlers. */ |
171 | int (*init)(DSO *dso); | 145 | int (*init)(DSO *dso); |
@@ -190,13 +164,9 @@ struct dso_st | |||
190 | * don't touch meth_data! */ | 164 | * don't touch meth_data! */ |
191 | CRYPTO_EX_DATA ex_data; | 165 | CRYPTO_EX_DATA ex_data; |
192 | /* If this callback function pointer is set to non-NULL, then it will | 166 | /* If this callback function pointer is set to non-NULL, then it will |
193 | * be used in DSO_load() in place of meth->dso_name_converter. NB: This | 167 | * be used on DSO_load() in place of meth->dso_name_converter. NB: This |
194 | * should normally set using DSO_set_name_converter(). */ | 168 | * should normally set using DSO_set_name_converter(). */ |
195 | DSO_NAME_CONVERTER_FUNC name_converter; | 169 | DSO_NAME_CONVERTER_FUNC name_converter; |
196 | /* If this callback function pointer is set to non-NULL, then it will | ||
197 | * be used in DSO_load() in place of meth->dso_merger. NB: This | ||
198 | * should normally set using DSO_set_merger(). */ | ||
199 | DSO_MERGER_FUNC merger; | ||
200 | /* This is populated with (a copy of) the platform-independant | 170 | /* This is populated with (a copy of) the platform-independant |
201 | * filename used for this DSO. */ | 171 | * filename used for this DSO. */ |
202 | char *filename; | 172 | char *filename; |
@@ -239,11 +209,6 @@ int DSO_set_filename(DSO *dso, const char *filename); | |||
239 | * caller-created DSO_METHODs can do the same thing. A non-NULL return value | 209 | * caller-created DSO_METHODs can do the same thing. A non-NULL return value |
240 | * will need to be OPENSSL_free()'d. */ | 210 | * will need to be OPENSSL_free()'d. */ |
241 | char *DSO_convert_filename(DSO *dso, const char *filename); | 211 | char *DSO_convert_filename(DSO *dso, const char *filename); |
242 | /* This function will invoke the DSO's merger callback to merge two file | ||
243 | * specifications, or if the callback isn't set it will instead use the | ||
244 | * DSO_METHOD's merger. A non-NULL return value will need to be | ||
245 | * OPENSSL_free()'d. */ | ||
246 | char *DSO_merge(DSO *dso, const char *filespec1, const char *filespec2); | ||
247 | /* If the DSO is currently loaded, this returns the filename that it was loaded | 212 | /* If the DSO is currently loaded, this returns the filename that it was loaded |
248 | * under, otherwise it returns NULL. So it is also useful as a test as to | 213 | * under, otherwise it returns NULL. So it is also useful as a test as to |
249 | * whether the DSO is currently loaded. NB: This will not necessarily return | 214 | * whether the DSO is currently loaded. NB: This will not necessarily return |
@@ -308,13 +273,11 @@ void ERR_load_DSO_strings(void); | |||
308 | #define DSO_F_DLFCN_BIND_FUNC 100 | 273 | #define DSO_F_DLFCN_BIND_FUNC 100 |
309 | #define DSO_F_DLFCN_BIND_VAR 101 | 274 | #define DSO_F_DLFCN_BIND_VAR 101 |
310 | #define DSO_F_DLFCN_LOAD 102 | 275 | #define DSO_F_DLFCN_LOAD 102 |
311 | #define DSO_F_DLFCN_MERGER 130 | ||
312 | #define DSO_F_DLFCN_NAME_CONVERTER 123 | 276 | #define DSO_F_DLFCN_NAME_CONVERTER 123 |
313 | #define DSO_F_DLFCN_UNLOAD 103 | 277 | #define DSO_F_DLFCN_UNLOAD 103 |
314 | #define DSO_F_DL_BIND_FUNC 104 | 278 | #define DSO_F_DL_BIND_FUNC 104 |
315 | #define DSO_F_DL_BIND_VAR 105 | 279 | #define DSO_F_DL_BIND_VAR 105 |
316 | #define DSO_F_DL_LOAD 106 | 280 | #define DSO_F_DL_LOAD 106 |
317 | #define DSO_F_DL_MERGER 131 | ||
318 | #define DSO_F_DL_NAME_CONVERTER 124 | 281 | #define DSO_F_DL_NAME_CONVERTER 124 |
319 | #define DSO_F_DL_UNLOAD 107 | 282 | #define DSO_F_DL_UNLOAD 107 |
320 | #define DSO_F_DSO_BIND_FUNC 108 | 283 | #define DSO_F_DSO_BIND_FUNC 108 |
@@ -325,36 +288,27 @@ void ERR_load_DSO_strings(void); | |||
325 | #define DSO_F_DSO_GET_FILENAME 127 | 288 | #define DSO_F_DSO_GET_FILENAME 127 |
326 | #define DSO_F_DSO_GET_LOADED_FILENAME 128 | 289 | #define DSO_F_DSO_GET_LOADED_FILENAME 128 |
327 | #define DSO_F_DSO_LOAD 112 | 290 | #define DSO_F_DSO_LOAD 112 |
328 | #define DSO_F_DSO_MERGE 132 | ||
329 | #define DSO_F_DSO_NEW_METHOD 113 | 291 | #define DSO_F_DSO_NEW_METHOD 113 |
330 | #define DSO_F_DSO_SET_FILENAME 129 | 292 | #define DSO_F_DSO_SET_FILENAME 129 |
331 | #define DSO_F_DSO_SET_NAME_CONVERTER 122 | 293 | #define DSO_F_DSO_SET_NAME_CONVERTER 122 |
332 | #define DSO_F_DSO_UP_REF 114 | 294 | #define DSO_F_DSO_UP_REF 114 |
333 | #define DSO_F_VMS_BIND_SYM 115 | 295 | #define DSO_F_VMS_BIND_VAR 115 |
334 | #define DSO_F_VMS_LOAD 116 | 296 | #define DSO_F_VMS_LOAD 116 |
335 | #define DSO_F_VMS_MERGER 133 | ||
336 | #define DSO_F_VMS_UNLOAD 117 | 297 | #define DSO_F_VMS_UNLOAD 117 |
337 | #define DSO_F_WIN32_BIND_FUNC 118 | 298 | #define DSO_F_WIN32_BIND_FUNC 118 |
338 | #define DSO_F_WIN32_BIND_VAR 119 | 299 | #define DSO_F_WIN32_BIND_VAR 119 |
339 | #define DSO_F_WIN32_JOINER 135 | ||
340 | #define DSO_F_WIN32_LOAD 120 | 300 | #define DSO_F_WIN32_LOAD 120 |
341 | #define DSO_F_WIN32_MERGER 134 | ||
342 | #define DSO_F_WIN32_NAME_CONVERTER 125 | 301 | #define DSO_F_WIN32_NAME_CONVERTER 125 |
343 | #define DSO_F_WIN32_SPLITTER 136 | ||
344 | #define DSO_F_WIN32_UNLOAD 121 | 302 | #define DSO_F_WIN32_UNLOAD 121 |
345 | 303 | ||
346 | /* Reason codes. */ | 304 | /* Reason codes. */ |
347 | #define DSO_R_CTRL_FAILED 100 | 305 | #define DSO_R_CTRL_FAILED 100 |
348 | #define DSO_R_DSO_ALREADY_LOADED 110 | 306 | #define DSO_R_DSO_ALREADY_LOADED 110 |
349 | #define DSO_R_EMPTY_FILE_STRUCTURE 113 | ||
350 | #define DSO_R_FAILURE 114 | ||
351 | #define DSO_R_FILENAME_TOO_BIG 101 | 307 | #define DSO_R_FILENAME_TOO_BIG 101 |
352 | #define DSO_R_FINISH_FAILED 102 | 308 | #define DSO_R_FINISH_FAILED 102 |
353 | #define DSO_R_INCORRECT_FILE_SYNTAX 115 | ||
354 | #define DSO_R_LOAD_FAILED 103 | 309 | #define DSO_R_LOAD_FAILED 103 |
355 | #define DSO_R_NAME_TRANSLATION_FAILED 109 | 310 | #define DSO_R_NAME_TRANSLATION_FAILED 109 |
356 | #define DSO_R_NO_FILENAME 111 | 311 | #define DSO_R_NO_FILENAME 111 |
357 | #define DSO_R_NO_FILE_SPECIFICATION 116 | ||
358 | #define DSO_R_NULL_HANDLE 104 | 312 | #define DSO_R_NULL_HANDLE 104 |
359 | #define DSO_R_SET_FILENAME_FAILED 112 | 313 | #define DSO_R_SET_FILENAME_FAILED 112 |
360 | #define DSO_R_STACK_ERROR 105 | 314 | #define DSO_R_STACK_ERROR 105 |
diff --git a/src/lib/libcrypto/dso/dso_dl.c b/src/lib/libcrypto/dso/dso_dl.c new file mode 100644 index 0000000000..f7b4dfc0c3 --- /dev/null +++ b/src/lib/libcrypto/dso/dso_dl.c | |||
@@ -0,0 +1,317 @@ | |||
1 | /* dso_dl.c */ | ||
2 | /* Written by Richard Levitte (richard@levitte.org) for the OpenSSL | ||
3 | * project 2000. | ||
4 | */ | ||
5 | /* ==================================================================== | ||
6 | * Copyright (c) 2000 The OpenSSL Project. All rights reserved. | ||
7 | * | ||
8 | * Redistribution and use in source and binary forms, with or without | ||
9 | * modification, are permitted provided that the following conditions | ||
10 | * are met: | ||
11 | * | ||
12 | * 1. Redistributions of source code must retain the above copyright | ||
13 | * notice, this list of conditions and the following disclaimer. | ||
14 | * | ||
15 | * 2. Redistributions in binary form must reproduce the above copyright | ||
16 | * notice, this list of conditions and the following disclaimer in | ||
17 | * the documentation and/or other materials provided with the | ||
18 | * distribution. | ||
19 | * | ||
20 | * 3. All advertising materials mentioning features or use of this | ||
21 | * software must display the following acknowledgment: | ||
22 | * "This product includes software developed by the OpenSSL Project | ||
23 | * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | ||
24 | * | ||
25 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
26 | * endorse or promote products derived from this software without | ||
27 | * prior written permission. For written permission, please contact | ||
28 | * licensing@OpenSSL.org. | ||
29 | * | ||
30 | * 5. Products derived from this software may not be called "OpenSSL" | ||
31 | * nor may "OpenSSL" appear in their names without prior written | ||
32 | * permission of the OpenSSL Project. | ||
33 | * | ||
34 | * 6. Redistributions of any form whatsoever must retain the following | ||
35 | * acknowledgment: | ||
36 | * "This product includes software developed by the OpenSSL Project | ||
37 | * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | ||
38 | * | ||
39 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
40 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
41 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
42 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
43 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
44 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
45 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
46 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
47 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
48 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
49 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
50 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
51 | * ==================================================================== | ||
52 | * | ||
53 | * This product includes cryptographic software written by Eric Young | ||
54 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
55 | * Hudson (tjh@cryptsoft.com). | ||
56 | * | ||
57 | */ | ||
58 | |||
59 | #include <stdio.h> | ||
60 | #include "cryptlib.h" | ||
61 | #include <openssl/dso.h> | ||
62 | |||
63 | #ifndef DSO_DL | ||
64 | DSO_METHOD *DSO_METHOD_dl(void) | ||
65 | { | ||
66 | return NULL; | ||
67 | } | ||
68 | #else | ||
69 | |||
70 | #include <dl.h> | ||
71 | |||
72 | /* Part of the hack in "dl_load" ... */ | ||
73 | #define DSO_MAX_TRANSLATED_SIZE 256 | ||
74 | |||
75 | static int dl_load(DSO *dso); | ||
76 | static int dl_unload(DSO *dso); | ||
77 | static void *dl_bind_var(DSO *dso, const char *symname); | ||
78 | static DSO_FUNC_TYPE dl_bind_func(DSO *dso, const char *symname); | ||
79 | #if 0 | ||
80 | static int dl_unbind_var(DSO *dso, char *symname, void *symptr); | ||
81 | static int dl_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr); | ||
82 | static int dl_init(DSO *dso); | ||
83 | static int dl_finish(DSO *dso); | ||
84 | static int dl_ctrl(DSO *dso, int cmd, long larg, void *parg); | ||
85 | #endif | ||
86 | static char *dl_name_converter(DSO *dso, const char *filename); | ||
87 | |||
88 | static DSO_METHOD dso_meth_dl = { | ||
89 | "OpenSSL 'dl' shared library method", | ||
90 | dl_load, | ||
91 | dl_unload, | ||
92 | dl_bind_var, | ||
93 | dl_bind_func, | ||
94 | /* For now, "unbind" doesn't exist */ | ||
95 | #if 0 | ||
96 | NULL, /* unbind_var */ | ||
97 | NULL, /* unbind_func */ | ||
98 | #endif | ||
99 | NULL, /* ctrl */ | ||
100 | dl_name_converter, | ||
101 | NULL, /* init */ | ||
102 | NULL /* finish */ | ||
103 | }; | ||
104 | |||
105 | DSO_METHOD *DSO_METHOD_dl(void) | ||
106 | { | ||
107 | return(&dso_meth_dl); | ||
108 | } | ||
109 | |||
110 | /* For this DSO_METHOD, our meth_data STACK will contain; | ||
111 | * (i) the handle (shl_t) returned from shl_load(). | ||
112 | * NB: I checked on HPUX11 and shl_t is itself a pointer | ||
113 | * type so the cast is safe. | ||
114 | */ | ||
115 | |||
116 | static int dl_load(DSO *dso) | ||
117 | { | ||
118 | shl_t ptr = NULL; | ||
119 | /* We don't do any fancy retries or anything, just take the method's | ||
120 | * (or DSO's if it has the callback set) best translation of the | ||
121 | * platform-independant filename and try once with that. */ | ||
122 | char *filename= DSO_convert_filename(dso, NULL); | ||
123 | |||
124 | if(filename == NULL) | ||
125 | { | ||
126 | DSOerr(DSO_F_DL_LOAD,DSO_R_NO_FILENAME); | ||
127 | goto err; | ||
128 | } | ||
129 | ptr = shl_load(filename, BIND_IMMEDIATE | | ||
130 | (dso->flags&DSO_FLAG_NO_NAME_TRANSLATION?0:DYNAMIC_PATH), 0L); | ||
131 | if(ptr == NULL) | ||
132 | { | ||
133 | DSOerr(DSO_F_DL_LOAD,DSO_R_LOAD_FAILED); | ||
134 | ERR_add_error_data(4, "filename(", filename, "): ", | ||
135 | strerror(errno)); | ||
136 | goto err; | ||
137 | } | ||
138 | if(!sk_push(dso->meth_data, (char *)ptr)) | ||
139 | { | ||
140 | DSOerr(DSO_F_DL_LOAD,DSO_R_STACK_ERROR); | ||
141 | goto err; | ||
142 | } | ||
143 | /* Success, stick the converted filename we've loaded under into the DSO | ||
144 | * (it also serves as the indicator that we are currently loaded). */ | ||
145 | dso->loaded_filename = filename; | ||
146 | return(1); | ||
147 | err: | ||
148 | /* Cleanup! */ | ||
149 | if(filename != NULL) | ||
150 | OPENSSL_free(filename); | ||
151 | if(ptr != NULL) | ||
152 | shl_unload(ptr); | ||
153 | return(0); | ||
154 | } | ||
155 | |||
156 | static int dl_unload(DSO *dso) | ||
157 | { | ||
158 | shl_t ptr; | ||
159 | if(dso == NULL) | ||
160 | { | ||
161 | DSOerr(DSO_F_DL_UNLOAD,ERR_R_PASSED_NULL_PARAMETER); | ||
162 | return(0); | ||
163 | } | ||
164 | if(sk_num(dso->meth_data) < 1) | ||
165 | return(1); | ||
166 | /* Is this statement legal? */ | ||
167 | ptr = (shl_t)sk_pop(dso->meth_data); | ||
168 | if(ptr == NULL) | ||
169 | { | ||
170 | DSOerr(DSO_F_DL_UNLOAD,DSO_R_NULL_HANDLE); | ||
171 | /* Should push the value back onto the stack in | ||
172 | * case of a retry. */ | ||
173 | sk_push(dso->meth_data, (char *)ptr); | ||
174 | return(0); | ||
175 | } | ||
176 | shl_unload(ptr); | ||
177 | return(1); | ||
178 | } | ||
179 | |||
180 | static void *dl_bind_var(DSO *dso, const char *symname) | ||
181 | { | ||
182 | shl_t ptr; | ||
183 | void *sym; | ||
184 | |||
185 | if((dso == NULL) || (symname == NULL)) | ||
186 | { | ||
187 | DSOerr(DSO_F_DL_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER); | ||
188 | return(NULL); | ||
189 | } | ||
190 | if(sk_num(dso->meth_data) < 1) | ||
191 | { | ||
192 | DSOerr(DSO_F_DL_BIND_VAR,DSO_R_STACK_ERROR); | ||
193 | return(NULL); | ||
194 | } | ||
195 | ptr = (shl_t)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1); | ||
196 | if(ptr == NULL) | ||
197 | { | ||
198 | DSOerr(DSO_F_DL_BIND_VAR,DSO_R_NULL_HANDLE); | ||
199 | return(NULL); | ||
200 | } | ||
201 | if (shl_findsym(&ptr, symname, TYPE_UNDEFINED, &sym) < 0) | ||
202 | { | ||
203 | DSOerr(DSO_F_DL_BIND_VAR,DSO_R_SYM_FAILURE); | ||
204 | ERR_add_error_data(4, "symname(", symname, "): ", | ||
205 | strerror(errno)); | ||
206 | return(NULL); | ||
207 | } | ||
208 | return(sym); | ||
209 | } | ||
210 | |||
211 | static DSO_FUNC_TYPE dl_bind_func(DSO *dso, const char *symname) | ||
212 | { | ||
213 | shl_t ptr; | ||
214 | void *sym; | ||
215 | |||
216 | if((dso == NULL) || (symname == NULL)) | ||
217 | { | ||
218 | DSOerr(DSO_F_DL_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER); | ||
219 | return(NULL); | ||
220 | } | ||
221 | if(sk_num(dso->meth_data) < 1) | ||
222 | { | ||
223 | DSOerr(DSO_F_DL_BIND_FUNC,DSO_R_STACK_ERROR); | ||
224 | return(NULL); | ||
225 | } | ||
226 | ptr = (shl_t)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1); | ||
227 | if(ptr == NULL) | ||
228 | { | ||
229 | DSOerr(DSO_F_DL_BIND_FUNC,DSO_R_NULL_HANDLE); | ||
230 | return(NULL); | ||
231 | } | ||
232 | if (shl_findsym(&ptr, symname, TYPE_UNDEFINED, &sym) < 0) | ||
233 | { | ||
234 | DSOerr(DSO_F_DL_BIND_FUNC,DSO_R_SYM_FAILURE); | ||
235 | ERR_add_error_data(4, "symname(", symname, "): ", | ||
236 | strerror(errno)); | ||
237 | return(NULL); | ||
238 | } | ||
239 | return((DSO_FUNC_TYPE)sym); | ||
240 | } | ||
241 | |||
242 | /* This function is identical to the one in dso_dlfcn.c, but as it is highly | ||
243 | * unlikely that both the "dl" *and* "dlfcn" variants are being compiled at the | ||
244 | * same time, there's no great duplicating the code. Figuring out an elegant | ||
245 | * way to share one copy of the code would be more difficult and would not | ||
246 | * leave the implementations independant. */ | ||
247 | #if defined(__hpux) | ||
248 | static const char extension[] = ".sl"; | ||
249 | #else | ||
250 | static const char extension[] = ".so"; | ||
251 | #endif | ||
252 | static char *dl_name_converter(DSO *dso, const char *filename) | ||
253 | { | ||
254 | char *translated; | ||
255 | int len, rsize, transform; | ||
256 | |||
257 | len = strlen(filename); | ||
258 | rsize = len + 1; | ||
259 | transform = (strstr(filename, "/") == NULL); | ||
260 | { | ||
261 | /* We will convert this to "%s.s?" or "lib%s.s?" */ | ||
262 | rsize += strlen(extension);/* The length of ".s?" */ | ||
263 | if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0) | ||
264 | rsize += 3; /* The length of "lib" */ | ||
265 | } | ||
266 | translated = OPENSSL_malloc(rsize); | ||
267 | if(translated == NULL) | ||
268 | { | ||
269 | DSOerr(DSO_F_DL_NAME_CONVERTER, | ||
270 | DSO_R_NAME_TRANSLATION_FAILED); | ||
271 | return(NULL); | ||
272 | } | ||
273 | if(transform) | ||
274 | { | ||
275 | if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0) | ||
276 | sprintf(translated, "lib%s%s", filename, extension); | ||
277 | else | ||
278 | sprintf(translated, "%s%s", filename, extension); | ||
279 | } | ||
280 | else | ||
281 | sprintf(translated, "%s", filename); | ||
282 | return(translated); | ||
283 | } | ||
284 | |||
285 | #ifdef OPENSSL_FIPS | ||
286 | static void dl_ref_point(){} | ||
287 | |||
288 | int DSO_pathbyaddr(void *addr,char *path,int sz) | ||
289 | { | ||
290 | struct shl_descriptor inf; | ||
291 | int i,len; | ||
292 | |||
293 | if (addr == NULL) | ||
294 | { | ||
295 | union { void(*f)(); void *p; } t = { dl_ref_point }; | ||
296 | addr = t.p; | ||
297 | } | ||
298 | |||
299 | for (i=-1;shl_get_r(i,&inf)==0;i++) | ||
300 | { | ||
301 | if (((size_t)addr >= inf.tstart && (size_t)addr < inf.tend) || | ||
302 | ((size_t)addr >= inf.dstart && (size_t)addr < inf.dend)) | ||
303 | { | ||
304 | len = (int)strlen(inf.filename); | ||
305 | if (sz <= 0) return len+1; | ||
306 | if (len >= sz) len=sz-1; | ||
307 | memcpy(path,inf.filename,len); | ||
308 | path[len++] = 0; | ||
309 | return len; | ||
310 | } | ||
311 | } | ||
312 | |||
313 | return -1; | ||
314 | } | ||
315 | #endif | ||
316 | |||
317 | #endif /* DSO_DL */ | ||
diff --git a/src/lib/libcrypto/dso/dso_dlfcn.c b/src/lib/libcrypto/dso/dso_dlfcn.c index 1fd10104c5..d48b4202f2 100644 --- a/src/lib/libcrypto/dso/dso_dlfcn.c +++ b/src/lib/libcrypto/dso/dso_dlfcn.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* dso_dlfcn.c -*- mode:C; c-file-style: "eay" -*- */ | 1 | /* dso_dlfcn.c */ |
2 | /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL | 2 | /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -56,6 +56,10 @@ | |||
56 | * | 56 | * |
57 | */ | 57 | */ |
58 | 58 | ||
59 | #ifdef __linux | ||
60 | #define _GNU_SOURCE | ||
61 | #endif | ||
62 | |||
59 | #include <stdio.h> | 63 | #include <stdio.h> |
60 | #include "cryptlib.h" | 64 | #include "cryptlib.h" |
61 | #include <openssl/dso.h> | 65 | #include <openssl/dso.h> |
@@ -85,8 +89,6 @@ static int dlfcn_finish(DSO *dso); | |||
85 | static long dlfcn_ctrl(DSO *dso, int cmd, long larg, void *parg); | 89 | static long dlfcn_ctrl(DSO *dso, int cmd, long larg, void *parg); |
86 | #endif | 90 | #endif |
87 | static char *dlfcn_name_converter(DSO *dso, const char *filename); | 91 | static char *dlfcn_name_converter(DSO *dso, const char *filename); |
88 | static char *dlfcn_merger(DSO *dso, const char *filespec1, | ||
89 | const char *filespec2); | ||
90 | 92 | ||
91 | static DSO_METHOD dso_meth_dlfcn = { | 93 | static DSO_METHOD dso_meth_dlfcn = { |
92 | "OpenSSL 'dlfcn' shared library method", | 94 | "OpenSSL 'dlfcn' shared library method", |
@@ -101,7 +103,6 @@ static DSO_METHOD dso_meth_dlfcn = { | |||
101 | #endif | 103 | #endif |
102 | NULL, /* ctrl */ | 104 | NULL, /* ctrl */ |
103 | dlfcn_name_converter, | 105 | dlfcn_name_converter, |
104 | dlfcn_merger, | ||
105 | NULL, /* init */ | 106 | NULL, /* init */ |
106 | NULL /* finish */ | 107 | NULL /* finish */ |
107 | }; | 108 | }; |
@@ -144,19 +145,13 @@ static int dlfcn_load(DSO *dso) | |||
144 | void *ptr = NULL; | 145 | void *ptr = NULL; |
145 | /* See applicable comments in dso_dl.c */ | 146 | /* See applicable comments in dso_dl.c */ |
146 | char *filename = DSO_convert_filename(dso, NULL); | 147 | char *filename = DSO_convert_filename(dso, NULL); |
147 | int flags = DLOPEN_FLAG; | ||
148 | 148 | ||
149 | if(filename == NULL) | 149 | if(filename == NULL) |
150 | { | 150 | { |
151 | DSOerr(DSO_F_DLFCN_LOAD,DSO_R_NO_FILENAME); | 151 | DSOerr(DSO_F_DLFCN_LOAD,DSO_R_NO_FILENAME); |
152 | goto err; | 152 | goto err; |
153 | } | 153 | } |
154 | 154 | ptr = dlopen(filename, DLOPEN_FLAG); | |
155 | #ifdef RTLD_GLOBAL | ||
156 | if (dso->flags & DSO_FLAG_GLOBAL_SYMBOLS) | ||
157 | flags |= RTLD_GLOBAL; | ||
158 | #endif | ||
159 | ptr = dlopen(filename, flags); | ||
160 | if(ptr == NULL) | 155 | if(ptr == NULL) |
161 | { | 156 | { |
162 | DSOerr(DSO_F_DLFCN_LOAD,DSO_R_LOAD_FAILED); | 157 | DSOerr(DSO_F_DLFCN_LOAD,DSO_R_LOAD_FAILED); |
@@ -255,7 +250,7 @@ static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname) | |||
255 | DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_NULL_HANDLE); | 250 | DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_NULL_HANDLE); |
256 | return(NULL); | 251 | return(NULL); |
257 | } | 252 | } |
258 | *(void **)(tsym) = dlsym(ptr, symname); | 253 | *(void**)(tsym) = dlsym(ptr, symname); |
259 | if(sym == NULL) | 254 | if(sym == NULL) |
260 | { | 255 | { |
261 | DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_SYM_FAILURE); | 256 | DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_SYM_FAILURE); |
@@ -265,73 +260,6 @@ static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname) | |||
265 | return(sym); | 260 | return(sym); |
266 | } | 261 | } |
267 | 262 | ||
268 | static char *dlfcn_merger(DSO *dso, const char *filespec1, | ||
269 | const char *filespec2) | ||
270 | { | ||
271 | char *merged; | ||
272 | |||
273 | if(!filespec1 && !filespec2) | ||
274 | { | ||
275 | DSOerr(DSO_F_DLFCN_MERGER, | ||
276 | ERR_R_PASSED_NULL_PARAMETER); | ||
277 | return(NULL); | ||
278 | } | ||
279 | /* If the first file specification is a rooted path, it rules. | ||
280 | same goes if the second file specification is missing. */ | ||
281 | if (!filespec2 || filespec1[0] == '/') | ||
282 | { | ||
283 | merged = OPENSSL_malloc(strlen(filespec1) + 1); | ||
284 | if(!merged) | ||
285 | { | ||
286 | DSOerr(DSO_F_DLFCN_MERGER, | ||
287 | ERR_R_MALLOC_FAILURE); | ||
288 | return(NULL); | ||
289 | } | ||
290 | strcpy(merged, filespec1); | ||
291 | } | ||
292 | /* If the first file specification is missing, the second one rules. */ | ||
293 | else if (!filespec1) | ||
294 | { | ||
295 | merged = OPENSSL_malloc(strlen(filespec2) + 1); | ||
296 | if(!merged) | ||
297 | { | ||
298 | DSOerr(DSO_F_DLFCN_MERGER, | ||
299 | ERR_R_MALLOC_FAILURE); | ||
300 | return(NULL); | ||
301 | } | ||
302 | strcpy(merged, filespec2); | ||
303 | } | ||
304 | else | ||
305 | /* This part isn't as trivial as it looks. It assumes that | ||
306 | the second file specification really is a directory, and | ||
307 | makes no checks whatsoever. Therefore, the result becomes | ||
308 | the concatenation of filespec2 followed by a slash followed | ||
309 | by filespec1. */ | ||
310 | { | ||
311 | int spec2len, len; | ||
312 | |||
313 | spec2len = (filespec2 ? strlen(filespec2) : 0); | ||
314 | len = spec2len + (filespec1 ? strlen(filespec1) : 0); | ||
315 | |||
316 | if(filespec2 && filespec2[spec2len - 1] == '/') | ||
317 | { | ||
318 | spec2len--; | ||
319 | len--; | ||
320 | } | ||
321 | merged = OPENSSL_malloc(len + 2); | ||
322 | if(!merged) | ||
323 | { | ||
324 | DSOerr(DSO_F_DLFCN_MERGER, | ||
325 | ERR_R_MALLOC_FAILURE); | ||
326 | return(NULL); | ||
327 | } | ||
328 | strcpy(merged, filespec2); | ||
329 | merged[spec2len] = '/'; | ||
330 | strcpy(&merged[spec2len + 1], filespec1); | ||
331 | } | ||
332 | return(merged); | ||
333 | } | ||
334 | |||
335 | static char *dlfcn_name_converter(DSO *dso, const char *filename) | 263 | static char *dlfcn_name_converter(DSO *dso, const char *filename) |
336 | { | 264 | { |
337 | char *translated; | 265 | char *translated; |
@@ -357,13 +285,41 @@ static char *dlfcn_name_converter(DSO *dso, const char *filename) | |||
357 | if(transform) | 285 | if(transform) |
358 | { | 286 | { |
359 | if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0) | 287 | if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0) |
360 | sprintf(translated, "lib%s.so", filename); | 288 | snprintf(translated, rsize, "lib%s.so", filename); |
361 | else | 289 | else |
362 | sprintf(translated, "%s.so", filename); | 290 | snprintf(translated, rsize, "%s.so", filename); |
363 | } | 291 | } |
364 | else | 292 | else |
365 | sprintf(translated, "%s", filename); | 293 | snprintf(translated, rsize, "%s", filename); |
366 | return(translated); | 294 | return(translated); |
367 | } | 295 | } |
368 | 296 | ||
297 | #ifdef OPENSSL_FIPS | ||
298 | static void dlfcn_ref_point(){} | ||
299 | |||
300 | int DSO_pathbyaddr(void *addr,char *path,int sz) | ||
301 | { | ||
302 | Dl_info dli; | ||
303 | int len; | ||
304 | |||
305 | if (addr == NULL) | ||
306 | { | ||
307 | union { void(*f)(void); void *p; } t = { dlfcn_ref_point }; | ||
308 | addr = t.p; | ||
309 | } | ||
310 | |||
311 | if (dladdr(addr,&dli)) | ||
312 | { | ||
313 | len = (int)strlen(dli.dli_fname); | ||
314 | if (sz <= 0) return len+1; | ||
315 | if (len >= sz) len=sz-1; | ||
316 | memcpy(path,dli.dli_fname,len); | ||
317 | path[len++]=0; | ||
318 | return len; | ||
319 | } | ||
320 | |||
321 | ERR_add_error_data(4, "dlfcn_pathbyaddr(): ", dlerror()); | ||
322 | return -1; | ||
323 | } | ||
324 | #endif | ||
369 | #endif /* DSO_DLFCN */ | 325 | #endif /* DSO_DLFCN */ |
diff --git a/src/lib/libcrypto/dso/dso_err.c b/src/lib/libcrypto/dso/dso_err.c index a8b0a210de..581677cc36 100644 --- a/src/lib/libcrypto/dso/dso_err.c +++ b/src/lib/libcrypto/dso/dso_err.c | |||
@@ -73,13 +73,11 @@ static ERR_STRING_DATA DSO_str_functs[]= | |||
73 | {ERR_FUNC(DSO_F_DLFCN_BIND_FUNC), "DLFCN_BIND_FUNC"}, | 73 | {ERR_FUNC(DSO_F_DLFCN_BIND_FUNC), "DLFCN_BIND_FUNC"}, |
74 | {ERR_FUNC(DSO_F_DLFCN_BIND_VAR), "DLFCN_BIND_VAR"}, | 74 | {ERR_FUNC(DSO_F_DLFCN_BIND_VAR), "DLFCN_BIND_VAR"}, |
75 | {ERR_FUNC(DSO_F_DLFCN_LOAD), "DLFCN_LOAD"}, | 75 | {ERR_FUNC(DSO_F_DLFCN_LOAD), "DLFCN_LOAD"}, |
76 | {ERR_FUNC(DSO_F_DLFCN_MERGER), "DLFCN_MERGER"}, | ||
77 | {ERR_FUNC(DSO_F_DLFCN_NAME_CONVERTER), "DLFCN_NAME_CONVERTER"}, | 76 | {ERR_FUNC(DSO_F_DLFCN_NAME_CONVERTER), "DLFCN_NAME_CONVERTER"}, |
78 | {ERR_FUNC(DSO_F_DLFCN_UNLOAD), "DLFCN_UNLOAD"}, | 77 | {ERR_FUNC(DSO_F_DLFCN_UNLOAD), "DLFCN_UNLOAD"}, |
79 | {ERR_FUNC(DSO_F_DL_BIND_FUNC), "DL_BIND_FUNC"}, | 78 | {ERR_FUNC(DSO_F_DL_BIND_FUNC), "DL_BIND_FUNC"}, |
80 | {ERR_FUNC(DSO_F_DL_BIND_VAR), "DL_BIND_VAR"}, | 79 | {ERR_FUNC(DSO_F_DL_BIND_VAR), "DL_BIND_VAR"}, |
81 | {ERR_FUNC(DSO_F_DL_LOAD), "DL_LOAD"}, | 80 | {ERR_FUNC(DSO_F_DL_LOAD), "DL_LOAD"}, |
82 | {ERR_FUNC(DSO_F_DL_MERGER), "DL_MERGER"}, | ||
83 | {ERR_FUNC(DSO_F_DL_NAME_CONVERTER), "DL_NAME_CONVERTER"}, | 81 | {ERR_FUNC(DSO_F_DL_NAME_CONVERTER), "DL_NAME_CONVERTER"}, |
84 | {ERR_FUNC(DSO_F_DL_UNLOAD), "DL_UNLOAD"}, | 82 | {ERR_FUNC(DSO_F_DL_UNLOAD), "DL_UNLOAD"}, |
85 | {ERR_FUNC(DSO_F_DSO_BIND_FUNC), "DSO_bind_func"}, | 83 | {ERR_FUNC(DSO_F_DSO_BIND_FUNC), "DSO_bind_func"}, |
@@ -90,22 +88,17 @@ static ERR_STRING_DATA DSO_str_functs[]= | |||
90 | {ERR_FUNC(DSO_F_DSO_GET_FILENAME), "DSO_get_filename"}, | 88 | {ERR_FUNC(DSO_F_DSO_GET_FILENAME), "DSO_get_filename"}, |
91 | {ERR_FUNC(DSO_F_DSO_GET_LOADED_FILENAME), "DSO_get_loaded_filename"}, | 89 | {ERR_FUNC(DSO_F_DSO_GET_LOADED_FILENAME), "DSO_get_loaded_filename"}, |
92 | {ERR_FUNC(DSO_F_DSO_LOAD), "DSO_load"}, | 90 | {ERR_FUNC(DSO_F_DSO_LOAD), "DSO_load"}, |
93 | {ERR_FUNC(DSO_F_DSO_MERGE), "DSO_merge"}, | ||
94 | {ERR_FUNC(DSO_F_DSO_NEW_METHOD), "DSO_new_method"}, | 91 | {ERR_FUNC(DSO_F_DSO_NEW_METHOD), "DSO_new_method"}, |
95 | {ERR_FUNC(DSO_F_DSO_SET_FILENAME), "DSO_set_filename"}, | 92 | {ERR_FUNC(DSO_F_DSO_SET_FILENAME), "DSO_set_filename"}, |
96 | {ERR_FUNC(DSO_F_DSO_SET_NAME_CONVERTER), "DSO_set_name_converter"}, | 93 | {ERR_FUNC(DSO_F_DSO_SET_NAME_CONVERTER), "DSO_set_name_converter"}, |
97 | {ERR_FUNC(DSO_F_DSO_UP_REF), "DSO_up_ref"}, | 94 | {ERR_FUNC(DSO_F_DSO_UP_REF), "DSO_up_ref"}, |
98 | {ERR_FUNC(DSO_F_VMS_BIND_SYM), "VMS_BIND_SYM"}, | 95 | {ERR_FUNC(DSO_F_VMS_BIND_VAR), "VMS_BIND_VAR"}, |
99 | {ERR_FUNC(DSO_F_VMS_LOAD), "VMS_LOAD"}, | 96 | {ERR_FUNC(DSO_F_VMS_LOAD), "VMS_LOAD"}, |
100 | {ERR_FUNC(DSO_F_VMS_MERGER), "VMS_MERGER"}, | ||
101 | {ERR_FUNC(DSO_F_VMS_UNLOAD), "VMS_UNLOAD"}, | 97 | {ERR_FUNC(DSO_F_VMS_UNLOAD), "VMS_UNLOAD"}, |
102 | {ERR_FUNC(DSO_F_WIN32_BIND_FUNC), "WIN32_BIND_FUNC"}, | 98 | {ERR_FUNC(DSO_F_WIN32_BIND_FUNC), "WIN32_BIND_FUNC"}, |
103 | {ERR_FUNC(DSO_F_WIN32_BIND_VAR), "WIN32_BIND_VAR"}, | 99 | {ERR_FUNC(DSO_F_WIN32_BIND_VAR), "WIN32_BIND_VAR"}, |
104 | {ERR_FUNC(DSO_F_WIN32_JOINER), "WIN32_JOINER"}, | ||
105 | {ERR_FUNC(DSO_F_WIN32_LOAD), "WIN32_LOAD"}, | 100 | {ERR_FUNC(DSO_F_WIN32_LOAD), "WIN32_LOAD"}, |
106 | {ERR_FUNC(DSO_F_WIN32_MERGER), "WIN32_MERGER"}, | ||
107 | {ERR_FUNC(DSO_F_WIN32_NAME_CONVERTER), "WIN32_NAME_CONVERTER"}, | 101 | {ERR_FUNC(DSO_F_WIN32_NAME_CONVERTER), "WIN32_NAME_CONVERTER"}, |
108 | {ERR_FUNC(DSO_F_WIN32_SPLITTER), "WIN32_SPLITTER"}, | ||
109 | {ERR_FUNC(DSO_F_WIN32_UNLOAD), "WIN32_UNLOAD"}, | 102 | {ERR_FUNC(DSO_F_WIN32_UNLOAD), "WIN32_UNLOAD"}, |
110 | {0,NULL} | 103 | {0,NULL} |
111 | }; | 104 | }; |
@@ -114,15 +107,11 @@ static ERR_STRING_DATA DSO_str_reasons[]= | |||
114 | { | 107 | { |
115 | {ERR_REASON(DSO_R_CTRL_FAILED) ,"control command failed"}, | 108 | {ERR_REASON(DSO_R_CTRL_FAILED) ,"control command failed"}, |
116 | {ERR_REASON(DSO_R_DSO_ALREADY_LOADED) ,"dso already loaded"}, | 109 | {ERR_REASON(DSO_R_DSO_ALREADY_LOADED) ,"dso already loaded"}, |
117 | {ERR_REASON(DSO_R_EMPTY_FILE_STRUCTURE) ,"empty file structure"}, | ||
118 | {ERR_REASON(DSO_R_FAILURE) ,"failure"}, | ||
119 | {ERR_REASON(DSO_R_FILENAME_TOO_BIG) ,"filename too big"}, | 110 | {ERR_REASON(DSO_R_FILENAME_TOO_BIG) ,"filename too big"}, |
120 | {ERR_REASON(DSO_R_FINISH_FAILED) ,"cleanup method function failed"}, | 111 | {ERR_REASON(DSO_R_FINISH_FAILED) ,"cleanup method function failed"}, |
121 | {ERR_REASON(DSO_R_INCORRECT_FILE_SYNTAX) ,"incorrect file syntax"}, | ||
122 | {ERR_REASON(DSO_R_LOAD_FAILED) ,"could not load the shared library"}, | 112 | {ERR_REASON(DSO_R_LOAD_FAILED) ,"could not load the shared library"}, |
123 | {ERR_REASON(DSO_R_NAME_TRANSLATION_FAILED),"name translation failed"}, | 113 | {ERR_REASON(DSO_R_NAME_TRANSLATION_FAILED),"name translation failed"}, |
124 | {ERR_REASON(DSO_R_NO_FILENAME) ,"no filename"}, | 114 | {ERR_REASON(DSO_R_NO_FILENAME) ,"no filename"}, |
125 | {ERR_REASON(DSO_R_NO_FILE_SPECIFICATION) ,"no file specification"}, | ||
126 | {ERR_REASON(DSO_R_NULL_HANDLE) ,"a null shared library handle was used"}, | 115 | {ERR_REASON(DSO_R_NULL_HANDLE) ,"a null shared library handle was used"}, |
127 | {ERR_REASON(DSO_R_SET_FILENAME_FAILED) ,"set filename failed"}, | 116 | {ERR_REASON(DSO_R_SET_FILENAME_FAILED) ,"set filename failed"}, |
128 | {ERR_REASON(DSO_R_STACK_ERROR) ,"the meth_data stack is corrupt"}, | 117 | {ERR_REASON(DSO_R_STACK_ERROR) ,"the meth_data stack is corrupt"}, |
@@ -136,12 +125,15 @@ static ERR_STRING_DATA DSO_str_reasons[]= | |||
136 | 125 | ||
137 | void ERR_load_DSO_strings(void) | 126 | void ERR_load_DSO_strings(void) |
138 | { | 127 | { |
139 | #ifndef OPENSSL_NO_ERR | 128 | static int init=1; |
140 | 129 | ||
141 | if (ERR_func_error_string(DSO_str_functs[0].error) == NULL) | 130 | if (init) |
142 | { | 131 | { |
132 | init=0; | ||
133 | #ifndef OPENSSL_NO_ERR | ||
143 | ERR_load_strings(0,DSO_str_functs); | 134 | ERR_load_strings(0,DSO_str_functs); |
144 | ERR_load_strings(0,DSO_str_reasons); | 135 | ERR_load_strings(0,DSO_str_reasons); |
145 | } | ||
146 | #endif | 136 | #endif |
137 | |||
138 | } | ||
147 | } | 139 | } |
diff --git a/src/lib/libcrypto/dso/dso_lib.c b/src/lib/libcrypto/dso/dso_lib.c index 49bdd71309..48d9fdb25e 100644 --- a/src/lib/libcrypto/dso/dso_lib.c +++ b/src/lib/libcrypto/dso/dso_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* dso_lib.c -*- mode:C; c-file-style: "eay" -*- */ | 1 | /* dso_lib.c */ |
2 | /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL | 2 | /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -390,33 +390,6 @@ int DSO_set_filename(DSO *dso, const char *filename) | |||
390 | return(1); | 390 | return(1); |
391 | } | 391 | } |
392 | 392 | ||
393 | char *DSO_merge(DSO *dso, const char *filespec1, const char *filespec2) | ||
394 | { | ||
395 | char *result = NULL; | ||
396 | |||
397 | if(dso == NULL || filespec1 == NULL) | ||
398 | { | ||
399 | DSOerr(DSO_F_DSO_MERGE,ERR_R_PASSED_NULL_PARAMETER); | ||
400 | return(NULL); | ||
401 | } | ||
402 | if(filespec1 == NULL) | ||
403 | filespec1 = dso->filename; | ||
404 | if(filespec1 == NULL) | ||
405 | { | ||
406 | DSOerr(DSO_F_DSO_MERGE,DSO_R_NO_FILE_SPECIFICATION); | ||
407 | return(NULL); | ||
408 | } | ||
409 | if((dso->flags & DSO_FLAG_NO_NAME_TRANSLATION) == 0) | ||
410 | { | ||
411 | if(dso->merger != NULL) | ||
412 | result = dso->merger(dso, filespec1, filespec2); | ||
413 | else if(dso->meth->dso_merger != NULL) | ||
414 | result = dso->meth->dso_merger(dso, | ||
415 | filespec1, filespec2); | ||
416 | } | ||
417 | return(result); | ||
418 | } | ||
419 | |||
420 | char *DSO_convert_filename(DSO *dso, const char *filename) | 393 | char *DSO_convert_filename(DSO *dso, const char *filename) |
421 | { | 394 | { |
422 | char *result = NULL; | 395 | char *result = NULL; |
diff --git a/src/lib/libcrypto/dso/dso_null.c b/src/lib/libcrypto/dso/dso_null.c index 4972984651..fa13a7cb0f 100644 --- a/src/lib/libcrypto/dso/dso_null.c +++ b/src/lib/libcrypto/dso/dso_null.c | |||
@@ -75,8 +75,6 @@ static DSO_METHOD dso_meth_null = { | |||
75 | NULL, /* unbind_func */ | 75 | NULL, /* unbind_func */ |
76 | #endif | 76 | #endif |
77 | NULL, /* ctrl */ | 77 | NULL, /* ctrl */ |
78 | NULL, /* dso_name_converter */ | ||
79 | NULL, /* dso_merger */ | ||
80 | NULL, /* init */ | 78 | NULL, /* init */ |
81 | NULL /* finish */ | 79 | NULL /* finish */ |
82 | }; | 80 | }; |
diff --git a/src/lib/libcrypto/dso/dso_vms.c b/src/lib/libcrypto/dso/dso_vms.c new file mode 100644 index 0000000000..1674619d17 --- /dev/null +++ b/src/lib/libcrypto/dso/dso_vms.c | |||
@@ -0,0 +1,379 @@ | |||
1 | /* dso_vms.c */ | ||
2 | /* Written by Richard Levitte (richard@levitte.org) for the OpenSSL | ||
3 | * project 2000. | ||
4 | */ | ||
5 | /* ==================================================================== | ||
6 | * Copyright (c) 2000 The OpenSSL Project. All rights reserved. | ||
7 | * | ||
8 | * Redistribution and use in source and binary forms, with or without | ||
9 | * modification, are permitted provided that the following conditions | ||
10 | * are met: | ||
11 | * | ||
12 | * 1. Redistributions of source code must retain the above copyright | ||
13 | * notice, this list of conditions and the following disclaimer. | ||
14 | * | ||
15 | * 2. Redistributions in binary form must reproduce the above copyright | ||
16 | * notice, this list of conditions and the following disclaimer in | ||
17 | * the documentation and/or other materials provided with the | ||
18 | * distribution. | ||
19 | * | ||
20 | * 3. All advertising materials mentioning features or use of this | ||
21 | * software must display the following acknowledgment: | ||
22 | * "This product includes software developed by the OpenSSL Project | ||
23 | * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | ||
24 | * | ||
25 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
26 | * endorse or promote products derived from this software without | ||
27 | * prior written permission. For written permission, please contact | ||
28 | * licensing@OpenSSL.org. | ||
29 | * | ||
30 | * 5. Products derived from this software may not be called "OpenSSL" | ||
31 | * nor may "OpenSSL" appear in their names without prior written | ||
32 | * permission of the OpenSSL Project. | ||
33 | * | ||
34 | * 6. Redistributions of any form whatsoever must retain the following | ||
35 | * acknowledgment: | ||
36 | * "This product includes software developed by the OpenSSL Project | ||
37 | * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | ||
38 | * | ||
39 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
40 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
41 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
42 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
43 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
44 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
45 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
46 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
47 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
48 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
49 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
50 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
51 | * ==================================================================== | ||
52 | * | ||
53 | * This product includes cryptographic software written by Eric Young | ||
54 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
55 | * Hudson (tjh@cryptsoft.com). | ||
56 | * | ||
57 | */ | ||
58 | |||
59 | #include <stdio.h> | ||
60 | #include <string.h> | ||
61 | #include <errno.h> | ||
62 | #include "cryptlib.h" | ||
63 | #include <openssl/dso.h> | ||
64 | #ifdef OPENSSL_SYS_VMS | ||
65 | #pragma message disable DOLLARID | ||
66 | #include <lib$routines.h> | ||
67 | #include <stsdef.h> | ||
68 | #include <descrip.h> | ||
69 | #include <starlet.h> | ||
70 | #endif | ||
71 | |||
72 | #ifndef OPENSSL_SYS_VMS | ||
73 | DSO_METHOD *DSO_METHOD_vms(void) | ||
74 | { | ||
75 | return NULL; | ||
76 | } | ||
77 | #else | ||
78 | #pragma message disable DOLLARID | ||
79 | |||
80 | static int vms_load(DSO *dso); | ||
81 | static int vms_unload(DSO *dso); | ||
82 | static void *vms_bind_var(DSO *dso, const char *symname); | ||
83 | static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname); | ||
84 | #if 0 | ||
85 | static int vms_unbind_var(DSO *dso, char *symname, void *symptr); | ||
86 | static int vms_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr); | ||
87 | static int vms_init(DSO *dso); | ||
88 | static int vms_finish(DSO *dso); | ||
89 | static long vms_ctrl(DSO *dso, int cmd, long larg, void *parg); | ||
90 | #endif | ||
91 | static char *vms_name_converter(DSO *dso, const char *filename); | ||
92 | |||
93 | static DSO_METHOD dso_meth_vms = { | ||
94 | "OpenSSL 'VMS' shared library method", | ||
95 | vms_load, | ||
96 | NULL, /* unload */ | ||
97 | vms_bind_var, | ||
98 | vms_bind_func, | ||
99 | /* For now, "unbind" doesn't exist */ | ||
100 | #if 0 | ||
101 | NULL, /* unbind_var */ | ||
102 | NULL, /* unbind_func */ | ||
103 | #endif | ||
104 | NULL, /* ctrl */ | ||
105 | vms_name_converter, | ||
106 | NULL, /* init */ | ||
107 | NULL /* finish */ | ||
108 | }; | ||
109 | |||
110 | /* On VMS, the only "handle" is the file name. LIB$FIND_IMAGE_SYMBOL depends | ||
111 | * on the reference to the file name being the same for all calls regarding | ||
112 | * one shared image, so we'll just store it in an instance of the following | ||
113 | * structure and put a pointer to that instance in the meth_data stack. | ||
114 | */ | ||
115 | typedef struct dso_internal_st | ||
116 | { | ||
117 | /* This should contain the name only, no directory, | ||
118 | * no extension, nothing but a name. */ | ||
119 | struct dsc$descriptor_s filename_dsc; | ||
120 | char filename[FILENAME_MAX+1]; | ||
121 | /* This contains whatever is not in filename, if needed. | ||
122 | * Normally not defined. */ | ||
123 | struct dsc$descriptor_s imagename_dsc; | ||
124 | char imagename[FILENAME_MAX+1]; | ||
125 | } DSO_VMS_INTERNAL; | ||
126 | |||
127 | |||
128 | DSO_METHOD *DSO_METHOD_vms(void) | ||
129 | { | ||
130 | return(&dso_meth_vms); | ||
131 | } | ||
132 | |||
133 | static int vms_load(DSO *dso) | ||
134 | { | ||
135 | void *ptr = NULL; | ||
136 | /* See applicable comments in dso_dl.c */ | ||
137 | char *filename = DSO_convert_filename(dso, NULL); | ||
138 | DSO_VMS_INTERNAL *p; | ||
139 | const char *sp1, *sp2; /* Search result */ | ||
140 | |||
141 | if(filename == NULL) | ||
142 | { | ||
143 | DSOerr(DSO_F_DLFCN_LOAD,DSO_R_NO_FILENAME); | ||
144 | goto err; | ||
145 | } | ||
146 | |||
147 | /* A file specification may look like this: | ||
148 | * | ||
149 | * node::dev:[dir-spec]name.type;ver | ||
150 | * | ||
151 | * or (for compatibility with TOPS-20): | ||
152 | * | ||
153 | * node::dev:<dir-spec>name.type;ver | ||
154 | * | ||
155 | * and the dir-spec uses '.' as separator. Also, a dir-spec | ||
156 | * may consist of several parts, with mixed use of [] and <>: | ||
157 | * | ||
158 | * [dir1.]<dir2> | ||
159 | * | ||
160 | * We need to split the file specification into the name and | ||
161 | * the rest (both before and after the name itself). | ||
162 | */ | ||
163 | /* Start with trying to find the end of a dir-spec, and save the | ||
164 | position of the byte after in sp1 */ | ||
165 | sp1 = strrchr(filename, ']'); | ||
166 | sp2 = strrchr(filename, '>'); | ||
167 | if (sp1 == NULL) sp1 = sp2; | ||
168 | if (sp2 != NULL && sp2 > sp1) sp1 = sp2; | ||
169 | if (sp1 == NULL) sp1 = strrchr(filename, ':'); | ||
170 | if (sp1 == NULL) | ||
171 | sp1 = filename; | ||
172 | else | ||
173 | sp1++; /* The byte after the found character */ | ||
174 | /* Now, let's see if there's a type, and save the position in sp2 */ | ||
175 | sp2 = strchr(sp1, '.'); | ||
176 | /* If we found it, that's where we'll cut. Otherwise, look for a | ||
177 | version number and save the position in sp2 */ | ||
178 | if (sp2 == NULL) sp2 = strchr(sp1, ';'); | ||
179 | /* If there was still nothing to find, set sp2 to point at the end of | ||
180 | the string */ | ||
181 | if (sp2 == NULL) sp2 = sp1 + strlen(sp1); | ||
182 | |||
183 | /* Check that we won't get buffer overflows */ | ||
184 | if (sp2 - sp1 > FILENAME_MAX | ||
185 | || (sp1 - filename) + strlen(sp2) > FILENAME_MAX) | ||
186 | { | ||
187 | DSOerr(DSO_F_VMS_LOAD,DSO_R_FILENAME_TOO_BIG); | ||
188 | goto err; | ||
189 | } | ||
190 | |||
191 | p = (DSO_VMS_INTERNAL *)OPENSSL_malloc(sizeof(DSO_VMS_INTERNAL)); | ||
192 | if(p == NULL) | ||
193 | { | ||
194 | DSOerr(DSO_F_VMS_LOAD,ERR_R_MALLOC_FAILURE); | ||
195 | goto err; | ||
196 | } | ||
197 | |||
198 | strncpy(p->filename, sp1, sp2-sp1); | ||
199 | p->filename[sp2-sp1] = '\0'; | ||
200 | |||
201 | strncpy(p->imagename, filename, sp1-filename); | ||
202 | p->imagename[sp1-filename] = '\0'; | ||
203 | strcat(p->imagename, sp2); | ||
204 | |||
205 | p->filename_dsc.dsc$w_length = strlen(p->filename); | ||
206 | p->filename_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | ||
207 | p->filename_dsc.dsc$b_class = DSC$K_CLASS_S; | ||
208 | p->filename_dsc.dsc$a_pointer = p->filename; | ||
209 | p->imagename_dsc.dsc$w_length = strlen(p->imagename); | ||
210 | p->imagename_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | ||
211 | p->imagename_dsc.dsc$b_class = DSC$K_CLASS_S; | ||
212 | p->imagename_dsc.dsc$a_pointer = p->imagename; | ||
213 | |||
214 | if(!sk_push(dso->meth_data, (char *)p)) | ||
215 | { | ||
216 | DSOerr(DSO_F_VMS_LOAD,DSO_R_STACK_ERROR); | ||
217 | goto err; | ||
218 | } | ||
219 | |||
220 | /* Success (for now, we lie. We actually do not know...) */ | ||
221 | dso->loaded_filename = filename; | ||
222 | return(1); | ||
223 | err: | ||
224 | /* Cleanup! */ | ||
225 | if(p != NULL) | ||
226 | OPENSSL_free(p); | ||
227 | if(filename != NULL) | ||
228 | OPENSSL_free(filename); | ||
229 | return(0); | ||
230 | } | ||
231 | |||
232 | /* Note that this doesn't actually unload the shared image, as there is no | ||
233 | * such thing in VMS. Next time it get loaded again, a new copy will | ||
234 | * actually be loaded. | ||
235 | */ | ||
236 | static int vms_unload(DSO *dso) | ||
237 | { | ||
238 | DSO_VMS_INTERNAL *p; | ||
239 | if(dso == NULL) | ||
240 | { | ||
241 | DSOerr(DSO_F_VMS_UNLOAD,ERR_R_PASSED_NULL_PARAMETER); | ||
242 | return(0); | ||
243 | } | ||
244 | if(sk_num(dso->meth_data) < 1) | ||
245 | return(1); | ||
246 | p = (DSO_VMS_INTERNAL *)sk_pop(dso->meth_data); | ||
247 | if(p == NULL) | ||
248 | { | ||
249 | DSOerr(DSO_F_VMS_UNLOAD,DSO_R_NULL_HANDLE); | ||
250 | return(0); | ||
251 | } | ||
252 | /* Cleanup */ | ||
253 | OPENSSL_free(p); | ||
254 | return(1); | ||
255 | } | ||
256 | |||
257 | /* We must do this in a separate function because of the way the exception | ||
258 | handler works (it makes this function return */ | ||
259 | static int do_find_symbol(DSO_VMS_INTERNAL *ptr, | ||
260 | struct dsc$descriptor_s *symname_dsc, void **sym, | ||
261 | unsigned long flags) | ||
262 | { | ||
263 | /* Make sure that signals are caught and returned instead of | ||
264 | aborting the program. The exception handler gets unestablished | ||
265 | automatically on return from this function. */ | ||
266 | lib$establish(lib$sig_to_ret); | ||
267 | |||
268 | if(ptr->imagename_dsc.dsc$w_length) | ||
269 | return lib$find_image_symbol(&ptr->filename_dsc, | ||
270 | symname_dsc, sym, | ||
271 | &ptr->imagename_dsc, flags); | ||
272 | else | ||
273 | return lib$find_image_symbol(&ptr->filename_dsc, | ||
274 | symname_dsc, sym, | ||
275 | 0, flags); | ||
276 | } | ||
277 | |||
278 | void vms_bind_sym(DSO *dso, const char *symname, void **sym) | ||
279 | { | ||
280 | DSO_VMS_INTERNAL *ptr; | ||
281 | int status; | ||
282 | #if 0 | ||
283 | int flags = (1<<4); /* LIB$M_FIS_MIXEDCASE, but this symbol isn't | ||
284 | defined in VMS older than 7.0 or so */ | ||
285 | #else | ||
286 | int flags = 0; | ||
287 | #endif | ||
288 | struct dsc$descriptor_s symname_dsc; | ||
289 | *sym = NULL; | ||
290 | |||
291 | symname_dsc.dsc$w_length = strlen(symname); | ||
292 | symname_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | ||
293 | symname_dsc.dsc$b_class = DSC$K_CLASS_S; | ||
294 | symname_dsc.dsc$a_pointer = (char *)symname; /* The cast is needed */ | ||
295 | |||
296 | if((dso == NULL) || (symname == NULL)) | ||
297 | { | ||
298 | DSOerr(DSO_F_VMS_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER); | ||
299 | return; | ||
300 | } | ||
301 | if(sk_num(dso->meth_data) < 1) | ||
302 | { | ||
303 | DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_STACK_ERROR); | ||
304 | return; | ||
305 | } | ||
306 | ptr = (DSO_VMS_INTERNAL *)sk_value(dso->meth_data, | ||
307 | sk_num(dso->meth_data) - 1); | ||
308 | if(ptr == NULL) | ||
309 | { | ||
310 | DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_NULL_HANDLE); | ||
311 | return; | ||
312 | } | ||
313 | |||
314 | if(dso->flags & DSO_FLAG_UPCASE_SYMBOL) flags = 0; | ||
315 | |||
316 | status = do_find_symbol(ptr, &symname_dsc, sym, flags); | ||
317 | |||
318 | if(!$VMS_STATUS_SUCCESS(status)) | ||
319 | { | ||
320 | unsigned short length; | ||
321 | char errstring[257]; | ||
322 | struct dsc$descriptor_s errstring_dsc; | ||
323 | |||
324 | errstring_dsc.dsc$w_length = sizeof(errstring); | ||
325 | errstring_dsc.dsc$b_dtype = DSC$K_DTYPE_T; | ||
326 | errstring_dsc.dsc$b_class = DSC$K_CLASS_S; | ||
327 | errstring_dsc.dsc$a_pointer = errstring; | ||
328 | |||
329 | *sym = NULL; | ||
330 | |||
331 | status = sys$getmsg(status, &length, &errstring_dsc, 1, 0); | ||
332 | |||
333 | if (!$VMS_STATUS_SUCCESS(status)) | ||
334 | lib$signal(status); /* This is really bad. Abort! */ | ||
335 | else | ||
336 | { | ||
337 | errstring[length] = '\0'; | ||
338 | |||
339 | DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_SYM_FAILURE); | ||
340 | if (ptr->imagename_dsc.dsc$w_length) | ||
341 | ERR_add_error_data(9, | ||
342 | "Symbol ", symname, | ||
343 | " in ", ptr->filename, | ||
344 | " (", ptr->imagename, ")", | ||
345 | ": ", errstring); | ||
346 | else | ||
347 | ERR_add_error_data(6, | ||
348 | "Symbol ", symname, | ||
349 | " in ", ptr->filename, | ||
350 | ": ", errstring); | ||
351 | } | ||
352 | return; | ||
353 | } | ||
354 | return; | ||
355 | } | ||
356 | |||
357 | static void *vms_bind_var(DSO *dso, const char *symname) | ||
358 | { | ||
359 | void *sym = 0; | ||
360 | vms_bind_sym(dso, symname, &sym); | ||
361 | return sym; | ||
362 | } | ||
363 | |||
364 | static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname) | ||
365 | { | ||
366 | DSO_FUNC_TYPE sym = 0; | ||
367 | vms_bind_sym(dso, symname, (void **)&sym); | ||
368 | return sym; | ||
369 | } | ||
370 | |||
371 | static char *vms_name_converter(DSO *dso, const char *filename) | ||
372 | { | ||
373 | int len = strlen(filename); | ||
374 | char *not_translated = OPENSSL_malloc(len+1); | ||
375 | strcpy(not_translated,filename); | ||
376 | return(not_translated); | ||
377 | } | ||
378 | |||
379 | #endif /* OPENSSL_SYS_VMS */ | ||
diff --git a/src/lib/libcrypto/dso/dso_win32.c b/src/lib/libcrypto/dso/dso_win32.c new file mode 100644 index 0000000000..cc4ac68696 --- /dev/null +++ b/src/lib/libcrypto/dso/dso_win32.c | |||
@@ -0,0 +1,298 @@ | |||
1 | /* dso_win32.c */ | ||
2 | /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL | ||
3 | * project 2000. | ||
4 | */ | ||
5 | /* ==================================================================== | ||
6 | * Copyright (c) 2000 The OpenSSL Project. All rights reserved. | ||
7 | * | ||
8 | * Redistribution and use in source and binary forms, with or without | ||
9 | * modification, are permitted provided that the following conditions | ||
10 | * are met: | ||
11 | * | ||
12 | * 1. Redistributions of source code must retain the above copyright | ||
13 | * notice, this list of conditions and the following disclaimer. | ||
14 | * | ||
15 | * 2. Redistributions in binary form must reproduce the above copyright | ||
16 | * notice, this list of conditions and the following disclaimer in | ||
17 | * the documentation and/or other materials provided with the | ||
18 | * distribution. | ||
19 | * | ||
20 | * 3. All advertising materials mentioning features or use of this | ||
21 | * software must display the following acknowledgment: | ||
22 | * "This product includes software developed by the OpenSSL Project | ||
23 | * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | ||
24 | * | ||
25 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
26 | * endorse or promote products derived from this software without | ||
27 | * prior written permission. For written permission, please contact | ||
28 | * licensing@OpenSSL.org. | ||
29 | * | ||
30 | * 5. Products derived from this software may not be called "OpenSSL" | ||
31 | * nor may "OpenSSL" appear in their names without prior written | ||
32 | * permission of the OpenSSL Project. | ||
33 | * | ||
34 | * 6. Redistributions of any form whatsoever must retain the following | ||
35 | * acknowledgment: | ||
36 | * "This product includes software developed by the OpenSSL Project | ||
37 | * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | ||
38 | * | ||
39 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
40 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
41 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
42 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
43 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
44 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
45 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
46 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
47 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
48 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
49 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
50 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
51 | * ==================================================================== | ||
52 | * | ||
53 | * This product includes cryptographic software written by Eric Young | ||
54 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
55 | * Hudson (tjh@cryptsoft.com). | ||
56 | * | ||
57 | */ | ||
58 | |||
59 | #include <stdio.h> | ||
60 | #include <string.h> | ||
61 | #include "cryptlib.h" | ||
62 | #include <openssl/dso.h> | ||
63 | |||
64 | #if !defined(DSO_WIN32) | ||
65 | DSO_METHOD *DSO_METHOD_win32(void) | ||
66 | { | ||
67 | return NULL; | ||
68 | } | ||
69 | #else | ||
70 | |||
71 | #ifdef _WIN32_WCE | ||
72 | # if _WIN32_WCE < 300 | ||
73 | static FARPROC GetProcAddressA(HMODULE hModule,LPCSTR lpProcName) | ||
74 | { | ||
75 | WCHAR lpProcNameW[64]; | ||
76 | int i; | ||
77 | |||
78 | for (i=0;lpProcName[i] && i<64;i++) | ||
79 | lpProcNameW[i] = (WCHAR)lpProcName[i]; | ||
80 | if (i==64) return NULL; | ||
81 | lpProcNameW[i] = 0; | ||
82 | |||
83 | return GetProcAddressW(hModule,lpProcNameW); | ||
84 | } | ||
85 | # endif | ||
86 | # undef GetProcAddress | ||
87 | # define GetProcAddress GetProcAddressA | ||
88 | #endif | ||
89 | |||
90 | /* Part of the hack in "win32_load" ... */ | ||
91 | #define DSO_MAX_TRANSLATED_SIZE 256 | ||
92 | |||
93 | static int win32_load(DSO *dso); | ||
94 | static int win32_unload(DSO *dso); | ||
95 | static void *win32_bind_var(DSO *dso, const char *symname); | ||
96 | static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname); | ||
97 | #if 0 | ||
98 | static int win32_unbind_var(DSO *dso, char *symname, void *symptr); | ||
99 | static int win32_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr); | ||
100 | static int win32_init(DSO *dso); | ||
101 | static int win32_finish(DSO *dso); | ||
102 | static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg); | ||
103 | #endif | ||
104 | static char *win32_name_converter(DSO *dso, const char *filename); | ||
105 | |||
106 | static DSO_METHOD dso_meth_win32 = { | ||
107 | "OpenSSL 'win32' shared library method", | ||
108 | win32_load, | ||
109 | win32_unload, | ||
110 | win32_bind_var, | ||
111 | win32_bind_func, | ||
112 | /* For now, "unbind" doesn't exist */ | ||
113 | #if 0 | ||
114 | NULL, /* unbind_var */ | ||
115 | NULL, /* unbind_func */ | ||
116 | #endif | ||
117 | NULL, /* ctrl */ | ||
118 | win32_name_converter, | ||
119 | NULL, /* init */ | ||
120 | NULL /* finish */ | ||
121 | }; | ||
122 | |||
123 | DSO_METHOD *DSO_METHOD_win32(void) | ||
124 | { | ||
125 | return(&dso_meth_win32); | ||
126 | } | ||
127 | |||
128 | /* For this DSO_METHOD, our meth_data STACK will contain; | ||
129 | * (i) a pointer to the handle (HINSTANCE) returned from | ||
130 | * LoadLibrary(), and copied. | ||
131 | */ | ||
132 | |||
133 | static int win32_load(DSO *dso) | ||
134 | { | ||
135 | HINSTANCE h = NULL, *p = NULL; | ||
136 | /* See applicable comments from dso_dl.c */ | ||
137 | char *filename = DSO_convert_filename(dso, NULL); | ||
138 | |||
139 | if(filename == NULL) | ||
140 | { | ||
141 | DSOerr(DSO_F_WIN32_LOAD,DSO_R_NO_FILENAME); | ||
142 | goto err; | ||
143 | } | ||
144 | h = LoadLibraryA(filename); | ||
145 | if(h == NULL) | ||
146 | { | ||
147 | DSOerr(DSO_F_WIN32_LOAD,DSO_R_LOAD_FAILED); | ||
148 | ERR_add_error_data(3, "filename(", filename, ")"); | ||
149 | goto err; | ||
150 | } | ||
151 | p = (HINSTANCE *)OPENSSL_malloc(sizeof(HINSTANCE)); | ||
152 | if(p == NULL) | ||
153 | { | ||
154 | DSOerr(DSO_F_WIN32_LOAD,ERR_R_MALLOC_FAILURE); | ||
155 | goto err; | ||
156 | } | ||
157 | *p = h; | ||
158 | if(!sk_push(dso->meth_data, (char *)p)) | ||
159 | { | ||
160 | DSOerr(DSO_F_WIN32_LOAD,DSO_R_STACK_ERROR); | ||
161 | goto err; | ||
162 | } | ||
163 | /* Success */ | ||
164 | dso->loaded_filename = filename; | ||
165 | return(1); | ||
166 | err: | ||
167 | /* Cleanup !*/ | ||
168 | if(filename != NULL) | ||
169 | OPENSSL_free(filename); | ||
170 | if(p != NULL) | ||
171 | OPENSSL_free(p); | ||
172 | if(h != NULL) | ||
173 | FreeLibrary(h); | ||
174 | return(0); | ||
175 | } | ||
176 | |||
177 | static int win32_unload(DSO *dso) | ||
178 | { | ||
179 | HINSTANCE *p; | ||
180 | if(dso == NULL) | ||
181 | { | ||
182 | DSOerr(DSO_F_WIN32_UNLOAD,ERR_R_PASSED_NULL_PARAMETER); | ||
183 | return(0); | ||
184 | } | ||
185 | if(sk_num(dso->meth_data) < 1) | ||
186 | return(1); | ||
187 | p = (HINSTANCE *)sk_pop(dso->meth_data); | ||
188 | if(p == NULL) | ||
189 | { | ||
190 | DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_NULL_HANDLE); | ||
191 | return(0); | ||
192 | } | ||
193 | if(!FreeLibrary(*p)) | ||
194 | { | ||
195 | DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_UNLOAD_FAILED); | ||
196 | /* We should push the value back onto the stack in | ||
197 | * case of a retry. */ | ||
198 | sk_push(dso->meth_data, (char *)p); | ||
199 | return(0); | ||
200 | } | ||
201 | /* Cleanup */ | ||
202 | OPENSSL_free(p); | ||
203 | return(1); | ||
204 | } | ||
205 | |||
206 | /* Using GetProcAddress for variables? TODO: Check this out in | ||
207 | * the Win32 API docs, there's probably a variant for variables. */ | ||
208 | static void *win32_bind_var(DSO *dso, const char *symname) | ||
209 | { | ||
210 | HINSTANCE *ptr; | ||
211 | void *sym; | ||
212 | |||
213 | if((dso == NULL) || (symname == NULL)) | ||
214 | { | ||
215 | DSOerr(DSO_F_WIN32_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER); | ||
216 | return(NULL); | ||
217 | } | ||
218 | if(sk_num(dso->meth_data) < 1) | ||
219 | { | ||
220 | DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_STACK_ERROR); | ||
221 | return(NULL); | ||
222 | } | ||
223 | ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1); | ||
224 | if(ptr == NULL) | ||
225 | { | ||
226 | DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_NULL_HANDLE); | ||
227 | return(NULL); | ||
228 | } | ||
229 | sym = GetProcAddress(*ptr, symname); | ||
230 | if(sym == NULL) | ||
231 | { | ||
232 | DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_SYM_FAILURE); | ||
233 | ERR_add_error_data(3, "symname(", symname, ")"); | ||
234 | return(NULL); | ||
235 | } | ||
236 | return(sym); | ||
237 | } | ||
238 | |||
239 | static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname) | ||
240 | { | ||
241 | HINSTANCE *ptr; | ||
242 | void *sym; | ||
243 | |||
244 | if((dso == NULL) || (symname == NULL)) | ||
245 | { | ||
246 | DSOerr(DSO_F_WIN32_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER); | ||
247 | return(NULL); | ||
248 | } | ||
249 | if(sk_num(dso->meth_data) < 1) | ||
250 | { | ||
251 | DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_STACK_ERROR); | ||
252 | return(NULL); | ||
253 | } | ||
254 | ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1); | ||
255 | if(ptr == NULL) | ||
256 | { | ||
257 | DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_NULL_HANDLE); | ||
258 | return(NULL); | ||
259 | } | ||
260 | sym = GetProcAddress(*ptr, symname); | ||
261 | if(sym == NULL) | ||
262 | { | ||
263 | DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_SYM_FAILURE); | ||
264 | ERR_add_error_data(3, "symname(", symname, ")"); | ||
265 | return(NULL); | ||
266 | } | ||
267 | return((DSO_FUNC_TYPE)sym); | ||
268 | } | ||
269 | |||
270 | static char *win32_name_converter(DSO *dso, const char *filename) | ||
271 | { | ||
272 | char *translated; | ||
273 | int len, transform; | ||
274 | |||
275 | len = strlen(filename); | ||
276 | transform = ((strstr(filename, "/") == NULL) && | ||
277 | (strstr(filename, "\\") == NULL) && | ||
278 | (strstr(filename, ":") == NULL)); | ||
279 | if(transform) | ||
280 | /* We will convert this to "%s.dll" */ | ||
281 | translated = OPENSSL_malloc(len + 5); | ||
282 | else | ||
283 | /* We will simply duplicate filename */ | ||
284 | translated = OPENSSL_malloc(len + 1); | ||
285 | if(translated == NULL) | ||
286 | { | ||
287 | DSOerr(DSO_F_WIN32_NAME_CONVERTER, | ||
288 | DSO_R_NAME_TRANSLATION_FAILED); | ||
289 | return(NULL); | ||
290 | } | ||
291 | if(transform) | ||
292 | sprintf(translated, "%s.dll", filename); | ||
293 | else | ||
294 | sprintf(translated, "%s", filename); | ||
295 | return(translated); | ||
296 | } | ||
297 | |||
298 | #endif /* OPENSSL_SYS_WIN32 */ | ||