Michal Trojnara wrote:
Please try: ftp://stunnel.mirt.net/stunnel/stunnel-4.15b1.tar.gz
The changes to common.h and sthreads.c with respect to new_context and makecontext are reasonable. However, there are two problems:
1. Line 92 of sthreads.c, (char *)ctx->ctx.uc_stack.ss_sp+=STACK_SIZE-8; causes a compiler warning: "a cast does not yield an lvalue."
2. The Solaris <9 SPARC peculiarity concerning the third argument of makecontext might be taken into account.
Both would be fixed by the following changes. ***Caveat: I do not know how the third argument of makecontext behaves in Solaris x86 for versions <9 vs. >=9. Have no machine to test this.
*** sthreads.c.15b1 Wed Nov 9 12:18:18 2005 --- sthreads.c Wed Nov 9 14:56:18 2005 *************** *** 78,85 **** return NULL; } ctx->ctx.uc_link=NULL; /* it should never happen */ ! ctx->ctx.uc_stack.ss_sp=ctx->stack; ! #if defined(__sgi) || (defined(CPU_SPARC) && ( \ defined(OS_SOLARIS2_0) || \ defined(OS_SOLARIS2_1) || \ defined(OS_SOLARIS2_2) || \ --- 78,84 ---- return NULL; } ctx->ctx.uc_link=NULL; /* it should never happen */ ! #if defined(CPU_SPARC) && ( \ defined(OS_SOLARIS2_0) || \ defined(OS_SOLARIS2_1) || \ defined(OS_SOLARIS2_2) || \ *************** *** 88,96 **** defined(OS_SOLARIS2_5) || \ defined(OS_SOLARIS2_6) || \ defined(OS_SOLARIS2_7) || \ ! defined(OS_SOLARIS2_8))) ! (char *)ctx->ctx.uc_stack.ss_sp+=STACK_SIZE-8; #endif ctx->ctx.uc_stack.ss_size=STACK_SIZE; ctx->ctx.uc_stack.ss_flags=0;
--- 87,101 ---- defined(OS_SOLARIS2_5) || \ defined(OS_SOLARIS2_6) || \ defined(OS_SOLARIS2_7) || \ ! defined(OS_SOLARIS2_8)) ! #define MCtxA 2 ! #else ! #define MCtxA 1 #endif + #if defined(__sgi) || (MCtxA == 2) + ctx->stack+=STACK_SIZE-8; + #endif + ctx->ctx.uc_stack.ss_sp=ctx->stack; ctx->ctx.uc_stack.ss_size=STACK_SIZE; ctx->ctx.uc_stack.ss_flags=0;
*************** *** 121,127 **** if(!ctx) return -1; s_log(LOG_DEBUG, "Context %ld created", ctx->id); ! makecontext(&ctx->ctx, (void(*)(void))cli, 1, arg); return 0; }
--- 126,132 ---- if(!ctx) return -1; s_log(LOG_DEBUG, "Context %ld created", ctx->id); ! makecontext(&ctx->ctx, (void(*)(void))cli, MCtxA, arg); return 0; }