summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/dso
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/dso')
-rw-r--r--src/lib/libcrypto/dso/Makefile142
-rw-r--r--src/lib/libcrypto/dso/Makefile.ssl142
-rw-r--r--src/lib/libcrypto/dso/README22
-rw-r--r--src/lib/libcrypto/dso/dso.h52
-rw-r--r--src/lib/libcrypto/dso/dso_dl.c317
-rw-r--r--src/lib/libcrypto/dso/dso_dlfcn.c120
-rw-r--r--src/lib/libcrypto/dso/dso_err.c22
-rw-r--r--src/lib/libcrypto/dso/dso_lib.c29
-rw-r--r--src/lib/libcrypto/dso/dso_null.c2
-rw-r--r--src/lib/libcrypto/dso/dso_vms.c379
-rw-r--r--src/lib/libcrypto/dso/dso_win32.c298
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
5DIR= dso
6TOP= ../..
7CC= cc
8INCLUDES= -I.. -I$(TOP) -I../../include
9CFLAG=-g
10MAKEFILE= Makefile
11AR= ar r
12
13CFLAGS= $(INCLUDES) $(CFLAG)
14
15GENERAL=Makefile
16TEST=
17APPS=
18
19LIB=$(TOP)/libcrypto.a
20LIBSRC= 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
22LIBOBJ= 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
25SRC= $(LIBSRC)
26
27EXHEADER= dso.h
28HEADER= $(EXHEADER)
29
30ALL= $(GENERAL) $(SRC) $(HEADER)
31
32top:
33 (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
34
35all: lib
36
37lib: $(LIBOBJ)
38 $(AR) $(LIB) $(LIBOBJ)
39 $(RANLIB) $(LIB) || echo Never mind.
40 @touch lib
41
42files:
43 $(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO
44
45links:
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
50install:
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
58tags:
59 ctags $(SRC)
60
61tests:
62
63lint:
64 lint -DLINT $(INCLUDES) $(SRC)>fluff
65
66depend:
67 @[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...
68 $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC)
69
70dclean:
71 $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
72 mv -f Makefile.new $(MAKEFILE)
73
74clean:
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
79dso_dl.o: ../../e_os.h ../../include/openssl/bio.h
80dso_dl.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
81dso_dl.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
82dso_dl.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
83dso_dl.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
84dso_dl.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h
85dso_dl.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
86dso_dl.o: ../cryptlib.h dso_dl.c
87dso_dlfcn.o: ../../e_os.h ../../include/openssl/bio.h
88dso_dlfcn.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
89dso_dlfcn.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
90dso_dlfcn.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
91dso_dlfcn.o: ../../include/openssl/opensslconf.h
92dso_dlfcn.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
93dso_dlfcn.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
94dso_dlfcn.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_dlfcn.c
95dso_err.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h
96dso_err.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
97dso_err.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
98dso_err.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
99dso_err.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h
100dso_err.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
101dso_err.o: dso_err.c
102dso_lib.o: ../../e_os.h ../../include/openssl/bio.h
103dso_lib.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
104dso_lib.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
105dso_lib.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
106dso_lib.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
107dso_lib.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h
108dso_lib.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
109dso_lib.o: ../cryptlib.h dso_lib.c
110dso_null.o: ../../e_os.h ../../include/openssl/bio.h
111dso_null.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
112dso_null.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
113dso_null.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
114dso_null.o: ../../include/openssl/opensslconf.h
115dso_null.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
116dso_null.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
117dso_null.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_null.c
118dso_openssl.o: ../../e_os.h ../../include/openssl/bio.h
119dso_openssl.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
120dso_openssl.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
121dso_openssl.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
122dso_openssl.o: ../../include/openssl/opensslconf.h
123dso_openssl.o: ../../include/openssl/opensslv.h
124dso_openssl.o: ../../include/openssl/ossl_typ.h
125dso_openssl.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
126dso_openssl.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_openssl.c
127dso_vms.o: ../../e_os.h ../../include/openssl/bio.h
128dso_vms.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
129dso_vms.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
130dso_vms.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
131dso_vms.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
132dso_vms.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h
133dso_vms.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
134dso_vms.o: ../cryptlib.h dso_vms.c
135dso_win32.o: ../../e_os.h ../../include/openssl/bio.h
136dso_win32.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
137dso_win32.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
138dso_win32.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
139dso_win32.o: ../../include/openssl/opensslconf.h
140dso_win32.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
141dso_win32.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
142dso_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
5DIR= dso
6TOP= ../..
7CC= cc
8INCLUDES= -I.. -I$(TOP) -I../../include
9CFLAG=-g
10INSTALL_PREFIX=
11OPENSSLDIR= /usr/local/ssl
12INSTALLTOP=/usr/local/ssl
13MAKE= make -f Makefile.ssl
14MAKEDEPPROG= makedepend
15MAKEDEPEND= $(TOP)/util/domd $(TOP) -MD $(MAKEDEPPROG)
16MAKEFILE= Makefile.ssl
17AR= ar r
18
19CFLAGS= $(INCLUDES) $(CFLAG)
20
21GENERAL=Makefile
22TEST=
23APPS=
24
25LIB=$(TOP)/libcrypto.a
26LIBSRC= 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
28LIBOBJ= 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
31SRC= $(LIBSRC)
32
33EXHEADER= dso.h
34HEADER= $(EXHEADER)
35
36ALL= $(GENERAL) $(SRC) $(HEADER)
37
38top:
39 (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
40
41all: lib
42
43lib: $(LIBOBJ)
44 $(AR) $(LIB) $(LIBOBJ)
45 $(RANLIB) $(LIB) || echo Never mind.
46 @touch lib
47
48files:
49 $(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
50
51links:
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
57install:
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
64tags:
65 ctags $(SRC)
66
67tests:
68
69lint:
70 lint -DLINT $(INCLUDES) $(SRC)>fluff
71
72depend:
73 $(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC)
74
75dclean:
76 $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
77 mv -f Makefile.new $(MAKEFILE)
78
79clean:
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
84dso_dl.o: ../../e_os.h ../../include/openssl/bio.h
85dso_dl.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
86dso_dl.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
87dso_dl.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
88dso_dl.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
89dso_dl.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
90dso_dl.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_dl.c
91dso_dlfcn.o: ../../e_os.h ../../include/openssl/bio.h
92dso_dlfcn.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
93dso_dlfcn.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
94dso_dlfcn.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
95dso_dlfcn.o: ../../include/openssl/opensslconf.h
96dso_dlfcn.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
97dso_dlfcn.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
98dso_dlfcn.o: ../cryptlib.h dso_dlfcn.c
99dso_err.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h
100dso_err.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
101dso_err.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
102dso_err.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
103dso_err.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
104dso_err.o: ../../include/openssl/symhacks.h dso_err.c
105dso_lib.o: ../../e_os.h ../../include/openssl/bio.h
106dso_lib.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
107dso_lib.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
108dso_lib.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
109dso_lib.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
110dso_lib.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
111dso_lib.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_lib.c
112dso_null.o: ../../e_os.h ../../include/openssl/bio.h
113dso_null.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
114dso_null.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
115dso_null.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
116dso_null.o: ../../include/openssl/opensslconf.h
117dso_null.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
118dso_null.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
119dso_null.o: ../cryptlib.h dso_null.c
120dso_openssl.o: ../../e_os.h ../../include/openssl/bio.h
121dso_openssl.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
122dso_openssl.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
123dso_openssl.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
124dso_openssl.o: ../../include/openssl/opensslconf.h
125dso_openssl.o: ../../include/openssl/opensslv.h
126dso_openssl.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
127dso_openssl.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_openssl.c
128dso_vms.o: ../../e_os.h ../../include/openssl/bio.h
129dso_vms.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
130dso_vms.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
131dso_vms.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
132dso_vms.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
133dso_vms.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
134dso_vms.o: ../../include/openssl/symhacks.h ../cryptlib.h dso_vms.c
135dso_win32.o: ../../e_os.h ../../include/openssl/bio.h
136dso_win32.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
137dso_win32.o: ../../include/openssl/dso.h ../../include/openssl/e_os2.h
138dso_win32.o: ../../include/openssl/err.h ../../include/openssl/lhash.h
139dso_win32.o: ../../include/openssl/opensslconf.h
140dso_win32.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
141dso_win32.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
142dso_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 @@
1NOTES
2-----
3
4I've checked out HPUX (well, version 11 at least) and shl_t is
5a pointer type so it's safe to use in the way it has been in
6dso_dl.c. On the other hand, HPUX11 support dlfcn too and
7according to their man page, prefer developers to move to that.
8I'll leave Richard's changes there as I guess dso_dl is needed
9for HPUX10.20.
10
11There 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
106typedef void (*DSO_FUNC_TYPE)(void); 99typedef 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. */
116typedef char* (*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *); 109typedef 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. */
132typedef char* (*DSO_MERGER_FUNC)(DSO *, const char *, const char *);
133 110
134typedef struct dso_meth_st 111typedef 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. */
241char *DSO_convert_filename(DSO *dso, const char *filename); 211char *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. */
246char *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
64DSO_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
75static int dl_load(DSO *dso);
76static int dl_unload(DSO *dso);
77static void *dl_bind_var(DSO *dso, const char *symname);
78static DSO_FUNC_TYPE dl_bind_func(DSO *dso, const char *symname);
79#if 0
80static int dl_unbind_var(DSO *dso, char *symname, void *symptr);
81static int dl_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
82static int dl_init(DSO *dso);
83static int dl_finish(DSO *dso);
84static int dl_ctrl(DSO *dso, int cmd, long larg, void *parg);
85#endif
86static char *dl_name_converter(DSO *dso, const char *filename);
87
88static 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
105DSO_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
116static 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);
147err:
148 /* Cleanup! */
149 if(filename != NULL)
150 OPENSSL_free(filename);
151 if(ptr != NULL)
152 shl_unload(ptr);
153 return(0);
154 }
155
156static 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
180static 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
211static 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)
248static const char extension[] = ".sl";
249#else
250static const char extension[] = ".so";
251#endif
252static 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
286static void dl_ref_point(){}
287
288int 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);
85static long dlfcn_ctrl(DSO *dso, int cmd, long larg, void *parg); 89static long dlfcn_ctrl(DSO *dso, int cmd, long larg, void *parg);
86#endif 90#endif
87static char *dlfcn_name_converter(DSO *dso, const char *filename); 91static char *dlfcn_name_converter(DSO *dso, const char *filename);
88static char *dlfcn_merger(DSO *dso, const char *filespec1,
89 const char *filespec2);
90 92
91static DSO_METHOD dso_meth_dlfcn = { 93static 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
268static 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
335static char *dlfcn_name_converter(DSO *dso, const char *filename) 263static 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
298static void dlfcn_ref_point(){}
299
300int 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
137void ERR_load_DSO_strings(void) 126void 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
393char *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
420char *DSO_convert_filename(DSO *dso, const char *filename) 393char *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
73DSO_METHOD *DSO_METHOD_vms(void)
74 {
75 return NULL;
76 }
77#else
78#pragma message disable DOLLARID
79
80static int vms_load(DSO *dso);
81static int vms_unload(DSO *dso);
82static void *vms_bind_var(DSO *dso, const char *symname);
83static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname);
84#if 0
85static int vms_unbind_var(DSO *dso, char *symname, void *symptr);
86static int vms_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
87static int vms_init(DSO *dso);
88static int vms_finish(DSO *dso);
89static long vms_ctrl(DSO *dso, int cmd, long larg, void *parg);
90#endif
91static char *vms_name_converter(DSO *dso, const char *filename);
92
93static 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 */
115typedef 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
128DSO_METHOD *DSO_METHOD_vms(void)
129 {
130 return(&dso_meth_vms);
131 }
132
133static 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);
223err:
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 */
236static 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 */
259static 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
278void 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
357static 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
364static 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
371static 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)
65DSO_METHOD *DSO_METHOD_win32(void)
66 {
67 return NULL;
68 }
69#else
70
71#ifdef _WIN32_WCE
72# if _WIN32_WCE < 300
73static 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
93static int win32_load(DSO *dso);
94static int win32_unload(DSO *dso);
95static void *win32_bind_var(DSO *dso, const char *symname);
96static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname);
97#if 0
98static int win32_unbind_var(DSO *dso, char *symname, void *symptr);
99static int win32_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
100static int win32_init(DSO *dso);
101static int win32_finish(DSO *dso);
102static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg);
103#endif
104static char *win32_name_converter(DSO *dso, const char *filename);
105
106static 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
123DSO_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
133static 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);
166err:
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
177static 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. */
208static 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
239static 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
270static 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 */