Compare commits

...

4 Commits

Author SHA1 Message Date
jingyuexing
9114a66b71
Merge 20920473dd909651031910141078088f26a9d8e4 into e3ca4a767a68d127df548d82669aba3689bd84f4 2024-05-24 13:28:58 +03:00
Kim Alvefur
e3ca4a767a
fix(unix): Pass correct path length for abstract sockets (#430) 2024-05-24 13:28:51 +03:00
jingyuexing
20920473dd Update compiler flags options 2021-11-03 09:08:49 +08:00
jingyuexing
be6399cb9d Update cmake build tools 2021-11-03 08:57:41 +08:00
3 changed files with 109 additions and 41 deletions

67
CMakeLists.txt Normal file
View File

@ -0,0 +1,67 @@
project(luasocket)
cmake_minimum_required(VERSION 2.8...3.20)
include(CheckIncludeFile)
check_include_file("lua.h" HAVE_LUA)
set(socket_VERSION "3.0-rc1")
set(MIME_VERSION "1.0.3")
include_directories(BEFORE "${PROJECT_SOURCE_DIR}/src/")
# add header files directory
# include_directories()
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O2 /Ot /MD /W3 /nologo")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wshadow -Wextra -Wimplicit -O2 -ggdb3 -fpic")
endif()
if(WIN32)
if(${HAVE_LUA})
set(
SOURCE
"src/auxiliar.c"
"src/buffer.c"
"src/except.c"
"src/inet.c"
"src/io.c"
"src/options.c"
"src/select.c"
"src/tcp.c"
"src/udp.c"
"src/wsocket.c"
)
else()
message(FATAL_ERROR "can not found lua.h or lualib.h \n Maybe you can set \"include_directories(xxx/include)\"to solve this problem")
endif()
add_library(socket SHARED "${SOURCE}")
add_library(mime SHARED "src/mime.c" "src/compat.c")
set_target_properties(socket PROPERTIES OUTPUT_NAME "socket")
set_target_properties(mime PROPERTIES OUTPUT_NAME "mime")
elseif(APPLE)
# MACOS build
elseif(UNIX)
# Linux or Unix build
endif()
set(
TO_SOCKET_LDIR
"src/http.lua"
"src/url.lua"
"src/tp.lua"
"src/ftp.lua"
"src/headers.lua"
"src/smtp.lua"
)
set(
TO_TOP_LDIR
"src/ltn12.lua"
"src/socket.lua"
"src/mime.lua"
)
install(TARGETS socket LIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}/luasocket/socket")
install(FILES ${TO_SOCKET_LDIR} DESTINATION "${CMAKE_INSTALL_PREFIX}/luasocket/socket")
install(FILES ${TO_TOP_LDIR} DESTINATION "${CMAKE_INSTALL_PREFIX}/luasocket")

View File

@ -16,13 +16,6 @@
#define UNIXDGRAM_DATAGRAMSIZE 8192 #define UNIXDGRAM_DATAGRAMSIZE 8192
/* provide a SUN_LEN macro if sys/un.h doesn't (e.g. Android) */
#ifndef SUN_LEN
#define SUN_LEN(ptr) \
((size_t) (((struct sockaddr_un *) 0)->sun_path) \
+ strlen ((ptr)->sun_path))
#endif
/*=========================================================================*\ /*=========================================================================*\
* Internal function prototypes * Internal function prototypes
\*=========================================================================*/ \*=========================================================================*/
@ -42,8 +35,8 @@ static int meth_receivefrom(lua_State *L);
static int meth_sendto(lua_State *L); static int meth_sendto(lua_State *L);
static int meth_getsockname(lua_State *L); static int meth_getsockname(lua_State *L);
static const char *unixdgram_tryconnect(p_unix un, const char *path); static const char *unixdgram_tryconnect(p_unix un, const char *path, size_t len);
static const char *unixdgram_trybind(p_unix un, const char *path); static const char *unixdgram_trybind(p_unix un, const char *path, size_t len);
/* unixdgram object methods */ /* unixdgram object methods */
static luaL_Reg unixdgram_methods[] = { static luaL_Reg unixdgram_methods[] = {
@ -133,13 +126,12 @@ static int meth_send(lua_State *L)
static int meth_sendto(lua_State *L) static int meth_sendto(lua_State *L)
{ {
p_unix un = (p_unix) auxiliar_checkclass(L, "unixdgram{unconnected}", 1); p_unix un = (p_unix) auxiliar_checkclass(L, "unixdgram{unconnected}", 1);
size_t count, sent = 0; size_t count, sent, len = 0;
const char *data = luaL_checklstring(L, 2, &count); const char *data = luaL_checklstring(L, 2, &count);
const char *path = luaL_checkstring(L, 3); const char *path = luaL_checklstring(L, 3, &len);
p_timeout tm = &un->tm; p_timeout tm = &un->tm;
int err; int err;
struct sockaddr_un remote; struct sockaddr_un remote;
size_t len = strlen(path);
if (len >= sizeof(remote.sun_path)) { if (len >= sizeof(remote.sun_path)) {
lua_pushnil(L); lua_pushnil(L);
@ -148,7 +140,7 @@ static int meth_sendto(lua_State *L)
} }
memset(&remote, 0, sizeof(remote)); memset(&remote, 0, sizeof(remote));
strcpy(remote.sun_path, path); memcpy(remote.sun_path, path, len);
remote.sun_family = AF_UNIX; remote.sun_family = AF_UNIX;
timeout_markstart(tm); timeout_markstart(tm);
#ifdef UNIX_HAS_SUN_LEN #ifdef UNIX_HAS_SUN_LEN
@ -264,18 +256,22 @@ static int meth_dirty(lua_State *L) {
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\
* Binds an object to an address * Binds an object to an address
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
static const char *unixdgram_trybind(p_unix un, const char *path) { static const char *unixdgram_trybind(p_unix un, const char *path, size_t len) {
struct sockaddr_un local; struct sockaddr_un local;
size_t len = strlen(path); int err;
if (len >= sizeof(local.sun_path)) return "path too long"; if (len >= sizeof(local.sun_path)) return "path too long";
memset(&local, 0, sizeof(local)); memset(&local, 0, sizeof(local));
strcpy(local.sun_path, path); memcpy(local.sun_path, path, len);
local.sun_family = AF_UNIX; local.sun_family = AF_UNIX;
size_t addrlen = SUN_LEN(&local);
#ifdef UNIX_HAS_SUN_LEN #ifdef UNIX_HAS_SUN_LEN
local.sun_len = addrlen + 1; local.sun_len = sizeof(local.sun_family) + sizeof(local.sun_len)
+ len + 1;
err = socket_bind(&un->sock, (SA *) &local, local.sun_len);
#else
err = socket_bind(&un->sock, (SA *) &local,
sizeof(local.sun_family) + len);
#endif #endif
int err = socket_bind(&un->sock, (SA *) &local, addrlen);
if (err != IO_DONE) socket_destroy(&un->sock); if (err != IO_DONE) socket_destroy(&un->sock);
return socket_strerror(err); return socket_strerror(err);
} }
@ -283,8 +279,9 @@ static const char *unixdgram_trybind(p_unix un, const char *path) {
static int meth_bind(lua_State *L) static int meth_bind(lua_State *L)
{ {
p_unix un = (p_unix) auxiliar_checkclass(L, "unixdgram{unconnected}", 1); p_unix un = (p_unix) auxiliar_checkclass(L, "unixdgram{unconnected}", 1);
const char *path = luaL_checkstring(L, 2); size_t len;
const char *err = unixdgram_trybind(un, path); const char *path = luaL_checklstring(L, 2, &len);
const char *err = unixdgram_trybind(un, path, len);
if (err) { if (err) {
lua_pushnil(L); lua_pushnil(L);
lua_pushstring(L, err); lua_pushstring(L, err);
@ -313,20 +310,23 @@ static int meth_getsockname(lua_State *L)
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\
* Turns a master unixdgram object into a client object. * Turns a master unixdgram object into a client object.
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
static const char *unixdgram_tryconnect(p_unix un, const char *path) static const char *unixdgram_tryconnect(p_unix un, const char *path, size_t len)
{ {
struct sockaddr_un remote; struct sockaddr_un remote;
size_t len = strlen(path); int err;
if (len >= sizeof(remote.sun_path)) return "path too long"; if (len >= sizeof(remote.sun_path)) return "path too long";
memset(&remote, 0, sizeof(remote)); memset(&remote, 0, sizeof(remote));
strcpy(remote.sun_path, path); memcpy(remote.sun_path, path, len);
remote.sun_family = AF_UNIX; remote.sun_family = AF_UNIX;
timeout_markstart(&un->tm); timeout_markstart(&un->tm);
size_t addrlen = SUN_LEN(&remote);
#ifdef UNIX_HAS_SUN_LEN #ifdef UNIX_HAS_SUN_LEN
remote.sun_len = addrlen + 1; remote.sun_len = sizeof(remote.sun_family) + sizeof(remote.sun_len)
+ len + 1;
err = socket_connect(&un->sock, (SA *) &remote, remote.sun_len, &un->tm);
#else
err = socket_connect(&un->sock, (SA *) &remote,
sizeof(remote.sun_family) + len, &un->tm);
#endif #endif
int err = socket_connect(&un->sock, (SA *) &remote, addrlen, &un->tm);
if (err != IO_DONE) socket_destroy(&un->sock); if (err != IO_DONE) socket_destroy(&un->sock);
return socket_strerror(err); return socket_strerror(err);
} }
@ -334,8 +334,9 @@ static const char *unixdgram_tryconnect(p_unix un, const char *path)
static int meth_connect(lua_State *L) static int meth_connect(lua_State *L)
{ {
p_unix un = (p_unix) auxiliar_checkgroup(L, "unixdgram{any}", 1); p_unix un = (p_unix) auxiliar_checkgroup(L, "unixdgram{any}", 1);
const char *path = luaL_checkstring(L, 2); size_t len;
const char *err = unixdgram_tryconnect(un, path); const char *path = luaL_checklstring(L, 2, &len);
const char *err = unixdgram_tryconnect(un, path, len);
if (err) { if (err) {
lua_pushnil(L); lua_pushnil(L);
lua_pushstring(L, err); lua_pushstring(L, err);

View File

@ -33,8 +33,8 @@ static int meth_getstats(lua_State *L);
static int meth_setstats(lua_State *L); static int meth_setstats(lua_State *L);
static int meth_getsockname(lua_State *L); static int meth_getsockname(lua_State *L);
static const char *unixstream_tryconnect(p_unix un, const char *path); static const char *unixstream_tryconnect(p_unix un, const char *path, size_t len);
static const char *unixstream_trybind(p_unix un, const char *path); static const char *unixstream_trybind(p_unix un, const char *path, size_t len);
/* unixstream object methods */ /* unixstream object methods */
static luaL_Reg unixstream_methods[] = { static luaL_Reg unixstream_methods[] = {
@ -181,13 +181,12 @@ static int meth_accept(lua_State *L) {
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\
* Binds an object to an address * Binds an object to an address
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
static const char *unixstream_trybind(p_unix un, const char *path) { static const char *unixstream_trybind(p_unix un, const char *path, size_t len) {
struct sockaddr_un local; struct sockaddr_un local;
size_t len = strlen(path);
int err; int err;
if (len >= sizeof(local.sun_path)) return "path too long"; if (len >= sizeof(local.sun_path)) return "path too long";
memset(&local, 0, sizeof(local)); memset(&local, 0, sizeof(local));
strcpy(local.sun_path, path); memcpy(local.sun_path, path, len);
local.sun_family = AF_UNIX; local.sun_family = AF_UNIX;
#ifdef UNIX_HAS_SUN_LEN #ifdef UNIX_HAS_SUN_LEN
local.sun_len = sizeof(local.sun_family) + sizeof(local.sun_len) local.sun_len = sizeof(local.sun_family) + sizeof(local.sun_len)
@ -204,8 +203,9 @@ static const char *unixstream_trybind(p_unix un, const char *path) {
static int meth_bind(lua_State *L) { static int meth_bind(lua_State *L) {
p_unix un = (p_unix) auxiliar_checkclass(L, "unixstream{master}", 1); p_unix un = (p_unix) auxiliar_checkclass(L, "unixstream{master}", 1);
const char *path = luaL_checkstring(L, 2); size_t len;
const char *err = unixstream_trybind(un, path); const char *path = luaL_checklstring(L, 2, &len);
const char *err = unixstream_trybind(un, path, len);
if (err) { if (err) {
lua_pushnil(L); lua_pushnil(L);
lua_pushstring(L, err); lua_pushstring(L, err);
@ -234,14 +234,13 @@ static int meth_getsockname(lua_State *L)
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\
* Turns a master unixstream object into a client object. * Turns a master unixstream object into a client object.
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
static const char *unixstream_tryconnect(p_unix un, const char *path) static const char *unixstream_tryconnect(p_unix un, const char *path, size_t len)
{ {
struct sockaddr_un remote; struct sockaddr_un remote;
int err; int err;
size_t len = strlen(path);
if (len >= sizeof(remote.sun_path)) return "path too long"; if (len >= sizeof(remote.sun_path)) return "path too long";
memset(&remote, 0, sizeof(remote)); memset(&remote, 0, sizeof(remote));
strcpy(remote.sun_path, path); memcpy(remote.sun_path, path, len);
remote.sun_family = AF_UNIX; remote.sun_family = AF_UNIX;
timeout_markstart(&un->tm); timeout_markstart(&un->tm);
#ifdef UNIX_HAS_SUN_LEN #ifdef UNIX_HAS_SUN_LEN
@ -259,8 +258,9 @@ static const char *unixstream_tryconnect(p_unix un, const char *path)
static int meth_connect(lua_State *L) static int meth_connect(lua_State *L)
{ {
p_unix un = (p_unix) auxiliar_checkclass(L, "unixstream{master}", 1); p_unix un = (p_unix) auxiliar_checkclass(L, "unixstream{master}", 1);
const char *path = luaL_checkstring(L, 2); size_t len;
const char *err = unixstream_tryconnect(un, path); const char *path = luaL_checklstring(L, 2, &len);
const char *err = unixstream_tryconnect(un, path, len);
if (err) { if (err) {
lua_pushnil(L); lua_pushnil(L);
lua_pushstring(L, err); lua_pushstring(L, err);