Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion include/kvdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
#include <cutils/properties.h>
#include <sys/types.h>

#define PROP_MSG_MAX (3 + PROP_NAME_MAX + PROP_VALUE_MAX) /* +3 = +1(opcode) +2(len) */
#define PROP_MSG_MAX (4 + PROP_NAME_MAX + PROP_VALUE_MAX) /* +4 = +1(opcode) +1(key_len) +2(val_len) */

#if defined(__cplusplus)
extern "C" {
Expand Down
2 changes: 1 addition & 1 deletion include/sys/system_properties.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ extern "C" {

typedef struct prop_info prop_info;

#define PROP_VALUE_MAX 255
#define PROP_VALUE_MAX 1024

/*
* Sets system property `name` to `value`, creating it if it doesn't exist.
Expand Down
82 changes: 41 additions & 41 deletions kvdb/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,18 +230,18 @@ int property_set_binary(const char* key, const void* value, size_t val_len, bool
return fd;
}

/*-------------------------------------*
| 1 | 1 | 1 | key_len |val_len|
|-------------------------------------|
|'S'|key_len|val_len|[key'\0']|[value]|
*-------------------------------------*/

char cmd[3] = {
'S', key_len, val_len
/*---------------------------------------------*
| 1 | 1 | 2 | key_len | val_len |
|---------------------------------------------|
|'S'|key_len|val_len(LE)|[key'\0']| [value] |
*---------------------------------------------*/

char cmd[4] = {
'S', key_len, val_len & 0xff, (val_len >> 8) & 0xff
};

struct iovec iov[3] = {
{ .iov_base = cmd, .iov_len = 3 },
{ .iov_base = cmd, .iov_len = 4 },
{ .iov_base = (char*)key, .iov_len = key_len },
{ .iov_base = (char*)value, .iov_len = val_len },
};
Expand Down Expand Up @@ -321,18 +321,18 @@ ssize_t property_get_binary(const char* key, void* value, size_t val_len)
return fd;
}

/*-----------------------------*
| 1 | 1 | key_len |val_len|
| --------------------|-------|
|'G'|key_len|[key'\0']|[value]|
*-----------------------------*/
/*-----------------------------------------*
| 1 | 1 | 2 | key_len |val_len|
| ----------------------------------------|
|'G'|key_len|val_len(LE)|[key'\0']|[value]|
*-----------------------------------------*/

char cmd[3] = {
'G', key_len, val_len
char cmd[4] = {
'G', key_len, val_len & 0xff, (val_len >> 8) & 0xff
};

struct iovec iov[2] = {
{ .iov_base = cmd, .iov_len = 3 },
{ .iov_base = cmd, .iov_len = 4 },
{ .iov_base = (char*)key, .iov_len = key_len },
};

Expand Down Expand Up @@ -513,42 +513,42 @@ int property_list_binary(void (*propfn)(const char* key, const void* value, size
}

while (1) {
/*---------------------------------*
| 1 | 1 | key_len |val_len|
|---------------------------------|
|key_len|val_len|[key'\0']|[value]|
*---------------------------------*/
/*-------------------------------------------*
| 1 | 2 | key_len | val_len |
|-------------------------------------------|
|key_len|val_len(LE)|[key'\0']| [value] |
*-------------------------------------------*/

ret = recv_safe(fd, msg, 0, 2);
ret = recv_safe(fd, msg, 0, 3);
if (ret < 0) {
ret = -errno;
KVERR("recv_safe failed, ret=%d\n", ret);
goto out;
}

if (msg[0] == 0 && msg[1] == 0) {
size_t key_len = (unsigned char)msg[0];
if (key_len == 0) {
/* end of list */
ret = 0;
break;
}

size_t key_len = (unsigned char)msg[0];
if (key_len > PROP_NAME_MAX)
continue;

size_t val_len = (unsigned char)msg[1];
size_t val_len = (unsigned char)msg[1] | ((unsigned char)msg[2] << 8);
if (val_len >= PROP_VALUE_MAX)
continue;

size_t total = key_len + val_len + 2;
ret = recv_safe(fd, msg, 2, total);
size_t total = key_len + val_len + 3;
ret = recv_safe(fd, msg, 3, total);
if (ret < 0) {
KVERR("recv_safe failed, ret=%d\n", ret);
break;
}

const char* key = msg + 2;
void* value = msg + 2 + key_len;
const char* key = msg + 3;
void* value = msg + 3 + key_len;
if (key[key_len - 1])
continue;

Expand Down Expand Up @@ -718,8 +718,8 @@ ssize_t property_monitor_read(int fd, char* newkey, void* newvalue, size_t val_l
return -ENOMEM;
}

ssize_t ret = recv(fd, msg, 2, 0);
if (ret < 2) {
ssize_t ret = recv(fd, msg, 3, 0);
if (ret < 3) {
KVERR("recv failed, ret=%d, errno=%d\n", ret, errno);
free(msg);
return ret < 0 ? -errno : -ENODATA;
Expand All @@ -731,32 +731,32 @@ ssize_t property_monitor_read(int fd, char* newkey, void* newvalue, size_t val_l
return -E2BIG;
}

size_t len = (unsigned char)msg[1];
size_t len = (unsigned char)msg[1] | ((unsigned char)msg[2] << 8);
if (len > PROP_VALUE_MAX) {
free(msg);
return -E2BIG;
}

size_t total = key_len + len + 2;
size_t total = key_len + len + 3;
ret = recv_safe(fd, msg, ret, total);
if (ret < 0) {
KVERR("recv_safe failed, ret=%d\n", ret);
free(msg);
return ret;
}

const char* key = &msg[2];
const char* key = &msg[3];
if (newkey != NULL)
strlcpy(newkey, key, PROP_NAME_MAX);

if (newvalue != NULL) {
/*--------------------------------*
| 1 | 1 | key_len |val_len|
|---------------------------------|
|key_len|val_len|[key'\0']|[value]|
*---------------------------------*/
/*-------------------------------------------*
| 1 | 2 | key_len | val_len |
|-------------------------------------------|
|key_len|val_len(LE)|[key'\0']| [value] |
*-------------------------------------------*/

const void* value = &msg[2 + key_len];
const void* value = &msg[3 + key_len];
len = val_len > len ? len : val_len;
memcpy(newvalue, value, len);
}
Expand Down
58 changes: 30 additions & 28 deletions kvdb/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,21 +114,21 @@ static void kvdb_monitor_notify(kvdb_server* server, const char* key, const void
size_t key_len = strlen(key) + 1;

/* value != NULL
*---------------------------------*
| 1 | 1 | key_len |val_len|
|---------------------------------|
|key_len|val_len|[key'\0']|[value]|
*---------------------------------*
*-------------------------------------------*
| 1 | 2 | key_len | val_len |
|-------------------------------------------|
|key_len|val_len(LE)|[key'\0']| [value] |
*-------------------------------------------*
* value == NULL
*-------------------------*
| 1 | 1 | key_len |
|-------------------------|
|key_len| 0 |[key'\0']|
*-------------------------*/
*-----------------------------*
| 1 | 2 | key_len |
|-----------------------------|
|key_len| 0 |[key'\0']|
*-----------------------------*/

char cmd[2] = { key_len, val_len };
char cmd[3] = { key_len, val_len & 0xff, (val_len >> 8) & 0xff };
struct iovec iov[3] = {
{ .iov_base = cmd, .iov_len = 2 },
{ .iov_base = cmd, .iov_len = 3 },
{ .iov_base = (char*)key, .iov_len = key_len },
{ .iov_base = (char*)value, .iov_len = val_len },
};
Expand All @@ -146,7 +146,7 @@ static void kvdb_monitor_notify(kvdb_server* server, const char* key, const void

int space;
ioctl(mon->fd, FIONSPACE, &space);
if (space < (key_len + val_len + 2)) {
if (space < (key_len + val_len + 3)) {
/* Check space before monitor notify to avoid deadlock.
Cause the send may write buffer full and wait,
then the client just get a new key and also wait,
Expand Down Expand Up @@ -323,12 +323,12 @@ static void kvdb_unbind(int fd[])
static void kvdb_list_consume(const char* key, const void* value, size_t val_len, void* cookie)
{
size_t key_len = strlen(key) + 1;
char cmd[2] = {
key_len, val_len
char cmd[3] = {
key_len, val_len & 0xff, (val_len >> 8) & 0xff
};

struct iovec iov[3] = {
{ .iov_base = cmd, .iov_len = 2 },
{ .iov_base = cmd, .iov_len = 3 },
{ .iov_base = (char*)key, .iov_len = key_len },
{ .iov_base = (char*)value, .iov_len = val_len },
};
Expand Down Expand Up @@ -383,7 +383,7 @@ static bool kvdb_client(kvdb_server* server, int fd)
goto out;
}

msg[0] = msg[1] = msg[2] = 0; /* zero the first key bytes */
msg[0] = msg[1] = msg[2] = msg[3] = 0; /* zero the first header bytes */

len = recv(fd, msg, PROP_MSG_MAX, 0);
if (len <= 0) {
Expand Down Expand Up @@ -416,19 +416,21 @@ static bool kvdb_client(kvdb_server* server, int fd)
break;
}
case 'G': {
if (len < 3)
len = kvdb_recv(fd, msg, len, 3);
if (len < 4)
len = kvdb_recv(fd, msg, len, 4);
if (len < 0)
goto out;

size_t key_len = (unsigned char)msg[1];
size_t val_len = (unsigned char)msg[2];
size_t end_pos = key_len + 3;
size_t val_len = (unsigned char)msg[2] | ((unsigned char)msg[3] << 8);
size_t end_pos = key_len + 4;
if (end_pos >= PROP_MSG_MAX)
break;

const char* key = msg + 3;
const char* key = msg + 4;
char value[PROP_VALUE_MAX];
if (val_len > PROP_VALUE_MAX)
val_len = PROP_VALUE_MAX;
len = kvdb_recv(fd, msg, len, end_pos);
if (len > 0) {
len = kvdb_get(server->kvdb, key, key_len, value, val_len);
Expand All @@ -438,18 +440,18 @@ static bool kvdb_client(kvdb_server* server, int fd)
break;
}
case 'S': {
if (len < 3)
len = kvdb_recv(fd, msg, len, 3);
if (len < 4)
len = kvdb_recv(fd, msg, len, 4);
if (len < 0)
goto out;

size_t key_len = (unsigned char)msg[1];
size_t val_len = (unsigned char)msg[2];
size_t end_pos = key_len + val_len + 3;
size_t val_len = (unsigned char)msg[2] | ((unsigned char)msg[3] << 8);
size_t end_pos = key_len + val_len + 4;
if (end_pos >= PROP_MSG_MAX)
break;

const char* key = msg + 3;
const char* key = msg + 4;
const char* value = key + key_len;
len = kvdb_recv(fd, msg, len, end_pos);
if (len > 0) {
Expand All @@ -465,7 +467,7 @@ static bool kvdb_client(kvdb_server* server, int fd)
#ifdef CONFIG_KVDB_DUMPLIST
case 'L': {
kvdb_list(server->kvdb, kvdb_list_consume, (void*)(uintptr_t)fd);
send(fd, "\0", 2, 0); /* terminator */
send(fd, "\0\0", 3, 0); /* terminator: key_len=0 + 2-byte val_len=0 */
break;
}
#endif
Expand Down
Loading