extern char *program_invocation_name;
static bool inited = false;
-static void _process_target_bins(char *bins_data)
+static int decrease_size(size_t *size, size_t need)
+{
+ if (*size < need) {
+ PRINTERR("wrong buffer size");
+ return -EINVAL;
+ }
+
+ *size -= need;
+ return 0;
+}
+
+static void _process_target_bins(char *bins_data, size_t avail_size)
{
uint32_t cnt;
uint32_t len;
unsigned int i;
int ret;
+ if (decrease_size(&avail_size, sizeof(cnt)))
+ return;
+
cnt = *(uint32_t *)ptr;
ptr += sizeof(cnt);
for (i = 0; i < cnt; i++) {
+ if (decrease_size(&avail_size, sizeof(len)))
+ return;
+
len = *(uint32_t *)ptr;
ptr += sizeof(len);
+ if (decrease_size(&avail_size, len))
+ return;
+
path = malloc(len);
if (path == NULL) {
// TODO Error! error! error!
_init_feature_ptrs();
}
-void process_got_patching(char *data)
+void process_got_patching(char *data, size_t size)
{
if (!inited) {
_init_linker_addr();
inited = true;
}
- _process_target_bins(data);
+ _process_target_bins(data, size);
_process_features();
}
gTraceInfo.features.feature_0, gTraceInfo.features.feature_1);
}
-static void _process_target_bins(char *data_buf)
+static void _process_target_bins(char *data_buf, size_t size)
{
- process_got_patching(data_buf);
+ process_got_patching(data_buf, size);
}
void application_exit()
while (((recved & MSG_CONFIG_RECV) == 0) ||
((recved & MSG_TARGET_BINS_RECV) == 0)) {
const char *data_buf;
+ size_t data_size;
PRINTMSG("wait incoming message %d\n",
gTraceInfo.socket.daemonSock);
}
data_buf = log.data;
+ data_size = log.length;
if (log.type == APP_MSG_CONFIG) {
PRINTMSG("APP_MSG_CONFIG");
_configure((char *)data_buf);
recved |= MSG_CONFIG_RECV;
} else if (log.type == APP_MSG_TARGET_BINS) {
PRINTMSG("APP_MSG_TARGET_BINS");
- _process_target_bins((char *)data_buf);
+ _process_target_bins((char *)data_buf, data_size);
recved |= MSG_TARGET_BINS_RECV;
} else {
// unexpected case
} else if (FD_ISSET(gTraceInfo.socket.daemonSock, &workfds)) {
int ret;
const char *data_buf;
+ size_t data_size;
ret = read_log(gTraceInfo.socket.daemonSock, &log);
if (ret) {
}
data_buf = log.data;
+ data_size = log.length;
if (log.type == APP_MSG_CAPTURE_SCREEN) {
capture_screen_call();
} else if (log.type == APP_MSG_CONFIG) {
_configure((char *)data_buf);
} else if (log.type == APP_MSG_TARGET_BINS) {
- _process_target_bins((char *)data_buf);
+ _process_target_bins((char *)data_buf, data_size);
} else if (log.type == APP_MSG_STOP) {
/* Send acknowlege message to manager */
printLog(&log, APP_MSG_STOP);