ret = _app2sd_set_info_in_db(pkgid, passwd, loopback_device,
uid);
- if (ret < 0) {
+ if (ret != 0) {
_E("unable to save password");
free(passwd);
return APP2EXT_ERROR_SQLITE_REGISTRY;
snprintf(dmcrypt_setup_cmd, sizeof(dmcrypt_setup_cmd),
"/bin/echo '%s' | /sbin/cryptsetup -q -i %d "
- "-c aes-cbc-lmk -s %d --align-payload=8 luksFormat %s",
+ "-c aes-cbc-lmk -s %d --align-payload=8 luksFormat "
+ "--type luks1 %s",
passwd, DMCRYPT_ITER_TIME, DMCRYPT_KEY_LEN,
loopback_device);
memset(passwd, 0, strlen(passwd));
bool is_dup, uid_t uid, char **dev_node)
{
int ret;
+ int size;
char *passwd;
char dmcrypt_open_cmd[BUF_SIZE];
char dev_name[BUF_SIZE];
if (_app2sd_check_is_luks_device(loopback_device) == 0) {
_W("legacy image format!");
- snprintf(dmcrypt_open_cmd, sizeof(dmcrypt_open_cmd),
+ ret = snprintf(dmcrypt_open_cmd, sizeof(dmcrypt_open_cmd),
"/bin/echo '%s' | /sbin/cryptsetup "
"-M plain -c aes-cbc-plain -h plain open %s %s",
passwd, loopback_device, dev_name);
+ if (ret < 0 || ret > sizeof(dmcrypt_open_cmd)) {
+ free(passwd);
+ _E("snprintf fail\n");
+ return -1;
+ }
} else {
- snprintf(dmcrypt_open_cmd, sizeof(dmcrypt_open_cmd),
+ ret = snprintf(dmcrypt_open_cmd, sizeof(dmcrypt_open_cmd),
"/bin/echo '%s' | /sbin/cryptsetup -q luksOpen "
"%s %s",
passwd, loopback_device, dev_name);
+ if (ret < 0 || ret > sizeof(dmcrypt_open_cmd)) {
+ _E("snprintf fail\n");
+ free(passwd);
+ return -1;
+ }
}
free(passwd);
return APP2EXT_ERROR_OPEN_DMCRYPT_DEVICE;
}
- snprintf(buf, sizeof(buf), "/dev/mapper/%s", dev_name);
- *dev_node = strdup(buf);
+ size = strlen("/dev/mapper/%s") + strlen(dev_name) + 1;
+ *dev_node = (char *)malloc(size);
if (*dev_node == NULL) {
_E("memory alloc failed");
return APP2EXT_ERROR_OPEN_DMCRYPT_DEVICE;
}
-
- return ret;
+ ret = snprintf(*dev_node, size, "/dev/mapper/%s", dev_name);
+ if (ret < 0 || ret > size) {
+ _E("snprintf fail\n");
+ free(*dev_node);
+ *dev_node = NULL;
+ return -1;
+ }
+ return 0;
}
int _app2sd_dmcrypt_close_device(const char *pkgid, uid_t uid)
free(t_dev_node);
- snprintf(dev_node, sizeof(dev_node), "/dev/mapper/%s_%d", pkgid, uid);
- snprintf(dmcrypt_close_cmd, sizeof(dmcrypt_close_cmd),
+ ret = snprintf(dev_node, sizeof(dev_node), "/dev/mapper/%s_%d", pkgid, uid);
+ if (ret < 0 || ret > sizeof(dev_node)) {
+ _E("snprintf fail");
+ return APP2EXT_ERROR_CLOSE_DMCRYPT_DEVICE;
+ }
+ ret = snprintf(dmcrypt_close_cmd, sizeof(dmcrypt_close_cmd),
"/sbin/cryptsetup -q luksClose %s", dev_node);
+ if (ret < 0 || ret > sizeof(dmcrypt_close_cmd)) {
+ _E("snprintf fail");
+ return APP2EXT_ERROR_CLOSE_DMCRYPT_DEVICE;
+ }
ret = system(dmcrypt_close_cmd);
if (ret) {
err_str = strerror_r(errno, err_buf, sizeof(err_buf));
if (fp == NULL) {
err_str = strerror_r(errno, err_buf, sizeof(err_buf));
_E("unable to access (%s) error is (%d, %s)",
- device_path, errno, err_buf);
+ device_path, errno, err_str);
return APP2EXT_ERROR_ACCESS_FILE;
}
fclose(fp);
}
close(fd);
- snprintf(app_mmc_path, sizeof(app_mmc_path), "%s/.mmc",
+ ret = snprintf(app_mmc_path, sizeof(app_mmc_path), "%s/.mmc",
application_path);
+ if (ret < 0 || ret > sizeof(app_mmc_path)) {
+ _E("snprintf fail");
+ return APP2EXT_ERROR_OPEN_DIR;
+ }
fd = open(app_mmc_path, O_RDONLY | O_DIRECTORY);
if (fd < 0) {
_E("path(%s) error(%d)", app_mmc_path, errno);
if (mount_type != MOUNT_TYPE_RD &&
mount_type != MOUNT_TYPE_RD_REMOUNT) {
/* change lost+found permission */
- snprintf(temp_path, sizeof(temp_path), "%s/lost+found",
+ ret = snprintf(temp_path, sizeof(temp_path), "%s/lost+found",
app_mmc_path);
+ if (ret < 0 || ret > sizeof(temp_path)) {
+ _E("snprintf fail");
+ return APP2EXT_ERROR_CREATE_DIRECTORY;
+ }
ret = _app2sd_make_directory(temp_path, uid);
if (ret) {
_E("create directory(%s) failed", temp_path);
uid);
}
- snprintf(app_mmc_path, sizeof(app_mmc_path), "%s/.mmc",
+ ret = snprintf(app_mmc_path, sizeof(app_mmc_path), "%s/.mmc",
application_path);
- snprintf(app_archive_path, sizeof(app_archive_path), "%s/.archive",
+ if (ret < 0 || ret > sizeof(app_mmc_path)) {
+ _E("snprintf fail");
+ return APP2EXT_ERROR_CREATE_DIRECTORY;
+ }
+ ret = snprintf(app_archive_path, sizeof(app_archive_path), "%s/.archive",
application_path);
+ if (ret < 0 || ret > sizeof(app_archive_path)) {
+ _E("snprintf fail");
+ return APP2EXT_ERROR_CREATE_DIRECTORY;
+ }
ret = mkdir(app_mmc_path, mode);
if (ret) {
if (dir_detail == NULL || dir_detail->name == NULL ||
dir_detail->type != APP2EXT_DIR_RO)
continue;
- snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
+ ret = snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
application_path, dir_detail->name);
+ if (ret < 0 || ret > sizeof(temp_dir_path)) {
+ _E("snprintf fail");
+ return APP2EXT_ERROR_MMC_STATUS;
+ }
_D("cal size of app dirs, temp_dir_path(%s)", temp_dir_path);
total_size += _app2sd_calculate_dir_size(temp_dir_path);
}
if (dir_detail == NULL || dir_detail->name == NULL ||
dir_detail->type != APP2EXT_DIR_RO)
continue;
- snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
+ ret = snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
application_path, dir_detail->name);
+ if (ret < 0 || ret > sizeof(temp_dir_path)) {
+ _E("snprintf fail");
+ ret = APP2EXT_ERROR_MOVE;
+ goto ERR;
+ }
_D("app2archive, temp_dir_path(%s)", temp_dir_path);
ret = _app2sd_move_to_archive(temp_dir_path, app_archive_path);
if (ret) {
if (dir_detail == NULL || dir_detail->name == NULL ||
dir_detail->type != APP2EXT_DIR_RO)
continue;
- snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
+ ret = snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
app_archive_path, dir_detail->name);
+ if (ret < 0 || ret > sizeof(temp_dir_path)) {
+ _E("snprintf fail");
+ ret = APP2EXT_ERROR_COPY_DIRECTORY;
+ goto ERR;
+ }
_D("archive2mmc, temp_dir_path(%s)", temp_dir_path);
ret = _app2sd_copy_dir(temp_dir_path, app_mmc_path);
if (ret) {
return ret;
}
+static int __check_storage_availability(
+ const char *loopback_device, int free_internal_mem) {
+ unsigned long long temp;
+ int reqd_size;
+
+ temp = _app2sd_calculate_file_size(loopback_device);
+ reqd_size = (int)((temp) / (1024 * 1024));
+ _D("reqd size is (%d)", reqd_size);
+
+ if (reqd_size == 0) {
+ _E("app entry is not present in SD Card");
+ return APP2EXT_ERROR_LOOPBACK_DEVICE_UNAVAILABLE;
+ }
+
+ _I("reqd size: (%d)MB, free internal mem: (%d)MB",
+ reqd_size, free_internal_mem);
+
+ /* if avaialalbe free memory in internal storage is
+ * less than required size, return error
+ */
+ if (reqd_size > free_internal_mem) {
+ _E("innsufficient memory in internal storage"
+ " for application installation");
+ return APP2EXT_ERROR_MMC_INSUFFICIENT_MEMORY;
+ }
+
+ return 0;
+}
+
+static int __copy_directories(const char *app_mmc_path, const char *app_archive_path,
+ const char *application_path, app2ext_dir_details *dir_detail)
+{
+ int ret;
+ char temp_dir_path[FILENAME_MAX];
+ char err_buf[1024];
+ const char *err_str;
+
+ ret = snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
+ app_mmc_path, dir_detail->name);
+ if (ret < 0 || ret > sizeof(temp_dir_path)) {
+ _E("snprintf fail");
+ return -1;
+ }
+ _D("mmc2archive, temp_dir_path(%s)", temp_dir_path);
+ ret = _app2sd_copy_dir(temp_dir_path, app_archive_path);
+ if (ret) {
+ if (ret == APP2EXT_ERROR_ACCESS_FILE) {
+ _E("unable to access (%s)", temp_dir_path);
+ } else {
+ err_str = strerror_r(errno, err_buf,
+ sizeof(err_buf));
+ _E("unable to copy from (%s) to (%s),"
+ "error is (%s)", temp_dir_path,
+ app_archive_path, err_str);
+ }
+ return -1;
+ }
+ /* delete the symbolic link files [bin, lib, res]*/
+ ret = snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
+ application_path, dir_detail->name);
+ if (ret < 0 || ret > sizeof(temp_dir_path)) {
+ _E("snprintf fail");
+ return -1;
+ }
+ _D("unlink, temp_dir_path(%s)", temp_dir_path);
+ ret = unlink(temp_dir_path);
+ if (ret) {
+ if (errno == ENOENT) {
+ _W("(%s) does not exist", temp_dir_path);
+ } else {
+ _E("unable to remove the symbolic link file "
+ "(%s), it is already unlinked",
+ temp_dir_path);
+ return -1;
+ }
+ }
+ /* Copy content to destination */
+ ret = snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
+ app_archive_path, dir_detail->name);
+ if (ret < 0 || ret > sizeof(temp_dir_path)) {
+ _E("snprintf fail");
+ return -1;
+ }
+ _D("archive2app, temp_dir_path(%s)", temp_dir_path);
+ ret = _app2sd_copy_dir(temp_dir_path, application_path);
+ if (ret) {
+ if (ret == APP2EXT_ERROR_ACCESS_FILE) {
+ _E("unable to access (%s)", temp_dir_path);
+ } else {
+ err_str = strerror_r(errno, err_buf,
+ sizeof(err_buf));
+ _E("unable to copy from (%s) to (%s), "
+ "error is (%s)", temp_dir_path,
+ application_path, err_str);
+ }
+ return -1;
+ }
+ return 0;
+}
+
static int _app2sd_move_app_to_internal(const char *pkgid, GList *dir_list,
uid_t uid, char *mmc_path)
{
int ret;
mode_t mode = DIR_PERMS;
- char temp_dir_path[FILENAME_MAX];
char app_mmc_path[FILENAME_MAX];
char app_archive_path[FILENAME_MAX];
char application_path[FILENAME_MAX];
FILE *fp;
GList *list;
app2ext_dir_details *dir_detail;
- int reqd_size;
int free_internal_mem;
- unsigned long long temp = 0;
- char err_buf[1024];
- const char *err_str;
int mount_type;
ret = _app2sd_get_loopback_device_path(mmc_path, pkgid, uid,
return ret;
_app2sd_set_application_path(pkgid, uid, application_path,
- sizeof(application_path));
+ sizeof(application_path));
/* check whether application is in external memory or not */
fp = fopen(loopback_device, "r+");
if (fp == NULL) {
_E("application (%s) is not installed on SD Card",
- pkgid);
+ pkgid);
return APP2EXT_ERROR_FILE_ABSENT;
}
fclose(fp);
fclose(fp);
/* get installed app size*/
- temp = _app2sd_calculate_file_size(loopback_device);
- reqd_size = (int)((temp) / (1024 * 1024));
- _D("reqd size is (%d)", reqd_size);
-
- if (reqd_size == 0) {
- _E("app entry is not present in SD Card");
- return APP2EXT_ERROR_LOOPBACK_DEVICE_UNAVAILABLE;
- }
-
- _I("reqd size: (%d)MB, free internal mem: (%d)MB",
- reqd_size, free_internal_mem);
-
- /* if avaialalbe free memory in internal storage is
- * less than required size, return error
- */
- if (reqd_size > free_internal_mem) {
- _E("innsufficient memory in internal storage"
- " for application installation (%d)", ret);
- return APP2EXT_ERROR_MMC_INSUFFICIENT_MEMORY;
- }
+ ret = __check_storage_availability(loopback_device, free_internal_mem);
+ if (ret)
+ return ret;
device_node =
_app2sd_find_associated_dmcrypt_device_node(pkgid, uid);
goto ERR;
}
- snprintf(app_mmc_path, sizeof(app_mmc_path), "%s/.mmc",
+ ret = snprintf(app_mmc_path, sizeof(app_mmc_path), "%s/.mmc",
application_path);
- snprintf(app_archive_path, sizeof(app_archive_path), "%s/.archive",
+ if (ret < 0 || ret > sizeof(app_mmc_path)) {
+ _E("snprintf fail");
+ ret = -1;
+ goto ERR;
+ }
+ ret = snprintf(app_archive_path, sizeof(app_archive_path), "%s/.archive",
application_path);
+ if (ret < 0 || ret > sizeof(app_archive_path)) {
+ _E("snprintf fail");
+ ret = -1;
+ goto ERR;
+ }
ret = mkdir(app_archive_path, mode);
if (ret) {
dir_detail->type != APP2EXT_DIR_RO)
continue;
/* archiving code */
- snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
- app_mmc_path, dir_detail->name);
- _D("mmc2archive, temp_dir_path(%s)", temp_dir_path);
- ret = _app2sd_copy_dir(temp_dir_path, app_archive_path);
- if (ret) {
- if (ret == APP2EXT_ERROR_ACCESS_FILE) {
- _E("unable to access (%s)", temp_dir_path);
- } else {
- err_str = strerror_r(errno, err_buf,
- sizeof(err_buf));
- _E("unable to copy from (%s) to (%s),"
- "error is (%s)", temp_dir_path,
- app_archive_path, err_str);
- }
- goto ERR;
- }
- /* delete the symbolic link files [bin, lib, res]*/
- snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
- application_path, dir_detail->name);
- _D("unlink, temp_dir_path(%s)", temp_dir_path);
- ret = unlink(temp_dir_path);
- if (ret) {
- if (errno == ENOENT) {
- _W("(%s) does not exist", temp_dir_path);
- } else {
- _E("unable to remove the symbolic link file "
- "(%s), it is already unlinked",
- temp_dir_path);
- goto ERR;
- }
- }
- /* Copy content to destination */
- snprintf(temp_dir_path, sizeof(temp_dir_path), "%s/%s",
- app_archive_path, dir_detail->name);
- _D("archive2app, temp_dir_path(%s)", temp_dir_path);
- ret = _app2sd_copy_dir(temp_dir_path, application_path);
- if (ret) {
- if (ret == APP2EXT_ERROR_ACCESS_FILE) {
- _E("unable to access (%s)", temp_dir_path);
- } else {
- err_str = strerror_r(errno, err_buf,
- sizeof(err_buf));
- _E("unable to copy from (%s) to (%s), "
- "error is (%s)", temp_dir_path,
- application_path, err_str);
- }
+ ret = __copy_directories(app_mmc_path, app_archive_path,
+ application_path, dir_detail);
+ if (ret != 0) {
+ ret = -1;
goto ERR;
}
}