Skip to content

Commit c030df2

Browse files
committed
Improve HTTP server error handling and cleanup
This change introduces a single, well-defined cleanup path for the worker thread. On buffer allocation failure or receive errors, the code now frees the buffer, shuts down the socket, and propagates the original error back to the caller. The daemon also releases the socket when kthread creation fails. These adjustments prevent resource-leak scenarios and keep error codes intact, making the server more resilient to low-memory conditions and network-level faults.
1 parent 313f8ea commit c030df2

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

http_server.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,16 @@ static int http_server_worker(void *arg)
160160
};
161161
struct http_request request;
162162
struct socket *socket = (struct socket *) arg;
163+
int err = 0;
163164

164165
allow_signal(SIGKILL);
165166
allow_signal(SIGTERM);
166167

167168
buf = kzalloc(RECV_BUFFER_SIZE, GFP_KERNEL);
168169
if (!buf) {
169170
pr_err("can't allocate memory!\n");
170-
return -1;
171+
err = -ENOMEM;
172+
goto out;
171173
}
172174

173175
request.socket = socket;
@@ -176,19 +178,23 @@ static int http_server_worker(void *arg)
176178
while (!kthread_should_stop()) {
177179
int ret = http_server_recv(socket, buf, RECV_BUFFER_SIZE - 1);
178180
if (ret <= 0) {
179-
if (ret)
181+
if (ret) {
180182
pr_err("recv error: %d\n", ret);
181-
break;
183+
err = ret;
184+
}
185+
goto out_free_buf;
182186
}
183187
http_parser_execute(&parser, &setting, buf, ret);
184188
if (request.complete && !http_should_keep_alive(&parser))
185-
break;
189+
goto out_free_buf;
186190
memset(buf, 0, RECV_BUFFER_SIZE);
187191
}
192+
out_free_buf:
193+
kfree(buf);
194+
out:
188195
kernel_sock_shutdown(socket, SHUT_RDWR);
189196
sock_release(socket);
190-
kfree(buf);
191-
return 0;
197+
return err;
192198
}
193199

194200
int http_server_daemon(void *arg)
@@ -211,6 +217,7 @@ int http_server_daemon(void *arg)
211217
worker = kthread_run(http_server_worker, socket, KBUILD_MODNAME);
212218
if (IS_ERR(worker)) {
213219
pr_err("can't create more worker process\n");
220+
sock_release(socket);
214221
continue;
215222
}
216223
}

0 commit comments

Comments
 (0)