The previous patch wasn't thread-safe for one function and also wasn't written for the XPI version of strerror_r() and would therefore display "(null)" in some of the errors. The attached patch fixes these bugs.
Sorry for the previous patch being crap.
diff -ru libcsoap-1.1.0.old/libcsoap/soap-ctx.c libcsoap-1.1.0.new/libcsoap/soap-ctx.c --- libcsoap-1.1.0.old/libcsoap/soap-ctx.c 2009-06-16 10:06:16.000000000 +1000 +++ libcsoap-1.1.0.new/libcsoap/soap-ctx.c 2009-06-16 12:02:51.000000000 +1000 @@ -48,7 +48,7 @@ if (!(ctx = (SoapCtx *) malloc(sizeof(SoapCtx)))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return NULL; } diff -ru libcsoap-1.1.0.old/libcsoap/soap-env.c libcsoap-1.1.0.new/libcsoap/soap-env.c --- libcsoap-1.1.0.old/libcsoap/soap-env.c 2006-07-10 02:24:19.000000000 +1000 +++ libcsoap-1.1.0.new/libcsoap/soap-env.c 2009-06-16 12:02:51.000000000 +1000 @@ -181,7 +181,7 @@ if (!(env = (SoapEnv *) malloc(sizeof(SoapEnv)))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return herror_new("soap_env_from_doc", GENERAL_INVALID_PARAM, "malloc failed"); } diff -ru libcsoap-1.1.0.old/libcsoap/soap-router.c libcsoap-1.1.0.new/libcsoap/soap-router.c --- libcsoap-1.1.0.old/libcsoap/soap-router.c 2006-07-10 02:24:19.000000000 +1000 +++ libcsoap-1.1.0.new/libcsoap/soap-router.c 2009-06-16 12:02:51.000000000 +1000 @@ -44,7 +44,7 @@ if (!(router = (SoapRouter *) malloc(sizeof(SoapRouter)))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return NULL; } memset(router, 0, sizeof(SoapRouter)); diff -ru libcsoap-1.1.0.old/libcsoap/soap-server.c libcsoap-1.1.0.new/libcsoap/soap-server.c --- libcsoap-1.1.0.old/libcsoap/soap-server.c 2006-07-10 02:24:19.000000000 +1000 +++ libcsoap-1.1.0.new/libcsoap/soap-server.c 2009-06-16 12:02:51.000000000 +1000 @@ -211,7 +211,7 @@ if (!(node = (SoapRouterNode *) malloc(sizeof(SoapRouterNode)))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return NULL; } diff -ru libcsoap-1.1.0.old/nanohttp/nanohttp-request.c libcsoap-1.1.0.new/nanohttp/nanohttp-request.c --- libcsoap-1.1.0.old/nanohttp/nanohttp-request.c 2009-06-16 10:06:16.000000000 +1000 +++ libcsoap-1.1.0.new/nanohttp/nanohttp-request.c 2009-06-16 12:02:51.000000000 +1000 @@ -52,7 +52,7 @@ if (!(req = (hrequest_t *) malloc(sizeof(hrequest_t)))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return NULL; } @@ -175,7 +175,7 @@ { if (!(tmppair = (hpair_t *) malloc(sizeof(hpair_t)))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return NULL; } diff -ru libcsoap-1.1.0.old/nanohttp/nanohttp-response.c libcsoap-1.1.0.new/nanohttp/nanohttp-response.c --- libcsoap-1.1.0.old/nanohttp/nanohttp-response.c 2006-07-10 02:24:19.000000000 +1000 +++ libcsoap-1.1.0.new/nanohttp/nanohttp-response.c 2009-06-16 12:02:51.000000000 +1000 @@ -53,7 +53,7 @@ /* create response object */ if (!(res = (hresponse_t *) malloc(sizeof(hresponse_t)))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return NULL; } diff -ru libcsoap-1.1.0.old/nanohttp/nanohttp-server.c libcsoap-1.1.0.new/nanohttp/nanohttp-server.c --- libcsoap-1.1.0.old/nanohttp/nanohttp-server.c 2006-07-10 02:24:19.000000000 +1000 +++ libcsoap-1.1.0.new/nanohttp/nanohttp-server.c 2009-06-16 12:02:51.000000000 +1000 @@ -249,7 +249,7 @@ if (!(service = (hservice_t *) malloc(sizeof(hservice_t)))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return -1; } @@ -516,8 +516,7 @@ if (!(conn = (httpd_conn_t *) malloc(sizeof(httpd_conn_t)))) { - - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return NULL; } conn->sock = sock; @@ -576,7 +575,7 @@ if (!(tmp = (char *) calloc(1, len))) { - log_error2("calloc failed (%s)", strerror(errno)); + log_error1("calloc failed"); return -1; } @@ -968,7 +967,11 @@ pthread_sigmask(SIG_BLOCK, &thrsigset, NULL); if ((err = pthread_create(&(conn->tid), &(conn->attr), httpd_session_main, conn))) - log_error2("pthread_create failed (%s)", strerror(err)); + { + char err_buf[256]; + strerror_r(errno, err_buf, sizeof(err_buf)); + log_error2("pthread_create failed (%s)", err_buf); + } #endif return; @@ -1158,7 +1161,7 @@ if (!(postdata = (char *) malloc(1))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return NULL; } postdata[0] = '\0'; @@ -1166,7 +1169,7 @@ } if (!(postdata = (unsigned char *) malloc(content_length + 1))) { - log_error2("malloc failed (%)", strerror(errno)); + log_error1("malloc failed"); return NULL; } if (http_input_stream_read(req->in, postdata, (int) content_length) > 0) diff -ru libcsoap-1.1.0.old/nanohttp/nanohttp-socket.c libcsoap-1.1.0.new/nanohttp/nanohttp-socket.c --- libcsoap-1.1.0.old/nanohttp/nanohttp-socket.c 2009-06-16 10:06:16.000000000 +1000 +++ libcsoap-1.1.0.new/nanohttp/nanohttp-socket.c 2009-06-16 12:02:51.000000000 +1000 @@ -186,10 +186,14 @@ int h_errnop; #endif struct in_addr **h_addr_list; + char err_buf[256]; if ((dsock->sock = socket(AF_INET, SOCK_STREAM, 0)) <= 0) + { + strerror_r(errno, err_buf, sizeof(err_buf)); return herror_new("hsocket_open", HSOCKET_ERROR_CREATE, - "Socket error (%s)", strerror(errno)); + "Socket error (%s)", err_buf); + } /* Get host data */ #ifdef HAVE_GETHOSTBYNAME_R @@ -198,8 +202,11 @@ host = gethostbyname(hostname); #endif if(!host) + { + strerror_r(errno, err_buf, sizeof(err_buf)); return herror_new("hsocket_open", HSOCKET_ERROR_GET_HOSTNAME, - "Socket error (%s)", strerror(errno)); + "Socket error (%s)", err_buf); + } h_addr_list = (struct in_addr **)host->h_addr_list; address.sin_addr.s_addr = h_addr_list[0]->s_addr; @@ -215,8 +222,11 @@ || connect(dsock->sock, (struct sockaddr *) &address, sizeof(address)) != 0) { if(errno != EINPROGRESS) + { + strerror_r(errno, err_buf, sizeof(err_buf)); return herror_new("hsocket_open", HSOCKET_ERROR_CONNECT, - "Socket error (%s)", strerror(errno)); + "Socket error (%s)", err_buf); + } } FD_ZERO(&fds); @@ -252,13 +262,15 @@ hsocket_t sock; struct sockaddr_in addr; int opt = 1; + char err_buf[256]; /* create socket */ if ((sock.sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { - log_error2("Cannot create socket (%s)", strerror(errno)); + strerror_r(errno, err_buf, sizeof(err_buf)); + log_error2("Cannot create socket (%s)", err_buf); return herror_new("hsocket_bind", HSOCKET_ERROR_CREATE, - "Socket error (%s)", strerror(errno)); + "Socket error (%s)", err_buf); } setsockopt(sock.sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); @@ -271,9 +283,10 @@ if (bind(sock.sock, (struct sockaddr *) &addr, sizeof(struct sockaddr)) == -1) { - log_error2("Cannot bind socket (%s)", strerror(errno)); + strerror_r(errno, err_buf, sizeof(err_buf)); + log_error2("Cannot bind socket (%s)", err_buf); return herror_new("hsocket_bind", HSOCKET_ERROR_BIND, "Socket error (%s)", - strerror(errno)); + err_buf); } dsock->sock = sock.sock; return H_OK; @@ -294,8 +307,12 @@ if (sockfd.sock == INVALID_SOCKET) { if (WSAGetLastError() != WSAEWOULDBLOCK) + { + char err_buf[256]; + strerror_r(errno, err_buf, sizeof(err_buf)); return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, - "Socket error (%s)", strerror(errno)); + "Socket error (%s)", err_buf); + } } else { @@ -318,10 +335,11 @@ if ((dest->sock = accept(sock->sock, (struct sockaddr *) &(dest->addr), &len)) == -1) { - log_warn2("accept failed (%s)", strerror(errno)); + char err_buf[256]; + strerror_r(errno, err_buf, sizeof(err_buf)); + log_warn2("accept failed (%s)", err_buf); return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, - "Cannot accept network connection (%s)", - strerror(errno)); + "Cannot accept network connection (%s)", err_buf); } return H_OK; @@ -369,9 +387,11 @@ if (listen(sock->sock, 15) == -1) { - log_error2("listen failed (%s)", strerror(errno)); + char err_buf[256]; + strerror_r(errno, err_buf, sizeof(err_buf)); + log_error2("listen failed (%s)", err_buf); return herror_new("hsocket_listen", HSOCKET_ERROR_LISTEN, - "Cannot listen on this socket (%s)", strerror(errno)); + "Cannot listen on this socket (%s)", err_buf); } return H_OK; diff -ru libcsoap-1.1.0.old/nanohttp/nanohttp-ssl.c libcsoap-1.1.0.new/nanohttp/nanohttp-ssl.c --- libcsoap-1.1.0.old/nanohttp/nanohttp-ssl.c 2009-06-16 10:06:16.000000000 +1000 +++ libcsoap-1.1.0.new/nanohttp/nanohttp-ssl.c 2009-06-16 12:04:03.000000000 +1000 @@ -112,25 +112,27 @@ switch (SSL_get_error(ssl, ret)) { case SSL_ERROR_NONE: - return "None"; + return strdup("None"); case SSL_ERROR_ZERO_RETURN: - return "Zero return"; + return strdup("Zero return"); case SSL_ERROR_WANT_READ: - return "Want read"; + return strdup("Want read"); case SSL_ERROR_WANT_WRITE: - return "Want write"; + return strdup("Want write"); case SSL_ERROR_WANT_X509_LOOKUP: - return "Want x509 lookup"; + return strdup("Want x509 lookup"); case SSL_ERROR_SYSCALL: if (ERR_get_error() == 0 && ret == -1) { - return strerror(errno); + static char err_buf[256]; + strerror_r(errno, err_buf, sizeof(err_buf)); + return strdup(err_buf); } - return "Syscall failed"; + return strdup("Syscall failed"); case SSL_ERROR_SSL: - return "SSL error"; + return strdup("SSL error"); default: - return "Unkown error"; + return strdup("Unkown error"); } } @@ -421,10 +423,12 @@ { herror_t err; - log_error2("SSL connect error (%s)", _hssl_get_error(ssl, -1)); + char *tmp = _hssl_get_error(ssl, ret); + log_error2("SSL connect error (%s)", tmp); err = herror_new("hssl_client_ssl", HSSL_ERROR_CONNECT, - "SSL_connect failed (%s)", _hssl_get_error(ssl, ret)); + "SSL_connect failed (%s)", tmp); + free(tmp); SSL_free(ssl); return err; } @@ -488,11 +492,13 @@ { herror_t err; - log_error2("SSL_accept failed (%s)", _hssl_get_error(ssl, ret)); + char *tmp = _hssl_get_error(ssl, ret); + log_error2("SSL_accept failed (%s)", tmp); err = herror_new("hssl_server_ssl", HSSL_ERROR_SERVER, - "SSL_accept failed (%s)", _hssl_get_error(ssl, ret)); + "SSL_accept failed (%s)", tmp); + free(tmp); SSL_free(ssl); return err; @@ -527,15 +533,23 @@ if (sock->ssl) { if ((count = SSL_read(sock->ssl, buf, len)) < 1) - return herror_new("SSL_read", HSOCKET_ERROR_RECEIVE, - "SSL_read failed (%s)", _hssl_get_error(sock->ssl, - count)); + { + char *tmp = _hssl_get_error(sock->ssl, count); + herror_t herr = herror_new("SSL_read", HSOCKET_ERROR_RECEIVE, + "SSL_read failed (%s)", tmp); + free(tmp); + return herr; + } } else { if ((count = hsocket_select_read(sock->sock, buf, len)) == -1) + { + char err_buf[256]; + strerror_r(errno, err_buf, sizeof(err_buf)); return herror_new("hssl_read", HSOCKET_ERROR_RECEIVE, - "recv failed (%s)", strerror(errno)); + "recv failed (%s)", err_buf); + } } *received = count; @@ -566,15 +580,23 @@ if (sock->ssl) { if ((count = SSL_write(sock->ssl, buf, len)) == -1) - return herror_new("SSL_write", HSOCKET_ERROR_SEND, - "SSL_write failed (%s)", _hssl_get_error(sock->ssl, - count)); + { + char *tmp = _hssl_get_error(sock->ssl, count); + herror_t herr = herror_new("SSL_write", HSOCKET_ERROR_SEND, + "SSL_write failed (%s)", tmp); + free(tmp); + return herr; + } } else { if ((count = send(sock->sock, buf, len, 0)) == -1) + { + char err_buf[256]; + strerror_r(errno, err_buf, sizeof(err_buf)); return herror_new("hssl_write", HSOCKET_ERROR_SEND, "send failed (%s)", - strerror(errno)); + err_buf); + } } *sent = count; @@ -589,8 +611,12 @@ int count; if ((count = hsocket_select_read(sock->sock, buf, len)) == -1) + { + char err_buf[256]; + strerror_r(errno, err_buf, sizeof(err_buf)); return herror_new("hssl_read", HSOCKET_ERROR_RECEIVE, "recv failed (%s)", - strerror(errno)); + err_buf); + } *received = count; return H_OK; } @@ -615,8 +641,12 @@ return herror_new("hssl_write", HSOCKET_ERROR_SEND, "select error"); if ((count = send(sock->sock, buf, len, 0)) == -1) + { + char err_buf[256]; + strerror_r(errno, err_buf, sizeof(err_buf)); return herror_new("hssl_write", HSOCKET_ERROR_SEND, "send failed (%s)", - strerror(errno)); + err_buf); + } *sent = count; return H_OK; } diff -ru libcsoap-1.1.0.old/nanohttp/nanohttp-stream.c libcsoap-1.1.0.new/nanohttp/nanohttp-stream.c --- libcsoap-1.1.0.old/nanohttp/nanohttp-stream.c 2006-07-10 02:24:19.000000000 +1000 +++ libcsoap-1.1.0.new/nanohttp/nanohttp-stream.c 2009-06-16 12:02:51.000000000 +1000 @@ -88,7 +88,7 @@ /* Create object */ if (!(result = (http_input_stream_t *) malloc(sizeof(http_input_stream_t)))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); return NULL; } @@ -136,16 +136,17 @@ http_input_stream_t *result; FILE *fd; + char err_buf[256]; if (!(fd = fopen(filename, "rb"))) { - - log_error2("fopen failed (%s)", strerror(errno)); + strerror_r(errno, err_buf, sizeof(err_buf)); + log_error2("fopen failed (%s)", err_buf); return NULL; } /* Create object */ if (!(result = (http_input_stream_t *) malloc(sizeof(http_input_stream_t)))) { - log_error2("malloc failed (%s)", strerror(errno)); + log_error1("malloc failed"); fclose(fd); return NULL; } @@ -519,7 +520,8 @@ /* Create object */ if (!(result = (http_output_stream_t *) malloc(sizeof(http_output_stream_t)))) { - log_error2("malloc failed (%s)", strerror(errno)); + + log_error1("malloc failed"); return NULL; }