Skip to content

Commit 89fee94

Browse files
committed
eliminate session_create leaks and strengthen regression coverage
1 parent d73972d commit 89fee94

3 files changed

Lines changed: 94 additions & 0 deletions

File tree

source/jst_session.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ static duk_ret_t session_create(duk_context *ctx)
164164
char* session_id = NULL;
165165

166166
session_id = (char*)malloc(SESSION_ID_BYTES_LENGTH+1);
167+
if(!session_id)
168+
{
169+
CosaPhpExtLog("Failed to allocate session_id!\n");
170+
RETURN_FALSE;
171+
}
172+
167173
n = syscall(SYS_getrandom, bytes, SESSION_ID_BYTES_LENGTH, 0);
168174
if(n != SESSION_ID_BYTES_LENGTH)
169175
{
@@ -177,16 +183,24 @@ static duk_ret_t session_create(duk_context *ctx)
177183
session_id[i] = BYTE_TO_PRINTABLE_HEX_CODE(bytes[i]);
178184
}
179185

186+
if(session_identifier)
187+
{
188+
free(session_identifier);
189+
session_identifier = NULL;
190+
}
191+
180192
session_identifier = (char*)malloc(SESSION_ID_LENGTH+1);
181193
if(!session_identifier)
182194
{
183195
CosaPhpExtLog("Failed to allocate session_identifier!\n");
196+
free(session_id);
184197
RETURN_FALSE;
185198
}
186199
memset(session_identifier, 0, SESSION_ID_LENGTH+1);
187200

188201
session_id[SESSION_ID_BYTES_LENGTH] = '\0';
189202
snprintf(session_identifier, SESSION_ID_LENGTH+1, "%s%s", SESSION_PREFIX, session_id);
203+
free(session_id);
190204

191205
RETURN_TRUE;
192206
return 1;

tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ add_executable(
7373
parser_test
7474
../tests/parser_test.cpp
7575
../source/jst_parser.c
76+
../source/jst_session.c
7677
../source/jst_internal.c
7778
../source/duktape/duktape.c)
7879
target_link_libraries(parser_test libgtest libgmock -pthread)

tests/parser_test.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
#include <sys/stat.h>
2727
#include <unistd.h>
2828

29+
extern "C" {
30+
duk_ret_t ccsp_session_module_open(duk_context *ctx);
31+
}
32+
2933
using namespace std;
3034

3135
class BufferFreer
@@ -106,6 +110,81 @@ TEST(general, parser) {
106110
}
107111
}
108112

113+
TEST(general, session_create_multiple_calls_succeed)
114+
{
115+
duk_context* ctx = duk_create_heap_default();
116+
ASSERT_NE(ctx, nullptr);
117+
118+
duk_push_c_function(ctx, ccsp_session_module_open, 0);
119+
duk_call(ctx, 0);
120+
duk_put_global_string(ctx, "ccsp_session");
121+
122+
duk_get_global_string(ctx, "ccsp_session");
123+
duk_get_prop_string(ctx, -1, "create");
124+
ASSERT_EQ(duk_pcall(ctx, 0), DUK_EXEC_SUCCESS);
125+
EXPECT_TRUE(duk_get_boolean(ctx, -1));
126+
duk_pop_2(ctx);
127+
128+
duk_get_global_string(ctx, "ccsp_session");
129+
duk_get_prop_string(ctx, -1, "create");
130+
ASSERT_EQ(duk_pcall(ctx, 0), DUK_EXEC_SUCCESS);
131+
EXPECT_TRUE(duk_get_boolean(ctx, -1));
132+
duk_pop_2(ctx);
133+
134+
duk_get_global_string(ctx, "ccsp_session");
135+
duk_get_prop_string(ctx, -1, "destroy");
136+
ASSERT_EQ(duk_pcall(ctx, 0), DUK_EXEC_SUCCESS);
137+
EXPECT_TRUE(duk_get_boolean(ctx, -1));
138+
duk_pop_2(ctx);
139+
140+
duk_destroy_heap(ctx);
141+
}
142+
143+
TEST(general, session_create_destroy_cycle_and_id_format)
144+
{
145+
duk_context* ctx = duk_create_heap_default();
146+
ASSERT_NE(ctx, nullptr);
147+
148+
duk_push_c_function(ctx, ccsp_session_module_open, 0);
149+
duk_call(ctx, 0);
150+
duk_put_global_string(ctx, "ccsp_session");
151+
152+
duk_get_global_string(ctx, "ccsp_session");
153+
duk_get_prop_string(ctx, -1, "create");
154+
ASSERT_EQ(duk_pcall(ctx, 0), DUK_EXEC_SUCCESS);
155+
EXPECT_TRUE(duk_get_boolean(ctx, -1));
156+
duk_pop_2(ctx);
157+
158+
duk_get_global_string(ctx, "ccsp_session");
159+
duk_get_prop_string(ctx, -1, "getId");
160+
ASSERT_EQ(duk_pcall(ctx, 0), DUK_EXEC_SUCCESS);
161+
const char* first_id = duk_get_string(ctx, -1);
162+
ASSERT_NE(first_id, nullptr);
163+
EXPECT_EQ(strlen(first_id), 40u);
164+
EXPECT_EQ(strncmp(first_id, "jst_sess", 8), 0);
165+
duk_pop_2(ctx);
166+
167+
duk_get_global_string(ctx, "ccsp_session");
168+
duk_get_prop_string(ctx, -1, "destroy");
169+
ASSERT_EQ(duk_pcall(ctx, 0), DUK_EXEC_SUCCESS);
170+
EXPECT_TRUE(duk_get_boolean(ctx, -1));
171+
duk_pop_2(ctx);
172+
173+
duk_get_global_string(ctx, "ccsp_session");
174+
duk_get_prop_string(ctx, -1, "create");
175+
ASSERT_EQ(duk_pcall(ctx, 0), DUK_EXEC_SUCCESS);
176+
EXPECT_TRUE(duk_get_boolean(ctx, -1));
177+
duk_pop_2(ctx);
178+
179+
duk_get_global_string(ctx, "ccsp_session");
180+
duk_get_prop_string(ctx, -1, "destroy");
181+
ASSERT_EQ(duk_pcall(ctx, 0), DUK_EXEC_SUCCESS);
182+
EXPECT_TRUE(duk_get_boolean(ctx, -1));
183+
duk_pop_2(ctx);
184+
185+
duk_destroy_heap(ctx);
186+
}
187+
109188
int main(int argc, char* argv[])
110189
{
111190
::testing::InitGoogleTest(&argc, argv);

0 commit comments

Comments
 (0)