diff options
| author | dautor <karlo98.m@gmail.com> | 2024-11-17 20:03:27 +0100 |
|---|---|---|
| committer | dautor <karlo98.m@gmail.com> | 2024-11-17 20:11:31 +0100 |
| commit | 3c75d353ed3361e86792fb726e31111a0b4199a9 (patch) | |
| tree | 8178f19fb7f2201a704113b55fbc49aab9aea279 /src/lamina/main.c | |
| parent | ec241a43c51dc0c8355bc7def98649d23ed49f77 (diff) | |
Add overflow checks to lamina
Diffstat (limited to 'src/lamina/main.c')
| -rw-r--r-- | src/lamina/main.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/lamina/main.c b/src/lamina/main.c index a17462e..2314019 100644 --- a/src/lamina/main.c +++ b/src/lamina/main.c @@ -217,7 +217,11 @@ command_run(string_array E) { M->run.Arg[ArgAt] = At; size_t Length = strlen(E._[i]); - // XXX: check that we do not go outside + if(At + Length >= sizeof(Buffer) - OffsetOf(message, run.ArgData)) + { + fprintf(stderr, "command too long\n"); + return -1; + } memcpy(M->run.ArgData + At, E._[i], Length); M->run.ArgData[At + Length] = 0; At += Length + 1; @@ -245,7 +249,11 @@ command_chdir(string_array E) message *M = (message *)Buffer; M->Type = message_type_chdir; size_t Length = strlen(E._[0]); - // XXX: check bounds + if(Length >= sizeof(Buffer) - OffsetOf(message, chdir.Path)) + { + fprintf(stderr, "chdir path too long\n"); + return -1; + } memcpy(M->chdir.Path, E._[0], Length); M->chdir.Path[Length] = 0; send(SlaveSocket, M, OffsetOf(message, chdir.Path) + Length + 1, 0); @@ -270,7 +278,11 @@ command_user(string_array E) message *M = (message *)Buffer; M->Type = message_type_user; size_t Length = strlen(E._[0]); - // XXX: check bounds + if(Length >= sizeof(Buffer) - OffsetOf(message, user.Username)) + { + fprintf(stderr, "username too long\n"); + return -1; + } memcpy(M->user.Username, E._[0], Length); M->user.Username[Length] = 0; send(SlaveSocket, M, OffsetOf(message, user.Username) + Length + 1, 0); @@ -443,7 +455,6 @@ slave(fd FD) E.Count = M->run.ArgCount; E._ = reallocarray(E._, E.Count + 1, sizeof(*E._)); E._[E.Count] = NULL; - // XXX: add checking for(size_t i = 0; i < M->run.ArgCount; ++i) E._[i] = M->run.ArgData + M->run.Arg[i]; Result = slave_command_run(E); free(E._); |
