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, 206 insertions, 22 deletions
diff --git a/src/lib/libcrypto/dso/dso_win32.c b/src/lib/libcrypto/dso/dso_win32.c
index fd3dd6a7fe..6fb6c54181 100644
--- a/src/lib/libcrypto/dso/dso_win32.c
+++ b/src/lib/libcrypto/dso/dso_win32.c
@@ -96,7 +96,11 @@ 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) return NULL; 99 if (fnamw == NULL)
100 {
101 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
102 return NULL;
103 }
100 104
101#if defined(_WIN32_WCE) && _WIN32_WCE>=101 105#if defined(_WIN32_WCE) && _WIN32_WCE>=101
102 if (!MultiByteToWideChar(CP_ACP,0,lpLibFileName,len_0,fnamw,len_0)) 106 if (!MultiByteToWideChar(CP_ACP,0,lpLibFileName,len_0,fnamw,len_0))
@@ -124,6 +128,8 @@ static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg);
124static char *win32_name_converter(DSO *dso, const char *filename); 128static char *win32_name_converter(DSO *dso, const char *filename);
125static char *win32_merger(DSO *dso, const char *filespec1, 129static char *win32_merger(DSO *dso, const char *filespec1,
126 const char *filespec2); 130 const char *filespec2);
131static int win32_pathbyaddr(void *addr,char *path,int sz);
132static void *win32_globallookup(const char *name);
127 133
128static const char *openssl_strnchr(const char *string, int c, size_t len); 134static const char *openssl_strnchr(const char *string, int c, size_t len);
129 135
@@ -142,7 +148,9 @@ static DSO_METHOD dso_meth_win32 = {
142 win32_name_converter, 148 win32_name_converter,
143 win32_merger, 149 win32_merger,
144 NULL, /* init */ 150 NULL, /* init */
145 NULL /* finish */ 151 NULL, /* finish */
152 win32_pathbyaddr,
153 win32_globallookup
146 }; 154 };
147 155
148DSO_METHOD *DSO_METHOD_win32(void) 156DSO_METHOD *DSO_METHOD_win32(void)
@@ -180,7 +188,7 @@ static int win32_load(DSO *dso)
180 goto err; 188 goto err;
181 } 189 }
182 *p = h; 190 *p = h;
183 if(!sk_push(dso->meth_data, (char *)p)) 191 if(!sk_void_push(dso->meth_data, p))
184 { 192 {
185 DSOerr(DSO_F_WIN32_LOAD,DSO_R_STACK_ERROR); 193 DSOerr(DSO_F_WIN32_LOAD,DSO_R_STACK_ERROR);
186 goto err; 194 goto err;
@@ -207,9 +215,9 @@ static int win32_unload(DSO *dso)
207 DSOerr(DSO_F_WIN32_UNLOAD,ERR_R_PASSED_NULL_PARAMETER); 215 DSOerr(DSO_F_WIN32_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
208 return(0); 216 return(0);
209 } 217 }
210 if(sk_num(dso->meth_data) < 1) 218 if(sk_void_num(dso->meth_data) < 1)
211 return(1); 219 return(1);
212 p = (HINSTANCE *)sk_pop(dso->meth_data); 220 p = sk_void_pop(dso->meth_data);
213 if(p == NULL) 221 if(p == NULL)
214 { 222 {
215 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_NULL_HANDLE); 223 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_NULL_HANDLE);
@@ -220,7 +228,7 @@ static int win32_unload(DSO *dso)
220 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_UNLOAD_FAILED); 228 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_UNLOAD_FAILED);
221 /* We should push the value back onto the stack in 229 /* We should push the value back onto the stack in
222 * case of a retry. */ 230 * case of a retry. */
223 sk_push(dso->meth_data, (char *)p); 231 sk_void_push(dso->meth_data, p);
224 return(0); 232 return(0);
225 } 233 }
226 /* Cleanup */ 234 /* Cleanup */
@@ -240,12 +248,12 @@ static void *win32_bind_var(DSO *dso, const char *symname)
240 DSOerr(DSO_F_WIN32_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER); 248 DSOerr(DSO_F_WIN32_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
241 return(NULL); 249 return(NULL);
242 } 250 }
243 if(sk_num(dso->meth_data) < 1) 251 if(sk_void_num(dso->meth_data) < 1)
244 { 252 {
245 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_STACK_ERROR); 253 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_STACK_ERROR);
246 return(NULL); 254 return(NULL);
247 } 255 }
248 ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1); 256 ptr = sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1);
249 if(ptr == NULL) 257 if(ptr == NULL)
250 { 258 {
251 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_NULL_HANDLE); 259 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_NULL_HANDLE);
@@ -271,12 +279,12 @@ static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname)
271 DSOerr(DSO_F_WIN32_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER); 279 DSOerr(DSO_F_WIN32_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER);
272 return(NULL); 280 return(NULL);
273 } 281 }
274 if(sk_num(dso->meth_data) < 1) 282 if(sk_void_num(dso->meth_data) < 1)
275 { 283 {
276 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_STACK_ERROR); 284 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_STACK_ERROR);
277 return(NULL); 285 return(NULL);
278 } 286 }
279 ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1); 287 ptr = sk_void_value(dso->meth_data, sk_void_num(dso->meth_data) - 1);
280 if(ptr == NULL) 288 if(ptr == NULL)
281 { 289 {
282 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_NULL_HANDLE); 290 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_NULL_HANDLE);
@@ -327,8 +335,8 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
327 memset(result, 0, sizeof(struct file_st)); 335 memset(result, 0, sizeof(struct file_st));
328 position = IN_DEVICE; 336 position = IN_DEVICE;
329 337
330 if(filename[0] == '\\' && filename[1] == '\\' 338 if((filename[0] == '\\' && filename[1] == '\\')
331 || filename[0] == '/' && filename[1] == '/') 339 || (filename[0] == '/' && filename[1] == '/'))
332 { 340 {
333 position = IN_NODE; 341 position = IN_NODE;
334 filename += 2; 342 filename += 2;
@@ -347,10 +355,11 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
347 DSOerr(DSO_F_WIN32_SPLITTER, 355 DSOerr(DSO_F_WIN32_SPLITTER,
348 DSO_R_INCORRECT_FILE_SYNTAX); 356 DSO_R_INCORRECT_FILE_SYNTAX);
349 /*goto err;*/ 357 /*goto err;*/
358 OPENSSL_free(result);
350 return(NULL); 359 return(NULL);
351 } 360 }
352 result->device = start; 361 result->device = start;
353 result->devicelen = filename - start; 362 result->devicelen = (int)(filename - start);
354 position = IN_FILE; 363 position = IN_FILE;
355 start = ++filename; 364 start = ++filename;
356 result->dir = start; 365 result->dir = start;
@@ -359,7 +368,7 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
359 case '/': 368 case '/':
360 if(position == IN_NODE) 369 if(position == IN_NODE)
361 { 370 {
362 result->nodelen = filename - start; 371 result->nodelen = (int)(filename - start);
363 position = IN_FILE; 372 position = IN_FILE;
364 start = ++filename; 373 start = ++filename;
365 result->dir = start; 374 result->dir = start;
@@ -369,20 +378,20 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
369 position = IN_FILE; 378 position = IN_FILE;
370 filename++; 379 filename++;
371 result->dir = start; 380 result->dir = start;
372 result->dirlen = filename - start; 381 result->dirlen = (int)(filename - start);
373 start = filename; 382 start = filename;
374 } 383 }
375 else 384 else
376 { 385 {
377 filename++; 386 filename++;
378 result->dirlen += filename - start; 387 result->dirlen += (int)(filename - start);
379 start = filename; 388 start = filename;
380 } 389 }
381 break; 390 break;
382 case '\0': 391 case '\0':
383 if(position == IN_NODE) 392 if(position == IN_NODE)
384 { 393 {
385 result->nodelen = filename - start; 394 result->nodelen = (int)(filename - start);
386 } 395 }
387 else 396 else
388 { 397 {
@@ -396,13 +405,13 @@ static struct file_st *win32_splitter(DSO *dso, const char *filename,
396 result->dirlen = 0; 405 result->dirlen = 0;
397 } 406 }
398 result->dirlen += 407 result->dirlen +=
399 filename - start; 408 (int)(filename - start);
400 } 409 }
401 else 410 else
402 { 411 {
403 result->file = start; 412 result->file = start;
404 result->filelen = 413 result->filelen =
405 filename - start; 414 (int)(filename - start);
406 } 415 }
407 } 416 }
408 } 417 }
@@ -496,7 +505,7 @@ static char *win32_joiner(DSO *dso, const struct file_st *file_split)
496 + file_split->predirlen 505 + file_split->predirlen
497 - (start - file_split->predir); 506 - (start - file_split->predir);
498 strncpy(&result[offset], start, 507 strncpy(&result[offset], start,
499 end - start); offset += end - start; 508 end - start); offset += (int)(end - start);
500 result[offset] = '\\'; offset++; 509 result[offset] = '\\'; offset++;
501 start = end + 1; 510 start = end + 1;
502 } 511 }
@@ -517,7 +526,7 @@ static char *win32_joiner(DSO *dso, const struct file_st *file_split)
517 + file_split->dirlen 526 + file_split->dirlen
518 - (start - file_split->dir); 527 - (start - file_split->dir);
519 strncpy(&result[offset], start, 528 strncpy(&result[offset], start,
520 end - start); offset += end - start; 529 end - start); offset += (int)(end - start);
521 result[offset] = '\\'; offset++; 530 result[offset] = '\\'; offset++;
522 start = end + 1; 531 start = end + 1;
523 } 532 }
@@ -613,6 +622,8 @@ static char *win32_merger(DSO *dso, const char *filespec1, const char *filespec2
613 622
614 merged = win32_joiner(dso, filespec1_split); 623 merged = win32_joiner(dso, filespec1_split);
615 } 624 }
625 OPENSSL_free(filespec1_split);
626 OPENSSL_free(filespec2_split);
616 return(merged); 627 return(merged);
617 } 628 }
618 629
@@ -656,5 +667,178 @@ static const char *openssl_strnchr(const char *string, int c, size_t len)
656 return NULL; 667 return NULL;
657 } 668 }
658 669
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 *);
659 683
660#endif /* OPENSSL_SYS_WIN32 */ 684static int win32_pathbyaddr(void *addr,char *path,int sz)
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 */