forked from github/abduco
Make error handling more robust
This commit is contained in:
parent
d1a44a9c1a
commit
e4a6b01fdc
4
abduco.c
4
abduco.c
|
|
@ -316,8 +316,8 @@ static bool create_session(const char *name, char * const argv[]) {
|
||||||
case 0: /* child = user application process */
|
case 0: /* child = user application process */
|
||||||
close(server.socket);
|
close(server.socket);
|
||||||
close(server_pipe[0]);
|
close(server_pipe[0]);
|
||||||
fcntl(client_pipe[1], F_SETFD, FD_CLOEXEC);
|
if (fcntl(client_pipe[1], F_SETFD, FD_CLOEXEC) == 0 &&
|
||||||
fcntl(server_pipe[1], F_SETFD, FD_CLOEXEC);
|
fcntl(server_pipe[1], F_SETFD, FD_CLOEXEC) == 0)
|
||||||
execvp(argv[0], argv);
|
execvp(argv[0], argv);
|
||||||
snprintf(errormsg, sizeof(errormsg), "server-execvp: %s: %s\n",
|
snprintf(errormsg, sizeof(errormsg), "server-execvp: %s: %s\n",
|
||||||
argv[0], strerror(errno));
|
argv[0], strerror(errno));
|
||||||
|
|
|
||||||
17
server.c
17
server.c
|
|
@ -18,17 +18,17 @@ static void client_free(Client *c) {
|
||||||
free(c);
|
free(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int server_mark_socket_exec(bool exec, bool usr) {
|
static void server_mark_socket_exec(bool exec, bool usr) {
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
if (stat(sockaddr.sun_path, &sb) == -1)
|
if (stat(sockaddr.sun_path, &sb) == -1)
|
||||||
return -1;
|
return;
|
||||||
mode_t mode = sb.st_mode;
|
mode_t mode = sb.st_mode;
|
||||||
mode_t flag = usr ? S_IXUSR : S_IXGRP;
|
mode_t flag = usr ? S_IXUSR : S_IXGRP;
|
||||||
if (exec)
|
if (exec)
|
||||||
mode |= flag;
|
mode |= flag;
|
||||||
else
|
else
|
||||||
mode &= ~flag;
|
mode &= ~flag;
|
||||||
return chmod(sockaddr.sun_path, mode);
|
chmod(sockaddr.sun_path, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int server_create_socket(const char *name) {
|
static int server_create_socket(const char *name) {
|
||||||
|
|
@ -63,20 +63,23 @@ static int server_set_socket_non_blocking(int sock) {
|
||||||
|
|
||||||
static Client *server_accept_client(void) {
|
static Client *server_accept_client(void) {
|
||||||
int newfd = accept(server.socket, NULL, NULL);
|
int newfd = accept(server.socket, NULL, NULL);
|
||||||
if (newfd == -1)
|
if (newfd == -1 || server_set_socket_non_blocking(newfd) == -1)
|
||||||
return NULL;
|
goto error;
|
||||||
Client *c = client_malloc(newfd);
|
Client *c = client_malloc(newfd);
|
||||||
if (!c)
|
if (!c)
|
||||||
return NULL;
|
goto error;
|
||||||
if (!server.clients)
|
if (!server.clients)
|
||||||
server_mark_socket_exec(true, true);
|
server_mark_socket_exec(true, true);
|
||||||
server_set_socket_non_blocking(newfd);
|
|
||||||
c->socket = newfd;
|
c->socket = newfd;
|
||||||
c->state = STATE_CONNECTED;
|
c->state = STATE_CONNECTED;
|
||||||
c->next = server.clients;
|
c->next = server.clients;
|
||||||
server.clients = c;
|
server.clients = c;
|
||||||
server.read_pty = true;
|
server.read_pty = true;
|
||||||
return c;
|
return c;
|
||||||
|
error:
|
||||||
|
if (newfd != -1)
|
||||||
|
close(newfd);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool server_read_pty(Packet *pkt) {
|
static bool server_read_pty(Packet *pkt) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue