diff --git a/include/ulib/base/base.h b/include/ulib/base/base.h index 65890dae..0b1977fe 100644 --- a/include/ulib/base/base.h +++ b/include/ulib/base/base.h @@ -16,11 +16,15 @@ /* Manage the header files to include */ -#ifdef HAVE_CONFIG_H -# include -# include -#else -/* Minimal environment configuration */ +#include +#include + +#ifndef U_LIBEXECDIR +#define U_LIBEXECDIR "/usr/local/libexec/ulib" +#endif + +/* +#ifndef HAVE_CONFIG_H # define HAVE_CXX11 1 # define HAVE_CXX14 1 # define ENABLE_LFS 1 @@ -39,21 +43,18 @@ # define PACKAGE_NAME "ULib" # define HAVE_NETINET_IN_H 1 # define ULIB_VERSION "1.4.2" -# define USE_HARDWARE_CRC32 1 # define HAVE_SYS_SENDFILE_H 1 # define PACKAGE_VERSION "1.4.2" # define HAVE_NETPACKET_PACKET_H 1 -# define FNM_PATHNAME (1 << 0) /* No wildcard can ever match '/' */ -# define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars */ -# define FNM_PERIOD (1 << 2) /* Leading '.' is matched only explicitly */ +# define FNM_PATHNAME (1 << 0) +# define FNM_NOESCAPE (1 << 1) +# define FNM_PERIOD (1 << 2) # define U_CACHE_REQUEST_DISABLE 1 # define U_PIPELINE_HOMOGENEOUS_DISABLE 1 # define restrict # include -# ifndef U_LIBEXECDIR -# define U_LIBEXECDIR "/usr/libexec/ulib" -# endif #endif +*/ #ifdef U_LINUX # ifdef HAVE__USR_SRC_LINUX_INCLUDE_GENERATED_UAPI_LINUX_VERSION_H @@ -107,6 +108,9 @@ U_DO_PRAGMA(message ("Sorry I was compiled with http2 enabled so I cannot suppor # undef U_HTTP_INOTIFY_SUPPORT U_DO_PRAGMA(message ("Sorry I was compiled with server captive portal mode enabled so I cannot support http inotify")) #endif +#if defined(USE_HARDWARE_CRC32) && defined(__GNUC__) && !defined(HAVE_CONFIG_H) /* The built-in functions __builtin_ia32_crc32 are available when -mcrc32 is used */ +U_DO_PRAGMA(message ("ULib is configured with support for crc32 intrinsics, so you must use the -mcrc32 g++ option for compilation")) +#endif #include #include diff --git a/src/ulib/base/zip/ziptool.c b/src/ulib/base/zip/ziptool.c index 2e9f2283..e87161d0 100644 --- a/src/ulib/base/zip/ziptool.c +++ b/src/ulib/base/zip/ziptool.c @@ -809,6 +809,7 @@ unsigned zip_extract(const char* zipfile, const char** files, char*** filenames, U_INTERNAL_TRACE("zip_extract(%s,%p,%p,%p)", zipfile, files, filenames, filenames_len) +#ifndef U_COVERITY_FALSE_POSITIVE if (zip_open(zipfile)) return 0; /* open the zipfile */ if (files) while (files[file_num] != 0) ++file_num; @@ -901,8 +902,6 @@ unsigned zip_extract(const char* zipfile, const char** files, char*** filenames, return 0; } -# ifndef U_COVERITY_FALSE_POSITIVE - /* coverity[toctou] */ if (stat(tmp_buff, &sbuf) < 0) { if (errno != ENOENT) @@ -929,7 +928,6 @@ unsigned zip_extract(const char* zipfile, const char** files, char*** filenames, return 0; } -# endif } } @@ -992,18 +990,14 @@ unsigned zip_extract(const char* zipfile, const char** files, char*** filenames, { perror("read"); -# ifndef U_COVERITY_FALSE_POSITIVE // NEGATIVE_RETURNS (void) close(f_fd); return 0; -# endif } ze.crc = crc32(ze.crc, (Bytef*)rd_buff, rdamt); -# ifndef U_COVERITY_FALSE_POSITIVE // NEGATIVE_RETURNS (void) write(f_fd, rd_buff, rdamt); -# endif in_a -= rdamt; out_a += rdamt; @@ -1014,9 +1008,7 @@ unsigned zip_extract(const char* zipfile, const char** files, char*** filenames, if (eflen) consume(eflen); } -# ifndef U_COVERITY_FALSE_POSITIVE // NEGATIVE_RETURNS (void) close(f_fd); -# endif /* if there is a data descriptor left, compare the CRC */ @@ -1069,6 +1061,7 @@ unsigned zip_extract(const char* zipfile, const char** files, char*** filenames, *filenames = 0; *filenames_len = 0; } +#endif return n; } diff --git a/src/ulib/net/server/plugin/usp/usp_translator.cpp b/src/ulib/net/server/plugin/usp/usp_translator.cpp index f67aa775..2b8dbb49 100644 --- a/src/ulib/net/server/plugin/usp/usp_translator.cpp +++ b/src/ulib/net/server/plugin/usp/usp_translator.cpp @@ -81,6 +81,14 @@ public: Application() { U_TRACE_NO_PARAM(5, "Application::Application()") + + bvar = + bsession = + bstorage = + bfirst_pass = + is_html = + test_if_html = + bpreprocessing_failed = false; } ~Application() @@ -201,7 +209,7 @@ public: const char* directive = token.c_pointer(2); // "-#"... - U_INTERNAL_DUMP("directive(10) = %.*S", 10, directive) + U_INTERNAL_DUMP("directive(10) = %.10S", directive) if (bfirst_pass) { @@ -213,50 +221,58 @@ public: if (bdefine || binclude) { - UString block(100U); - UVector vec; + uint32_t pos; + const char* ptr; + UString block(100U + token.size()); block.snprintf(U_CONSTANT_TO_PARAM(""), token.rep); - for (const char* ptr = t.getPointer(); u__isspace(*ptr); ++ptr) block.push_back(*ptr); + pos = t.getDistance() - block.size(); - vec.push_back(block); + U_INTERNAL_DUMP("usp(%u) = %.10S", pos, t.getPointer()) - if (binclude) + for (ptr = t.getPointer(); u__isspace(*ptr); ++ptr) block.push_back(*ptr); + + if (bdefine) + { + vdefine.push_back(block); + vdefine.push_back(UString::getStringNull()); + + setDirectiveItem(directive, U_CONSTANT_SIZE("define")); + + ptr = token.data(); + + do { ++ptr; } while (u__isspace(*ptr) == false); + + pos = token.distance(ptr); + + UString id(token, 0, pos), + value(token, pos); + + vdefine.push_back(id); + vdefine.push_back(value); + } + else { setDirectiveItem(directive, U_CONSTANT_SIZE("include")); UString content = UFile::contentOf(token); - if (content) vec.push_back(vdefine.empty() ? content : UStringExt::substitute(content, vdefine)); - else + if (content.empty()) { - vec.push_back(UString::getStringNull()); - U_WARNING("load of include usp %V failed", token.rep); } + else + { +# ifdef DEBUG + token.clear(); // NB: to avoid DEAD OF SOURCE STRING WITH CHILD ALIVE... +# endif + + t.setData((usp = UStringExt::substitute(usp, block, content))); + + t.setDistance(pos); + } } - else - { - U_INTERNAL_ASSERT(bdefine) - - setDirectiveItem(directive, U_CONSTANT_SIZE("define")); - - vec.push_back(UString::getStringNull()); - - (void) vec.split(U_STRING_TO_PARAM(token)); - - U_ASSERT_EQUALS(vec.size(), 4) - - vdefine.push_back(vec[2]); - vdefine.push_back(vec[3]); - } - -# ifdef DEBUG - token.clear(); // NB: to avoid DEAD OF SOURCE STRING WITH CHILD ALIVE... -# endif - - t.setData((usp = UStringExt::substitute(usp, vec))); } return; @@ -476,10 +492,6 @@ public: const char* ptr; uint32_t distance, pos, size; -# ifdef DEBUG - token.clear(); // NB: to avoid DEAD OF SOURCE STRING WITH CHILD ALIVE... -# endif - t.setData(usp); loop: distance = t.getDistance(); @@ -546,25 +558,10 @@ loop: distance = t.getDistance(); } } - void firstPass() - { - U_TRACE_NO_PARAM(5, "Application::firstPass()") - - // NB: we check for and - - bfirst_pass = true; - - processUSP(); - } - bool execPreProcessing() { U_TRACE_NO_PARAM(5, "Application::execPreProcessing()") -# ifndef DEBUG - bpreprocessing_failed = false; -# endif - if (U_STRING_FIND(usp, 0, "\n#ifdef DEBUG") != U_NOT_FOUND) { UFileConfig cfg(UStringExt::substitute(usp, U_CONSTANT_TO_PARAM("#include"), U_CONSTANT_TO_PARAM("//#include")), true); @@ -572,9 +569,7 @@ loop: distance = t.getDistance(); if (cfg.processData(false)) usp = UStringExt::substitute(cfg.getData(), U_CONSTANT_TO_PARAM("//#include"), U_CONSTANT_TO_PARAM("#include")); else { -# ifndef DEBUG bpreprocessing_failed = true; -# endif U_RETURN(false); } @@ -583,20 +578,6 @@ loop: distance = t.getDistance(); U_RETURN(true); } - void secondPass() - { - U_TRACE_NO_PARAM(5, "Application::secondPass()") - - bvar = - bsession = - bstorage = - bfirst_pass = - is_html = - test_if_html = false; - - processUSP(); - } - void run(int argc, char* argv[], char* env[]) { U_TRACE(5, "Application::run(%d,%p,%p)", argc, argv, env) @@ -613,13 +594,21 @@ loop: distance = t.getDistance(); t.setGroup(U_CONSTANT_TO_PARAM("")); - firstPass(); + bfirst_pass = true; // NB: we check for and - if (usp.empty()) U_ERROR("first pass for %V failed", filename.rep); + processUSP(); + +# ifdef DEBUG + token.clear(); // NB: to avoid DEAD OF SOURCE STRING WITH CHILD ALIVE... +# endif + + if (vdefine.empty() == false) usp = UStringExt::substitute(usp, vdefine); if (execPreProcessing() == false) U_WARNING("preprocessing of %V failed", filename.rep); - secondPass(); + bfirst_pass = false; + + processUSP(); U_INTERNAL_DUMP("declaration = %V", declaration.rep) @@ -634,9 +623,16 @@ loop: distance = t.getDistance(); char ptr4[100] = { '\0' }; char ptr5[100] = { '\0' }; const char* ptr6 = ""; - const char* ptr7 = (u_get_unalignedp32(usp.data()) == U_MULTICHAR_CONSTANT32('<','!','-','-') && usp.c_char(4) == '#' && u__isspace(usp.c_char(5)) // (comment) - ? "\n\tUClientImage_Base::setRequestNoCache();\n\t\n" - : ""); + const char* ptr7 = ""; + +# ifndef U_CACHE_REQUEST_DISABLE + if (usp.c_char(4) == '#' && + u__isspace(usp.c_char(5)) && + u_get_unalignedp32(usp.data()) == U_MULTICHAR_CONSTANT32('<','!','-','-')) // (comment) + { + ptr7 = "\n\tUClientImage_Base::setRequestNoCache();\n\t\n"; + } +# endif UString basename = UStringExt::basename(filename); @@ -769,7 +765,7 @@ private: UTokenizer t; UVector vdefine; UString usp, token, output0, output1, declaration, vcode, http_header; - bool test_if_html, is_html, bpreprocessing_failed, bfirst_pass, bvar, bsession, bstorage; + bool bvar, bsession, bstorage, bfirst_pass, is_html, test_if_html, bpreprocessing_failed; U_DISALLOW_COPY_AND_ASSIGN(Application) }; diff --git a/src/ulib/net/server/server.cpp b/src/ulib/net/server/server.cpp index 0993a727..6c6e044f 100644 --- a/src/ulib/net/server/server.cpp +++ b/src/ulib/net/server/server.cpp @@ -27,6 +27,7 @@ # include #else # include +# include # include # ifdef HAVE_SCHED_GETCPU # include @@ -1815,14 +1816,16 @@ void UServer_Base::loadConfigParam() min_size_for_sendfile = cfg->readLong(U_CONSTANT_TO_PARAM("MIN_SIZE_FOR_SENDFILE"), 500 * 1024); // 500k: for major size we assume is better to use sendfile() num_client_threshold = cfg->readLong(U_CONSTANT_TO_PARAM("CLIENT_THRESHOLD")); UNotifier::max_connection = cfg->readLong(U_CONSTANT_TO_PARAM("MAX_KEEP_ALIVE")); + u_printf_string_max_length = cfg->readLong(U_CONSTANT_TO_PARAM("LOG_MSG_SIZE")); num_client_for_parallelization = cfg->readLong(U_CONSTANT_TO_PARAM("CLIENT_FOR_PARALLELIZATION")); #ifdef USERVER_UDP - if (budp == false) + if (budp && + u_printf_string_max_length == -1) + { + u_printf_string_max_length = 128; + } #endif - { - u_printf_string_max_length = cfg->readLong(U_CONSTANT_TO_PARAM("LOG_MSG_SIZE")); - } x = cfg->at(U_CONSTANT_TO_PARAM("CRASH_EMAIL_NOTIFY")); @@ -4270,6 +4273,10 @@ void UServer_Base::run() UInterrupt::setHandlerForSignal(SIGHUP, (sighandler_t)SIG_IGN); // NB: we can't use UInterrupt::erase() because it restore the old action (UInterrupt::init)... +# ifdef U_LINUX + (void) U_SYSCALL(prctl, "%d,%lu", PR_SET_PDEATHSIG, SIGINT); +# endif + runLoop(user); return; diff --git a/tests/examples/inp/http/usp_include.req b/tests/examples/inp/http/usp_include.req new file mode 100644 index 00000000..d7c4abeb --- /dev/null +++ b/tests/examples/inp/http/usp_include.req @@ -0,0 +1,6 @@ +GET /home HTTP/1.1 +Host: localhost:8080 + +GET /home HTTP/1.1 +Host: localhost:8080 + diff --git a/tests/examples/ok/usp_include.ok b/tests/examples/ok/usp_include.ok new file mode 100644 index 00000000..ea82418c --- /dev/null +++ b/tests/examples/ok/usp_include.ok @@ -0,0 +1,55 @@ +HTTP/1.1 200 OK +Date: Thu, 12 Oct 2017 15:11:29 GMT +Server: ULib +Content-Type: text/html; charset=UTF-8 +Content-Length: 332 + + + + + + + +
+
+ + +

Hello

+
+
+ + + + + + +HTTP/1.1 200 OK +Date: Thu, 12 Oct 2017 15:11:29 GMT +Server: ULib +Content-Type: text/html; charset=UTF-8 +Content-Length: 332 + + + + + + + +
+
+ + +

Hello

+
+
+ + + + + + + \ No newline at end of file diff --git a/tests/examples/usp_include.test b/tests/examples/usp_include.test new file mode 100755 index 00000000..7579beed --- /dev/null +++ b/tests/examples/usp_include.test @@ -0,0 +1,58 @@ +#!/bin/sh + +. ../.function + +## usp_include.test -- Test prototype for Jon + +start_msg usp_include + + UTRACE="0 15M 0" +#UOBJDUMP="0 10M 10" +#USIMERR="error.sim" + export UTRACE UOBJDUMP USIMERR + +DOC_ROOT=JONATHAN/docroot + +rm -rf $DOC_ROOT/*log /tmp/request.* /tmp/response.* \ + out/userver_tcp.out err/userver_tcp.err \ + trace.*userver_*.[0-9]* object.*userver_*.[0-9]* stack.*userver_*.[0-9]* mempool.*userver_*.[0-9]* \ + $DOC_ROOT/trace.*userver_*.[0-9]* $DOC_ROOT/object.*userver_*.[0-9]* $DOC_ROOT/stack.*userver_*.[0-9]* $DOC_ROOT/mempool.*userver_*.[0-9]* + +cat <inp/webserver.cfg +userver { + PORT 8080 + LOG_FILE usp_include.log + LOG_FILE_SZ 1M + PID_FILE /var/run/userver_tcp.pid + DOCUMENT_ROOT $DOC_ROOT + PREFORK_CHILD 0 + PLUGIN_DIR ../../../../src/ulib/net/server/plugin/.libs +#ORM_DRIVER mysql +#ORM_DRIVER sqlite +#ORM_DRIVER_DIR ../../../../src/ulib/orm/driver/.libs +} +EOF + +check_for_netcat + +DIR_CMD="../../examples/userver" + +#export ORM_DRIVER="sqlite" +#export ORM_OPTION="host=localhost dbname=../db/hello_world" + +start_prg_background userver_tcp -c inp/webserver.cfg + +wait_server_ready localhost 8080 + +#sync +#echo "PID = `cat /var/run/userver_tcp.pid`" +#exit 0 + +send_req $NCAT localhost 8080 inp/http/usp_include.req usp_include 2 kill + +kill_server userver_tcp + +mv err/userver_tcp.err err/one.err + +# Test against expected output +test_output_wc l usp_include diff --git a/tests/ulib/README b/tests/ulib/README index f6340034..e02a0dc3 100644 --- a/tests/ulib/README +++ b/tests/ulib/README @@ -7,8 +7,8 @@ Debian 7.11 was released Saturday, 4th June 2016. Debian 8.9, or jessie. Access this release through dists/oldstable Debian 8.9 was released Saturday, 22nd July 2017. -Debian 9.1, or stretch. Access this release through dists/stable -Debian 9.1 was released Saturday, 22nd July 2017. +Debian 9.2, or stretch. Access this release through dists/stable +Debian 9.2 was released Saturday, 7th October 2017. Testing, or buster. Access this release through dists/testing. The current tested development snapshot is named buster. Packages which