diff options
| author | Franklin Wei <git@fwei.tk> | 2016-01-22 19:14:06 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-01-22 19:14:06 -0500 |
| commit | f2a04d689ad656c0ef915261025cb0ce534c4c48 (patch) | |
| tree | 7bbca8c06d2443c1ed7b4a6241e696b9362a7de9 /src | |
| parent | b33d9c81c116d43b38ceb8b247bd77f9736574b9 (diff) | |
| download | netcosm-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.c | 21 | ||||
| -rw-r--r-- | src/hash.c | 2 | ||||
| -rw-r--r-- | src/hash.h | 5 | ||||
| -rw-r--r-- | src/room.c | 3 | ||||
| -rw-r--r-- | src/server_reqs.c | 9 | ||||
| -rw-r--r-- | src/telnet.c | 4 | ||||
| -rw-r--r-- | src/userdb.c | 3 |
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) @@ -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; @@ -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); @@ -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! */ |