index 6888e39d39730c77589cbe046971243c9ce08f0f..6cad74788cbef796e42ef01a3fd6f334430fdabd 100644 (file)
assert(obj);
conn = CONN(obj);
+ conn->ready = 0;
+
if (conn->buf) {
len = sdb_strbuf_len(conn->buf);
if (len)
connection_log(int prio, const char *msg,
sdb_object_t __attribute__((unused)) *user_data)
{
+ uint32_t len = (uint32_t)sizeof(uint32_t) + (uint32_t)strlen(msg);
+ uint32_t p = htonl((uint32_t)prio);
+ char tmp[len + 1];
+
sdb_conn_t *conn;
conn = sdb_conn_get_ctx();
/* no connection associated to this thread
- * or user not authenticated yet => don't leak any information */
- if ((! conn) || (! conn->username))
+ * or startup not done yet => don't leak any information */
+ if ((! conn) || (! conn->ready))
return 0;
/* XXX: make the log-level configurable by the client at runtime */
if (prio >= SDB_LOG_DEBUG)
return 0;
- /* TODO: Use CONNECTION_LOG_<prio>? */
- if (sdb_connection_send(conn, CONNECTION_LOG,
- (uint32_t)strlen(msg), msg) < 0)
+ memcpy(tmp, &p, sizeof(p));
+ strcpy(tmp + sizeof(p), msg);
+
+ if (sdb_connection_send(conn, CONNECTION_LOG, len, tmp) < 0)
return -1;
return 0;
} /* connection_log */
status = -1;
}
- if (status)
+ if (status) {
+ if (! sdb_strbuf_len(conn->errbuf))
+ sdb_strbuf_sprintf(conn->errbuf, "Failed to execute command");
sdb_connection_send(conn, CONNECTION_ERROR,
(uint32_t)sdb_strbuf_len(conn->errbuf),
sdb_strbuf_string(conn->errbuf));
+ }
return status;
} /* command_handle */
return -1;
/* reset */
- sdb_strbuf_sprintf(conn->errbuf, "");
+ sdb_strbuf_clear(conn->errbuf);
conn->cmd = connection_get_int32(conn, 0);
conn->cmd_len = connection_get_int32(conn, sizeof(uint32_t));
sdb_strbuf_skip(conn->buf, 0, 2 * sizeof(uint32_t));
- if ((! conn->username) && (conn->cmd != CONNECTION_STARTUP))
+ if ((! conn->ready) && (conn->cmd != CONNECTION_STARTUP))
errmsg = "Authentication required";
else if (conn->cmd == CONNECTION_IDLE)
errmsg = "Invalid command 0";
if (errmsg) {
size_t len = sdb_strbuf_len(conn->buf);
- sdb_strbuf_sprintf(conn->errbuf, errmsg);
+ sdb_strbuf_sprintf(conn->errbuf, "%s", errmsg);
sdb_connection_send(conn, CONNECTION_ERROR,
(uint32_t)strlen(errmsg), errmsg);
conn->skip_len += conn->cmd_len;
* make sure we don't try to send further logs to the connection */
close(conn->fd);
conn->fd = -1;
+ conn->ready = 0;
sdb_log(SDB_LOG_ERR, "frontend: Failed to send msg "
"(code: %u, len: %u) to client: %s", code, msg_len,