summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/dso/dso_win32.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/dso/dso_win32.c')
-rw-r--r--src/lib/libcrypto/dso/dso_win32.c228
1 files changed, 22 insertions, 206 deletions
diff --git a/src/lib/libcrypto/dso/dso_win32.c b/src/lib/libcrypto/dso/dso_win32.c
index 6fb6c54181..fd3dd6a7fe 100644
--- a/src/lib/libcrypto/dso/dso_win32.c
+++ b/src/lib/libcrypto/dso/dso_win32.c
@@ -96,11 +96,7 @@ static HINSTANCE LoadLibraryA(LPCSTR lpLibFileName)
96#else 96#else
97 fnamw = (WCHAR *)alloca (len_0*sizeof(WCHAR)); 97 fnamw = (WCHAR *)alloca (len_0*sizeof(WCHAR));
98#endif 98#endif
99 if (fnamw == NULL) 99 if (fnamw == NULL) return NULL;
100 {
101 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
102 return NULL;
103 }
104 100
105#if defined(_WIN32_WCE) && _WIN32_WCE>=101 101#if defined(_WIN32_WCE) && _WIN32_WCE>=101
106 if (!MultiByteToWideChar(CP_ACP,0,lpLibFileName,len_0,fnamw,len_0)) 102 if (!MultiByteToWideChar(CP_ACP,0,lpLibFileName,len_0,fnamw,len_0))
@@ -128,8 +124,6 @@ static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg);
128static char *win32_name_converter(DSO *dso, const char *filename); 124static char *win32_name_converter(DSO *dso, const char *filename);
129static char *win32_merger(DSO *dso, const char *filespec1, 125static char *win32_merger(DSO *dso, const char *filespec1,
130 const char *filespec2); 126 const char *filespec2);
131static int win32_pathbyaddr(void *addr,char *path,int sz);
132static void *win32_globallookup(const char *name);
133 127
134static const char *openssl_strnchr(const char *string, int c, size_t len); 128static const char *openssl_strnchr(const char *string, int c, size_t len);
135 129
@@ -148,9 +142,7 @@ static DSO_METHOD dso_meth_win32 = {
148 win32_name_converter, 142 win32_name_converter,
149 win32_merger, 143 win32_merger,
150 NULL, /* init */ 144 NULL, /* init */
151 NULL, /* finish */ 145 NULL /* finish */
152 win32_pathbyaddr,
153 win32_globallookup
154 }; 146 };
155 147
156DSO_METHOD *DSO_METHOD_win32(void) 148DSO_METHOD *DSO_METHOD_win32(void)
@@ -188,7 +180,7 @@ static int win32_load(DSO *dso)
188 goto err; 180 goto err;
189 } 181 }
190 *p = h; 182 *p = h;
191 if(!sk_void_push(dso->meth_data, p)) 183 if(!sk_push(dso->meth_data, (char *)p))
192 { 184 {
193 DSOerr(DSO_F_WIN32_LOAD,DSO_R_STACK_ERROR); 185 DSOerr(DSO_F_WIN32_LOAD,DSO_R_STACK_ERROR);
194 goto err; 186 goto err;
@@ -215,9 +207,9 @@ static int win32_unload(DSO *dso)
215 DSOerr(DSO_F_WIN32_UNLOAD,ERR_R_PASSED_NULL_PARAMETER); 207 DSOerr(DSO_F_WIN32_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
216 return(0); 208 return(0);
217 } 209 }
218 if(sk_void_num(dso->meth_data) < 1) 210 if(sk_num(dso->meth_data) < 1)
219 return(1); 211 return(1);
220 p = sk_void_pop(dso->meth_data); 212 p = (HINSTANCE *)sk_pop(dso->meth_data);
221 if(p == NULL) 213 if(p == NULL)
222 { 214 {
223 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_NULL_HANDLE); 215 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_NULL_HANDLE);
@@ -228,7 +220,7 @@ static int win32_unload(DSO *dso)
228 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_UNLOAD_FAILED); 220 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_UNLOAD_FAILED);
229 /* We should push the value back onto the stack in 221 /* We should push the value back onto the stack in
230 * case of a retry. */ 222 * case of a retry. */
231 sk_void_push(dso->meth_data, p); 223 sk_push(dso->meth_data, (char *)p);
232 return(0); 224 return(0);
233 } 225 }
234 /* Cleanup */ 226 /* Cleanup */
@@ -248,12 +240,12 @@ static void *win32_bind_var(DSO *dso, const char *symname)
248 DSOerr(DSO_F_WIN32_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER); 240 DSOerr(DSO_F_WIN32_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
249 return(NULL); 241 return(NULL);
250 } 242 }
251 if(sk_void_num(dso->meth_data) < 1) 243 if(sk_num(dso->meth_data) < 1)
252 { 244 {
253 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_STACK_ERROR); 245 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_STACK_ERROR);
254 return(NULL); 246 return(NULL);
255 } 247 }
256 ptr = sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1); 248 ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
257 if(ptr == NULL) 249 if(ptr == NULL)
258 { 250 {
259 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_NULL_HANDLE); 251 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_NULL_HANDLE);
@@ -279,12 +271,12 @@ static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname)
279 DSOerr(DSO_F_WIN32_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER); 271 DSOerr(DSO_F_WIN32_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER);
280 return(NULL); 272 return(NULL);
281 } 273 }
282 if(sk_void_num(dso->meth_data) < 1) 274 if(sk_num(dso->meth_data) < 1)
283 { 275 {
284 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_STACK_ERROR); 276 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_STACK_ERROR);
285 return(NULL); 277 return(NULL);
286 } 278 }
287 ptr = sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1); 279 ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
288 if(ptr == NULL) 280 if(ptr == NULL)
289 { 281 {
290 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_NULL_HANDLE); 282 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_NULL_HANDLE);
@@ -335,8 +327,8 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
335 memset(result, 0, sizeof(struct file_st)); 327 memset(result, 0, sizeof(struct file_st));
336 position = IN_DEVICE; 328 position = IN_DEVICE;
337 329
338 if((filename[0] == '\\' && filename[1] == '\\') 330 if(filename[0] == '\\' && filename[1] == '\\'
339 || (filename[0] == '/' && filename[1] == '/')) 331 || filename[0] == '/' && filename[1] == '/')
340 { 332 {
341 position = IN_NODE; 333 position = IN_NODE;
342 filename += 2; 334 filename += 2;
@@ -355,11 +347,10 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
355 DSOerr(DSO_F_WIN32_SPLITTER, 347 DSOerr(DSO_F_WIN32_SPLITTER,
356 DSO_R_INCORRECT_FILE_SYNTAX); 348 DSO_R_INCORRECT_FILE_SYNTAX);
357 /*goto err;*/ 349 /*goto err;*/
358 OPENSSL_free(result);
359 return(NULL); 350 return(NULL);
360 } 351 }
361 result->device = start; 352 result->device = start;
362 result->devicelen = (int)(filename - start); 353 result->devicelen = filename - start;
363 position = IN_FILE; 354 position = IN_FILE;
364 start = ++filename; 355 start = ++filename;
365 result->dir = start; 356 result->dir = start;
@@ -368,7 +359,7 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
368 case '/': 359 case '/':
369 if(position == IN_NODE) 360 if(position == IN_NODE)
370 { 361 {
371 result->nodelen = (int)(filename - start); 362 result->nodelen = filename - start;
372 position = IN_FILE; 363 position = IN_FILE;
373 start = ++filename; 364 start = ++filename;
374 result->dir = start; 365 result->dir = start;
@@ -378,20 +369,20 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
378 position = IN_FILE; 369 position = IN_FILE;
379 filename++; 370 filename++;
380 result->dir = start; 371 result->dir = start;
381 result->dirlen = (int)(filename - start); 372 result->dirlen = filename - start;
382 start = filename; 373 start = filename;
383 } 374 }
384 else 375 else
385 { 376 {
386 filename++; 377 filename++;
387 result->dirlen += (int)(filename - start); 378 result->dirlen += filename - start;
388 start = filename; 379 start = filename;
389 } 380 }
390 break; 381 break;
391 case '\0': 382 case '\0':
392 if(position == IN_NODE) 383 if(position == IN_NODE)
393 { 384 {
394 result->nodelen = (int)(filename - start); 385 result->nodelen = filename - start;
395 } 386 }
396 else 387 else
397 { 388 {
@@ -405,13 +396,13 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
405 result->dirlen = 0; 396 result->dirlen = 0;
406 } 397 }
407 result->dirlen += 398 result->dirlen +=
408 (int)(filename - start); 399 filename - start;
409 } 400 }
410 else 401 else
411 { 402 {
412 result->file = start; 403 result->file = start;
413 result->filelen = 404 result->filelen =
414 (int)(filename - start); 405 filename - start;
415 } 406 }
416 } 407 }
417 } 408 }
@@ -505,7 +496,7 @@ static char *win32_joiner(DSO *dso, const struct file_st *file_split)
505 + file_split->predirlen 496 + file_split->predirlen
506 - (start - file_split->predir); 497 - (start - file_split->predir);
507 strncpy(&result[offset], start, 498 strncpy(&result[offset], start,
508 end - start); offset += (int)(end - start); 499 end - start); offset += end - start;
509 result[offset] = '\\'; offset++; 500 result[offset] = '\\'; offset++;
510 start = end + 1; 501 start = end + 1;
511 } 502 }
@@ -526,7 +517,7 @@ static char *win32_joiner(DSO *dso, const struct file_st *file_split)
526 + file_split->dirlen 517 + file_split->dirlen
527 - (start - file_split->dir); 518 - (start - file_split->dir);
528 strncpy(&result[offset], start, 519 strncpy(&result[offset], start,
529 end - start); offset += (int)(end - start); 520 end - start); offset += end - start;
530 result[offset] = '\\'; offset++; 521 result[offset] = '\\'; offset++;
531 start = end + 1; 522 start = end + 1;
532 } 523 }
@@ -622,8 +613,6 @@ static char *win32_merger(DSO *dso, const char *filespec1, const char *filespec2
622 613
623 merged = win32_joiner(dso, filespec1_split); 614 merged = win32_joiner(dso, filespec1_split);
624 } 615 }
625 OPENSSL_free(filespec1_split);
626 OPENSSL_free(filespec2_split);
627 return(merged); 616 return(merged);
628 } 617 }
629 618
@@ -667,178 +656,5 @@ static const char *openssl_strnchr(const char *string, int c, size_t len)
667 return NULL; 656 return NULL;
668 } 657 }
669 658
670#include <tlhelp32.h>
671#ifdef _WIN32_WCE
672# define DLLNAME "TOOLHELP.DLL"
673#else
674# ifdef MODULEENTRY32
675# undef MODULEENTRY32 /* unmask the ASCII version! */
676# endif
677# define DLLNAME "KERNEL32.DLL"
678#endif
679
680typedef HANDLE (WINAPI *CREATETOOLHELP32SNAPSHOT)(DWORD, DWORD);
681typedef BOOL (WINAPI *CLOSETOOLHELP32SNAPSHOT)(HANDLE);
682typedef BOOL (WINAPI *MODULE32)(HANDLE, MODULEENTRY32 *);
683 659
684static int win32_pathbyaddr(void *addr,char *path,int sz) 660#endif /* OPENSSL_SYS_WIN32 */
685 {
686 HMODULE dll;
687 HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
688 MODULEENTRY32 me32;
689 CREATETOOLHELP32SNAPSHOT create_snap;
690 CLOSETOOLHELP32SNAPSHOT close_snap;
691 MODULE32 module_first, module_next;
692 int len;
693
694 if (addr == NULL)
695 {
696 union { int(*f)(void*,char*,int); void *p; } t =
697 { win32_pathbyaddr };
698 addr = t.p;
699 }
700
701 dll = LoadLibrary(TEXT(DLLNAME));
702 if (dll == NULL)
703 {
704 DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_UNSUPPORTED);
705 return -1;
706 }
707
708 create_snap = (CREATETOOLHELP32SNAPSHOT)
709 GetProcAddress(dll,"CreateToolhelp32Snapshot");
710 if (create_snap == NULL)
711 {
712 FreeLibrary(dll);
713 DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_UNSUPPORTED);
714 return -1;
715 }
716 /* We take the rest for granted... */
717#ifdef _WIN32_WCE
718 close_snap = (CLOSETOOLHELP32SNAPSHOT)
719 GetProcAddress(dll,"CloseToolhelp32Snapshot");
720#else
721 close_snap = (CLOSETOOLHELP32SNAPSHOT)CloseHandle;
722#endif
723 module_first = (MODULE32)GetProcAddress(dll,"Module32First");
724 module_next = (MODULE32)GetProcAddress(dll,"Module32Next");
725
726 hModuleSnap = (*create_snap)(TH32CS_SNAPMODULE,0);
727 if( hModuleSnap == INVALID_HANDLE_VALUE )
728 {
729 FreeLibrary(dll);
730 DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_UNSUPPORTED);
731 return -1;
732 }
733
734 me32.dwSize = sizeof(me32);
735
736 if(!(*module_first)(hModuleSnap,&me32))
737 {
738 (*close_snap)(hModuleSnap);
739 FreeLibrary(dll);
740 DSOerr(DSO_F_WIN32_PATHBYADDR,DSO_R_FAILURE);
741 return -1;
742 }
743
744 do {
745 if ((BYTE *)addr >= me32.modBaseAddr &&
746 (BYTE *)addr < me32.modBaseAddr+me32.modBaseSize)
747 {
748 (*close_snap)(hModuleSnap);
749 FreeLibrary(dll);
750#ifdef _WIN32_WCE
751# if _WIN32_WCE >= 101
752 return WideCharToMultiByte(CP_ACP,0,me32.szExePath,-1,
753 path,sz,NULL,NULL);
754# else
755 len = (int)wcslen(me32.szExePath);
756 if (sz <= 0) return len+1;
757 if (len >= sz) len=sz-1;
758 for(i=0;i<len;i++)
759 path[i] = (char)me32.szExePath[i];
760 path[len++] = 0;
761 return len;
762# endif
763#else
764 len = (int)strlen(me32.szExePath);
765 if (sz <= 0) return len+1;
766 if (len >= sz) len=sz-1;
767 memcpy(path,me32.szExePath,len);
768 path[len++] = 0;
769 return len;
770#endif
771 }
772 } while((*module_next)(hModuleSnap, &me32));
773
774 (*close_snap)(hModuleSnap);
775 FreeLibrary(dll);
776 return 0;
777 }
778
779static void *win32_globallookup(const char *name)
780 {
781 HMODULE dll;
782 HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
783 MODULEENTRY32 me32;
784 CREATETOOLHELP32SNAPSHOT create_snap;
785 CLOSETOOLHELP32SNAPSHOT close_snap;
786 MODULE32 module_first, module_next;
787 FARPROC ret=NULL;
788
789 dll = LoadLibrary(TEXT(DLLNAME));
790 if (dll == NULL)
791 {
792 DSOerr(DSO_F_WIN32_GLOBALLOOKUP,DSO_R_UNSUPPORTED);
793 return NULL;
794 }
795
796 create_snap = (CREATETOOLHELP32SNAPSHOT)
797 GetProcAddress(dll,"CreateToolhelp32Snapshot");
798 if (create_snap == NULL)
799 {
800 FreeLibrary(dll);
801 DSOerr(DSO_F_WIN32_GLOBALLOOKUP,DSO_R_UNSUPPORTED);
802 return NULL;
803 }
804 /* We take the rest for granted... */
805#ifdef _WIN32_WCE
806 close_snap = (CLOSETOOLHELP32SNAPSHOT)
807 GetProcAddress(dll,"CloseToolhelp32Snapshot");
808#else
809 close_snap = (CLOSETOOLHELP32SNAPSHOT)CloseHandle;
810#endif
811 module_first = (MODULE32)GetProcAddress(dll,"Module32First");
812 module_next = (MODULE32)GetProcAddress(dll,"Module32Next");
813
814 hModuleSnap = (*create_snap)(TH32CS_SNAPMODULE,0);
815 if( hModuleSnap == INVALID_HANDLE_VALUE )
816 {
817 FreeLibrary(dll);
818 DSOerr(DSO_F_WIN32_GLOBALLOOKUP,DSO_R_UNSUPPORTED);
819 return NULL;
820 }
821
822 me32.dwSize = sizeof(me32);
823
824 if (!(*module_first)(hModuleSnap,&me32))
825 {
826 (*close_snap)(hModuleSnap);
827 FreeLibrary(dll);
828 return NULL;
829 }
830
831 do {
832 if ((ret = GetProcAddress(me32.hModule,name)))
833 {
834 (*close_snap)(hModuleSnap);
835 FreeLibrary(dll);
836 return ret;
837 }
838 } while((*module_next)(hModuleSnap,&me32));
839
840 (*close_snap)(hModuleSnap);
841 FreeLibrary(dll);
842 return NULL;
843 }
844#endif /* DSO_WIN32 */