aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-01-22 19:14:06 -0500
committerFranklin Wei <git@fwei.tk>2016-01-22 19:14:06 -0500
commitf2a04d689ad656c0ef915261025cb0ce534c4c48 (patch)
tree7bbca8c06d2443c1ed7b4a6241e696b9362a7de9 /src
parentb33d9c81c116d43b38ceb8b247bd77f9736574b9 (diff)
downloadnetcosm-f2a04d689ad656c0ef915261025cb0ce534c4c48.zip
netcosm-f2a04d689ad656c0ef915261025cb0ce534c4c48.tar.gz
netcosm-f2a04d689ad656c0ef915261025cb0ce534c4c48.tar.bz2
netcosm-f2a04d689ad656c0ef915261025cb0ce534c4c48.tar.xz
static analysis is *AWESOME*!
Diffstat (limited to 'src')
-rw-r--r--src/client.c21
-rw-r--r--src/hash.c2
-rw-r--r--src/hash.h5
-rw-r--r--src/room.c3
-rw-r--r--src/server_reqs.c9
-rw-r--r--src/telnet.c4
-rw-r--r--src/userdb.c3
7 files changed, 19 insertions, 28 deletions
diff --git a/src/client.c b/src/client.c
index 0cfb0f9..91cbbac 100644
--- a/src/client.c
+++ b/src/client.c
@@ -152,7 +152,8 @@ void send_master(unsigned char cmd, const void *data, size_t sz)
memcpy(req, &our_pid, sizeof(pid_t));
memcpy(req + sizeof(pid_t), &cmd, 1);
- memcpy(req + sizeof(pid_t) + 1, data, sz);
+ if(data)
+ memcpy(req + sizeof(pid_t) + 1, data, sz);
write(to_parent, req, 1 + sizeof(pid_t) + sz);
@@ -200,7 +201,7 @@ tryagain:
poll(fds, ARRAYLEN(fds), -1);
for(int i = 0; i < 2; ++i)
{
- if(fds[i].revents == POLLIN)
+ if(fds[i].revents & POLLIN)
{
if(fds[i].fd == from_parent)
{
@@ -209,8 +210,8 @@ tryagain:
else if(fds[i].fd == client_fd)
{
ssize_t len = read(client_fd, buf + bufidx, BUFSZ - bufidx - 1);
- if(len < 0)
- error("lost connection");
+ if(len <= 0)
+ error("lost connection (%d)", fds[i].revents);
buf[BUFSZ - 1] = '\0';
@@ -253,18 +254,6 @@ char *client_read_password(void)
enum reqdata_typespec reqdata_type = TYPE_NONE;
union reqdata_t returned_reqdata;
-void read_string_max(int fd, char *buf, size_t max)
-{
- size_t len;
- if(read(fd, &len, sizeof(len)) != sizeof(len))
- error("read_string_max");
- if(len > max - 1)
- error("read_string_max");
- if(read(fd, buf, len) != (int)len)
- error("unexpected EOF");
- buf[max - 1] = '\0';
-}
-
bool poll_requests(void)
{
if(!are_child)
diff --git a/src/hash.c b/src/hash.c
index 44b657f..a45ab54 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -60,7 +60,7 @@ void *hash_init(size_t sz, unsigned (*hash_fn)(const void*),
int (*compare_keys)(const void*, const void*))
{
struct hash_map *ret = calloc(sizeof(struct hash_map), 1);
- ret->table = calloc(sizeof(struct hash_node), sz);
+ ret->table = calloc(sz, sizeof(struct hash_node*));
ret->table_sz = sz;
ret->hash = hash_fn;
ret->compare = compare_keys;
diff --git a/src/hash.h b/src/hash.h
index 21da10a..4def8fc 100644
--- a/src/hash.h
+++ b/src/hash.h
@@ -41,8 +41,9 @@ void hash_setfreekey_cb(void*, void (*cb)(void *key));
void hash_free(void*);
/*
- * insert a pair, returns NULL if NOT already found, otherwise returns
- * the existing data pointer without inserting the new pair
+ * insert a pair, returns NULL if NOT already found (a.k.a. success),
+ * otherwise returns the existing data pointer without inserting the
+ * new pair (a.k.a. failure)
*/
void *hash_insert(void*, const void *key, const void *data);
diff --git a/src/room.c b/src/room.c
index 7596dc4..f63f69e 100644
--- a/src/room.c
+++ b/src/room.c
@@ -81,7 +81,10 @@ char *read_string(int fd)
read(fd, &sz, sizeof(sz));
char *ret = malloc(sz + 1);
if(read(fd, ret, sz) < 0)
+ {
+ free(ret);
return NULL;
+ }
ret[sz] = '\0';
return ret;
}
diff --git a/src/server_reqs.c b/src/server_reqs.c
index bf661b9..5a15812 100644
--- a/src/server_reqs.c
+++ b/src/server_reqs.c
@@ -22,16 +22,17 @@
#include "server.h"
#include "userdb.h"
+/* sends a single packet to a child, virtually guarantees receipt */
static void send_packet(struct child_data *child, unsigned char cmd,
void *data, size_t datalen)
{
assert(datalen < MSG_MAX);
unsigned char pkt[MSG_MAX];
pkt[0] = cmd;
- if(datalen)
+ if(data && datalen)
memcpy(pkt + 1, data, datalen);
tryagain:
- if(write(child->outpipe[1], pkt, datalen + 1) < 0)
+ if(write(child->outpipe[1], pkt, (data?datalen:0) + 1) < 0)
{
/* write can fail, so we try again */
if(errno == EAGAIN)
@@ -70,9 +71,9 @@ static void req_send_clientinfo(unsigned char *data, size_t datalen,
inet_ntoa(child->addr), child->pid, state[child->state]);
if(sender->pid == child->pid)
- strncat(buf, " [YOU]\n", sizeof(buf) - 1);
+ strncat(buf, " [YOU]\n", sizeof(buf) - strlen(buf) - 1);
else
- strncat(buf, "\n", sizeof(buf) - 1);
+ strncat(buf, "\n", sizeof(buf) - strlen(buf) - 1);
send_packet(sender, REQ_BCASTMSG, buf, strlen(buf));
}
diff --git a/src/telnet.c b/src/telnet.c
index 9963007..a4efac4 100644
--- a/src/telnet.c
+++ b/src/telnet.c
@@ -91,12 +91,10 @@ enum telnet_status telnet_parse_data(const unsigned char *buf, size_t buflen)
}
break;
}
- goto got_cmd;
+ continue;
}
}
debugf("%d ", c);
- got_cmd:
- ;
}
debugf("\n");
diff --git a/src/userdb.c b/src/userdb.c
index abcdb51..2d7702c 100644
--- a/src/userdb.c
+++ b/src/userdb.c
@@ -108,8 +108,7 @@ bool userdb_remove(const char *key)
return false;
}
-/* should never fail, but could return NULL if something really weird
- * happens */
+/* returns NULL on success */
struct userdata_t *userdb_add(struct userdata_t *data)
{
struct userdata_t *new = calloc(1, sizeof(*new)); /* only in C! */