Skip to content
This repository has been archived by the owner on May 4, 2018. It is now read-only.

Commit

Permalink
Proper buffer overflow handling
Browse files Browse the repository at this point in the history
  • Loading branch information
felixge authored and piscisaureus committed Oct 1, 2011
1 parent c058c13 commit 238bb9f
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 5 deletions.
6 changes: 3 additions & 3 deletions src/unix/process.c
Expand Up @@ -453,15 +453,14 @@ int uv_spawn_sync(uv_loop_t* loop, uv_spawn_sync_t* spawn) {
if (spawn->stdout_buf && FD_ISSET(stdout_pipe[0], &pipes)) {
if (spawn->stdout_size - spawn->stdout_read <= 0) {
/* Check for buffer overflow. */
uv_err_new_artificial(loop, UV_ENOBUFS);
goto error;
}

r = read(stdout_pipe[0], spawn->stdout_buf + spawn->stdout_read, spawn->stdout_size - spawn->stdout_read);

/* @TODO HANDLE EAGAIN / EINTR */
if (r == -1) {
/*uv_err_new(loop, errno);*/
/* TODO return -1 */
perror("read");
goto error;
}
Expand All @@ -472,6 +471,7 @@ int uv_spawn_sync(uv_loop_t* loop, uv_spawn_sync_t* spawn) {
if (spawn->stderr_buf && FD_ISSET(stderr_pipe[0], &pipes)) {
if (spawn->stderr_size - spawn->stderr_read <= 0) {
/* Check for buffer overflow. */
uv_err_new_artificial(loop, UV_ENOBUFS);
goto error;
}

Expand Down Expand Up @@ -532,5 +532,5 @@ int uv_spawn_sync(uv_loop_t* loop, uv_spawn_sync_t* spawn) {
}

kill(spawn->pid, SIGKILL);
return 0;
return -1;
}
11 changes: 9 additions & 2 deletions test/test-spawn-sync.c
Expand Up @@ -51,6 +51,7 @@ static void init_process_options(char* test) {
}

void debug(int r) {
fprintf(stderr, "----------------------------------------\n");
fprintf(stderr, "r: %i\n", r);
fprintf(stderr, "spawn.pid: %i\n", spawn.pid);
fprintf(stderr, "spawn.stdout_read: %i\n", spawn.stdout_read);
Expand All @@ -62,6 +63,10 @@ void debug(int r) {
fprintf(stderr, "spawn.exit_timeout: %i\n", spawn.exit_timeout);
fprintf(stderr, "spawn.exit_code: %i\n", spawn.exit_code);
fprintf(stderr, "spawn.exit_signal: %i\n", spawn.exit_signal);

uv_err_t err = uv_last_error(uv_default_loop());
fprintf(stderr, "uv_last_error_name: %s\n", uv_err_name(err));
fprintf(stderr, "----------------------------------------\n");
}

TEST_IMPL(spawn_sync_exit_code) {
Expand Down Expand Up @@ -168,8 +173,9 @@ TEST_IMPL(spawn_sync_stdout_overflow) {
r = uv_spawn_sync(uv_default_loop(), &spawn);
debug(r);

ASSERT(r == 0);
ASSERT(r == -1);
ASSERT(spawn.stdout_read == spawn.stdout_size);
ASSERT(uv_last_error(uv_default_loop()).code == UV_ENOBUFS);

return 0;
}
Expand All @@ -185,8 +191,9 @@ TEST_IMPL(spawn_sync_stderr_overflow) {
r = uv_spawn_sync(uv_default_loop(), &spawn);
debug(r);

ASSERT(r == 0);
ASSERT(r == -1);
ASSERT(spawn.stderr_read == spawn.stderr_size);
ASSERT(uv_last_error(uv_default_loop()).code == UV_ENOBUFS);

return 0;
}
Expand Down

0 comments on commit 238bb9f

Please sign in to comment.