summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bio/b_sock.c
diff options
context:
space:
mode:
authortedu <>2014-04-16 19:42:24 +0000
committertedu <>2014-04-16 19:42:24 +0000
commit5fb0ca0ddf59f49b49200128095fb2d4a1577020 (patch)
tree83bea3615bf607b22ec4199424903c29c83f04d4 /src/lib/libcrypto/bio/b_sock.c
parent980353a54aa762841b1a8478c04a6c39759520b3 (diff)
downloadopenbsd-5fb0ca0ddf59f49b49200128095fb2d4a1577020.tar.gz
openbsd-5fb0ca0ddf59f49b49200128095fb2d4a1577020.tar.bz2
openbsd-5fb0ca0ddf59f49b49200128095fb2d4a1577020.zip
> As I walk through the valley of the shadow of death
> I take a look at my life and realize there's nothin' left > Cause I've been blasting and laughing so long, > That even my mama thinks that my mind is gone Remove even more unspeakable evil being perpetuated in the name of VMS. (and lesser evils done in the name of others.) ok miod
Diffstat (limited to 'src/lib/libcrypto/bio/b_sock.c')
-rw-r--r--src/lib/libcrypto/bio/b_sock.c269
1 files changed, 2 insertions, 267 deletions
diff --git a/src/lib/libcrypto/bio/b_sock.c b/src/lib/libcrypto/bio/b_sock.c
index cd62f889ab..3ccebf77f4 100644
--- a/src/lib/libcrypto/bio/b_sock.c
+++ b/src/lib/libcrypto/bio/b_sock.c
@@ -184,14 +184,7 @@ BIO_get_port(const char *str, unsigned short *port_ptr)
184 *port_ptr = (unsigned short)i; 184 *port_ptr = (unsigned short)i;
185 else { 185 else {
186 CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); 186 CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME);
187 /* Note: under VMS with SOCKETSHR, it seems like the first
188 * parameter is 'char *', instead of 'const char *'
189 */
190#ifndef CONST_STRICT
191 s = getservbyname((char *)str, "tcp");
192#else
193 s = getservbyname(str, "tcp"); 187 s = getservbyname(str, "tcp");
194#endif
195 if (s != NULL) 188 if (s != NULL)
196 *port_ptr = ntohs((unsigned short)s->s_port); 189 *port_ptr = ntohs((unsigned short)s->s_port);
197 CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); 190 CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME);
@@ -247,260 +240,24 @@ BIO_sock_error(int sock)
247 return (j); 240 return (j);
248} 241}
249 242
250#if 0 243struct hostent *
251long 244BIO_gethostbyname(const char *name)
252BIO_ghbn_ctrl(int cmd, int iarg, char *parg)
253{
254 int i;
255 char **p;
256
257 switch (cmd) {
258 case BIO_GHBN_CTRL_HITS:
259 return (BIO_ghbn_hits);
260 /* break; */
261 case BIO_GHBN_CTRL_MISSES:
262 return (BIO_ghbn_miss);
263 /* break; */
264 case BIO_GHBN_CTRL_CACHE_SIZE:
265 return (GHBN_NUM);
266 /* break; */
267 case BIO_GHBN_CTRL_GET_ENTRY:
268 if ((iarg >= 0) && (iarg < GHBN_NUM) &&
269 (ghbn_cache[iarg].order > 0)) {
270 p = (char **)parg;
271 if (p == NULL)
272 return (0);
273 *p = ghbn_cache[iarg].name;
274 ghbn_cache[iarg].name[128] = '\0';
275 return (1);
276 }
277 return (0);
278 /* break; */
279 case BIO_GHBN_CTRL_FLUSH:
280 for (i = 0; i < GHBN_NUM; i++)
281 ghbn_cache[i].order = 0;
282 break;
283 default:
284 return (0);
285 }
286 return (1);
287}
288#endif
289
290#if 0
291static struct hostent
292*ghbn_dup(struct hostent *a)
293{ 245{
294 struct hostent *ret;
295 int i, j;
296
297 MemCheck_off();
298 ret = (struct hostent *)OPENSSL_malloc(sizeof(struct hostent));
299 if (ret == NULL)
300 return (NULL);
301 memset(ret, 0, sizeof(struct hostent));
302
303 for (i = 0; a->h_aliases[i] != NULL; i++)
304 ;
305 i++;
306 ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *));
307 if (ret->h_aliases == NULL)
308 goto err;
309 memset(ret->h_aliases, 0, i*sizeof(char *));
310
311 for (i = 0; a->h_addr_list[i] != NULL; i++)
312 ;
313 i++;
314 ret->h_addr_list = (char **)OPENSSL_malloc(i*sizeof(char *));
315 if (ret->h_addr_list == NULL)
316 goto err;
317 memset(ret->h_addr_list, 0, i*sizeof(char *));
318
319 j = strlen(a->h_name) + 1;
320 if ((ret->h_name = OPENSSL_malloc(j)) == NULL)
321 goto err;
322 memcpy((char *)ret->h_name, a->h_name, j);
323 for (i = 0; a->h_aliases[i] != NULL; i++) {
324 j = strlen(a->h_aliases[i]) + 1;
325 if ((ret->h_aliases[i] = OPENSSL_malloc(j)) == NULL)
326 goto err;
327 memcpy(ret->h_aliases[i], a->h_aliases[i], j);
328 }
329 ret->h_length = a->h_length;
330 ret->h_addrtype = a->h_addrtype;
331 for (i = 0; a->h_addr_list[i] != NULL; i++) {
332 if ((ret->h_addr_list[i] = OPENSSL_malloc(a->h_length)) == NULL)
333 goto err;
334 memcpy(ret->h_addr_list[i], a->h_addr_list[i], a->h_length);
335 }
336 if (0) {
337err:
338 if (ret != NULL)
339 ghbn_free(ret);
340 ret = NULL;
341 }
342 MemCheck_on();
343 return (ret);
344}
345
346static void
347ghbn_free(struct hostent *a)
348{
349 int i;
350
351 if (a == NULL)
352 return;
353
354 if (a->h_aliases != NULL) {
355 for (i = 0; a->h_aliases[i] != NULL; i++)
356 OPENSSL_free(a->h_aliases[i]);
357 OPENSSL_free(a->h_aliases);
358 }
359 if (a->h_addr_list != NULL) {
360 for (i = 0; a->h_addr_list[i] != NULL; i++)
361 OPENSSL_free(a->h_addr_list[i]);
362 OPENSSL_free(a->h_addr_list);
363 }
364 if (a->h_name != NULL)
365 OPENSSL_free(a->h_name);
366 OPENSSL_free(a);
367}
368
369#endif
370
371struct hostent
372*BIO_gethostbyname(const char *name)
373{
374#if 1
375 /* Caching gethostbyname() results forever is wrong,
376 * so we have to let the true gethostbyname() worry about this */
377#if (defined(NETWARE_BSDSOCK) && !defined(__NOVELL_LIBC__))
378 return gethostbyname((char*)name);
379#else
380 return gethostbyname(name); 246 return gethostbyname(name);
381#endif
382#else
383 struct hostent *ret;
384 int i, lowi = 0, j;
385 unsigned long low = (unsigned long) - 1;
386
387
388# if 0
389 /* It doesn't make sense to use locking here: The function interface
390 * is not thread-safe, because threads can never be sure when
391 * some other thread destroys the data they were given a pointer to.
392 */
393 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
394# endif
395 j = strlen(name);
396 if (j < 128) {
397 for (i = 0; i < GHBN_NUM; i++) {
398 if (low > ghbn_cache[i].order) {
399 low = ghbn_cache[i].order;
400 lowi = i;
401 }
402 if (ghbn_cache[i].order > 0) {
403 if (strncmp(name, ghbn_cache[i].name, 128) == 0)
404 break;
405 }
406 }
407 } else
408 i = GHBN_NUM;
409
410 if (i == GHBN_NUM) /* no hit*/
411 {
412 BIO_ghbn_miss++;
413 /* Note: under VMS with SOCKETSHR, it seems like the first
414 * parameter is 'char *', instead of 'const char *'
415 */
416# ifndef CONST_STRICT
417 ret = gethostbyname((char *)name);
418# else
419 ret = gethostbyname(name);
420# endif
421
422 if (ret == NULL)
423 goto end;
424 if (j > 128) /* too big to cache */
425 {
426# if 0
427 /* If we were trying to make this function thread-safe (which
428 * is bound to fail), we'd have to give up in this case
429 * (or allocate more memory). */
430 ret = NULL;
431# endif
432 goto end;
433 }
434
435 /* else add to cache */
436 if (ghbn_cache[lowi].ent != NULL)
437 ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */
438 ghbn_cache[lowi].name[0] = '\0';
439
440 if ((ret = ghbn_cache[lowi].ent = ghbn_dup(ret)) == NULL) {
441 BIOerr(BIO_F_BIO_GETHOSTBYNAME, ERR_R_MALLOC_FAILURE);
442 goto end;
443 }
444 strncpy(ghbn_cache[lowi].name, name, 128);
445 ghbn_cache[lowi].order = BIO_ghbn_miss + BIO_ghbn_hits;
446 } else {
447 BIO_ghbn_hits++;
448 ret = ghbn_cache[i].ent;
449 ghbn_cache[i].order = BIO_ghbn_miss + BIO_ghbn_hits;
450 }
451end:
452# if 0
453 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
454# endif
455 return (ret);
456#endif
457} 247}
458 248
459 249
460int 250int
461BIO_sock_init(void) 251BIO_sock_init(void)
462{ 252{
463#ifdef WATT32
464 extern int _watt_do_exit;
465 _watt_do_exit = 0;
466 /* don't make sock_init() call exit() */
467 if (sock_init())
468 return (-1);
469#endif
470
471#if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
472 WORD wVerReq;
473 WSADATA wsaData;
474 int err;
475
476 if (!wsa_init_done) {
477 wsa_init_done = 1;
478 wVerReq = MAKEWORD( 2, 0 );
479 err = WSAStartup(wVerReq, &wsaData);
480 if (err != 0) {
481 SYSerr(SYS_F_WSASTARTUP, err);
482 BIOerr(BIO_F_BIO_SOCK_INIT, BIO_R_WSASTARTUP);
483 return (-1);
484 }
485 }
486#endif
487
488 return (1); 253 return (1);
489} 254}
490 255
491void 256void
492BIO_sock_cleanup(void) 257BIO_sock_cleanup(void)
493{ 258{
494#if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
495 if (wsa_init_done) {
496 wsa_init_done = 0;
497 WSACleanup();
498 }
499#endif
500} 259}
501 260
502#if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000
503
504int 261int
505BIO_socket_ioctl(int fd, long type, void *arg) 262BIO_socket_ioctl(int fd, long type, void *arg)
506{ 263{
@@ -509,28 +266,7 @@ BIO_socket_ioctl(int fd, long type, void *arg)
509#ifdef __DJGPP__ 266#ifdef __DJGPP__
510 i = ioctl(fd, type, (char *)arg); 267 i = ioctl(fd, type, (char *)arg);
511#else 268#else
512# if defined(OPENSSL_SYS_VMS)
513 /* 2011-02-18 SMS.
514 * VMS ioctl() can't tolerate a 64-bit "void *arg", but we
515 * observe that all the consumers pass in an "unsigned long *",
516 * so we arrange a local copy with a short pointer, and use
517 * that, instead.
518 */
519# if __INITIAL_POINTER_SIZE == 64
520# define ARG arg_32p
521# pragma pointer_size save
522# pragma pointer_size 32
523 unsigned long arg_32;
524 unsigned long *arg_32p;
525# pragma pointer_size restore
526 arg_32p = &arg_32;
527 arg_32 = *((unsigned long *) arg);
528# else /* __INITIAL_POINTER_SIZE == 64 */
529# define ARG arg
530# endif /* __INITIAL_POINTER_SIZE == 64 [else] */
531# else /* defined(OPENSSL_SYS_VMS) */
532# define ARG arg 269# define ARG arg
533# endif /* defined(OPENSSL_SYS_VMS) [else] */
534 270
535 i = ioctl(fd, type, ARG); 271 i = ioctl(fd, type, ARG);
536#endif /* __DJGPP__ */ 272#endif /* __DJGPP__ */
@@ -538,7 +274,6 @@ BIO_socket_ioctl(int fd, long type, void *arg)
538 SYSerr(SYS_F_IOCTLSOCKET, errno); 274 SYSerr(SYS_F_IOCTLSOCKET, errno);
539 return (i); 275 return (i);
540} 276}
541#endif /* __VMS_VER */
542 277
543/* The reason I have implemented this instead of using sscanf is because 278/* The reason I have implemented this instead of using sscanf is because
544 * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ 279 * Visual C 1.52c gives an unresolved external when linking a DLL :-( */