#include "data-control-internal.h"
#include "data-control-types.h"
-#define MAX_COLUMN_SIZE 512
#define MAX_STATEMENT_SIZE 1024
#define RESULT_VALUE_COUNT "RESULT_VALUE_COUNT"
#define MAX_COUNT_PER_PAGE "MAX_COUNT_PER_PAGE"
* @brief This is the header file for private keys of the data-control.
*/
#include <gio/gio.h>
+#include <bundle.h>
#include "data_control_types.h"
#ifndef _APPFW_DATA_CONTROL_INTERNAL_H_
#define DATACONTROL_REQUEST_FILE_PREFIX "/tmp/data-control/datacontrol.request."
#define DATACONTROL_RESULT_FILE_PREFIX "/tmp/data-control/datacontrol.result."
+#define MAX_REQUEST_ARGUMENT_SIZE 1048576 /* 1MB */
+#define MAX_ROW_COUNT 1024
+#define MAX_COLUMN_SIZE 512
+#define MAX_VALUE_COUNT 1024
/**
* @brief Enumerations of different type of data control requests.
int _set_data_id(datacontrol_h provider, const char *data_id);
datacontrol_data_change_type_e _get_internal_noti_type(data_control_data_change_type_e type);
data_control_data_change_type_e _get_public_noti_type(datacontrol_data_change_type_e type);
+bool _check_int(int num);
#endif /* _APPFW_DATA_CONTROL_INTERNAL_H_ */
} map_response_cb_s;
static void *datacontrol_map_tree_root = NULL;
-static const int MAX_ARGUMENT_SIZE = 16384; /* 16KB */
static GHashTable *__socket_pair_hash = NULL;
static void __map_call_cb(const char *provider_id, int request_id, datacontrol_request_type type,
return NULL;
}
+ if (count < 0 || count > MAX_VALUE_COUNT) {
+ LOGE("invalid count %d", count);
+ return NULL;
+ }
value_list = (char **)calloc(count, sizeof(char *));
if (value_list == NULL) {
for (i = 0; i < count; i++) {
if (_read_socket(fd, (char *)&nbytes, sizeof(nbytes), &nb)) {
- LOGE("datacontrol_recv_map_get_value_list : ...from %d: fail to read\n", fd);
- goto ERROR;
+ LOGE("datacontrol_recv_map_get_value_list : ...from %d: fail to read\n", fd);
+ goto ERROR;
+ }
+ if (nbytes < 0 || nbytes > MAX_REQUEST_ARGUMENT_SIZE) {
+ LOGE("invalid nbytes %d", nbytes);
+ goto ERROR;
}
LOGI("nbytes : %d %d" , nbytes , nb);
}
LOGI("__recv_map_message: ...from %d: %d bytes\n", fd, nbytes);
- if (nbytes > 0) {
+ if (nbytes > 0 && nbytes < MAX_REQUEST_ARGUMENT_SIZE) {
buf = (char *) calloc(nbytes + 1, sizeof(char));
if (buf == NULL) {
LOGE("Malloc failed!!");
LOGI("Gets the value list from provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
arg_size = (strlen(provider->data_id) + strlen(key)) * sizeof(wchar_t);
- if (arg_size > MAX_ARGUMENT_SIZE) {
+ if (arg_size > MAX_REQUEST_ARGUMENT_SIZE) {
LOGE("The size of sending argument (%u) exceeds the maximum limit.", arg_size);
return DATACONTROL_ERROR_MAX_EXCEEDED;
}
LOGI("Sets the old value to new value in provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
arg_size = (strlen(provider->data_id) + strlen(key) + strlen(old_value) + strlen(new_value)) * sizeof(wchar_t);
- if (arg_size > MAX_ARGUMENT_SIZE) {
+ if (arg_size > MAX_REQUEST_ARGUMENT_SIZE) {
LOGE("The size of sending argument (%u) exceeds the maximum limit.", arg_size);
return DATACONTROL_ERROR_MAX_EXCEEDED;
}
LOGI("Adds the value in provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
arg_size = (strlen(provider->data_id) + strlen(key) + strlen(value)) * sizeof(wchar_t);
- if (arg_size > MAX_ARGUMENT_SIZE) {
+ if (arg_size > MAX_REQUEST_ARGUMENT_SIZE) {
LOGE("The size of sending argument (%u) exceeds the maximum limit.", arg_size);
return DATACONTROL_ERROR_MAX_EXCEEDED;
}
LOGI("Removes the value in provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
arg_size = (strlen(provider->data_id) + strlen(key) + strlen(value)) * sizeof(wchar_t);
- if (arg_size > MAX_ARGUMENT_SIZE) {
+ if (arg_size > MAX_REQUEST_ARGUMENT_SIZE) {
LOGE("The size of sending argument (%u) exceeds the maximum limit.", arg_size);
return DATACONTROL_ERROR_MAX_EXCEEDED;
}
sqlite3_int64 offset_idx = 0;
sqlite3_int64 row_count = 0;
unsigned int nb = 0;
- int type;
+ int type = 0;
int column_name_len;
const char *page_number_str;
int size = 0;
case SQLITE_TEXT:
type = 3;
value = (char *)sqlite3_column_text(state, i);
- size = strlen(value) + 1;
+ if (value)
+ size = strlen(value) + 1;
+ else
+ size = 0;
break;
case SQLITE_BLOB:
type = 4;
return NULL;
}
- if (len > 0) {
+ if (len > 0 && len < MAX_REQUEST_ARGUMENT_SIZE) {
buf = (char *)calloc(len, sizeof(char));
if (buf == NULL) {
LOGE("calloc fail");
{
int i = 1;
int current = 0;
- int column_count = atoi(arg_list[i++]); /* Column count */
+ int column_count = _get_int_from_str(arg_list[i++]); /* Column count */
LOGI("SELECT column count: %d", column_count);
column_list = (const char **)malloc(column_count * (sizeof(char *)));
}
LOGI("__provider_recv_message: ...from %d: %d bytes\n", fd, data_len);
- if (data_len > 0) {
+ if (data_len > 0 && data_len < MAX_REQUEST_ARGUMENT_SIZE) {
bundle *kb = NULL;
buf = (char *)calloc(data_len + 1, sizeof(char));
}
provider->provider_id = (char *)bundle_get_val(b, OSP_K_DATACONTROL_PROVIDER);
provider->data_id = (char *)bundle_get_val(b, OSP_K_DATACONTROL_DATA);
+ if (provider->provider_id == NULL || provider->data_id == NULL) {
+ LOGE("invalid provider value %s, %s", provider->provider_id, provider->data_id);
+ free(provider);
+ return DATACONTROL_ERROR_INVALID_PARAMETER;
+ }
+
LOGI("Noti Provider ID: %s, data ID: %s, request type: %d", provider->provider_id, provider->data_id, type);
path = _get_encoded_path(provider, caller_app_id);
if (path == NULL) {
#include <sys/stat.h>
#include <fcntl.h>
+
#include "data-control-sql-cursor.h"
+#include "data-control-internal.h"
#undef LOG_TAG
#ifndef LOG_TAG
#endif
#define ERR_BUFFER_SIZE 1024
-#define MAX_ROW_COUNT 1024
resultset_cursor *datacontrol_sql_get_cursor()
{
return DATACONTROL_ERROR_IO_ERROR;
}
+ if (column_len < 0 || column_len > MAX_COLUMN_SIZE) {
+ LOGE("Invalid column_len: %d", column_len);
+ return DATACONTROL_ERROR_IO_ERROR;
+ }
+
if (i == column_index) {
col_name = (char *)calloc(column_len, sizeof(char));
ret = read(fd, col_name, column_len);
return DATACONTROL_ERROR_MAX_EXCEEDED; /* overflow */
}
- if (size > 0) {
+ if (size > 0 && size < MAX_REQUEST_ARGUMENT_SIZE) {
data = (char *)malloc((size + 1) * (sizeof(char)));
memset(data, 0, size + 1);
memcpy(buffer, data, size + 1);
free(data);
+ } else {
+ LOGE("Invalid size %d", size);
+ return DATACONTROL_ERROR_IO_ERROR;
}
return DATACONTROL_ERROR_NONE;
}
return DATACONTROL_ERROR_IO_ERROR;
}
- if (size > 0) {
+ if (size > 0 && size < MAX_REQUEST_ARGUMENT_SIZE) {
data = (char *)malloc((size + 1) * (sizeof(char)));
if (!data) {
LOGE("unable to create buffer to read");
memcpy(buffer, data, size + 1);
free(data);
+ } else {
+ LOGE("Invalid size %d", size);
+ return DATACONTROL_ERROR_IO_ERROR;
}
return DATACONTROL_ERROR_NONE;
#include "data-control-internal.h"
#define REQUEST_PATH_MAX 512
-#define MAX_REQUEST_ARGUMENT_SIZE 1048576 /* 1MB */
typedef struct {
char *provider_id;
goto out;
}
+ if (column_name_len < 0 || column_name_len > MAX_COLUMN_SIZE) {
+ retval = DATACONTROL_ERROR_IO_ERROR;
+ LOGE("Invalid column_name_len %d", column_name_len);
+ goto out;
+ }
+
LOGE("column_name_len : %d", column_name_len);
if (write(result_fd, &column_name_len, sizeof(int)) == -1) {
LOGE("Writing a column_type to a file descriptor is failed. errno = %d", errno);
goto out;
}
+ if (row_count < 0 || row_count > MAX_ROW_COUNT) {
+ LOGE("invalid row_count %d", row_count);
+ retval = DATACONTROL_ERROR_IO_ERROR;
+ goto out;
+ }
+
LOGE("row_count : %lld", row_count);
if (write(result_fd, &row_count, sizeof(row_count)) == -1) {
LOGE("Writing a row_count to a file descriptor is failed. errno = %d", errno);
goto out;
}
- if (size > 0) {
+ if (size > 0 && size < MAX_REQUEST_ARGUMENT_SIZE) {
value = (void *)malloc(sizeof(void) * size);
if (value == NULL) {
LOGE("Out of mememory");
LOGE("__consumer_recv_sql_message: ...from %d: EOF\n", fd);
goto error;
}
- if (data_len > 0) {
+ if (data_len > 0 && data_len < MAX_REQUEST_ARGUMENT_SIZE) {
buf = (char *)calloc(data_len + 1, sizeof(char));
if (buf == NULL) {
LOGE("Out of memory.");
int datacontrol_check_privilege(privilege_type check_type)
{
- cynara *p_cynara;
+ cynara *p_cynara = NULL;
int fd = 0;
int ret = 0;