Exemple #1
0
TEE_Result TEE_SeekObjectData(TEE_ObjectHandle object, int32_t offset,
			      TEE_Whence whence)
{
	TEE_Result res;
	TEE_ObjectInfo info;

	if (object == TEE_HANDLE_NULL) {
		res = TEE_ERROR_BAD_PARAMETERS;
		goto out;
	}

	res = utee_cryp_obj_get_info((unsigned long)object, &info);
	if (res != TEE_SUCCESS)
		goto out;

	switch (whence) {
	case TEE_DATA_SEEK_SET:
		if (offset > 0 && (uint32_t)offset > TEE_DATA_MAX_POSITION) {
			res = TEE_ERROR_OVERFLOW;
			goto out;
		}
		break;
	case TEE_DATA_SEEK_CUR:
		if (offset > 0 &&
		    ((uint32_t)offset + info.dataPosition >
		     TEE_DATA_MAX_POSITION ||
		     (uint32_t)offset + info.dataPosition <
		     info.dataPosition)) {
			res = TEE_ERROR_OVERFLOW;
			goto out;
		}
		break;
	case TEE_DATA_SEEK_END:
		if (offset > 0 &&
		    ((uint32_t)offset + info.dataSize > TEE_DATA_MAX_POSITION ||
		     (uint32_t)offset + info.dataSize < info.dataSize)) {
			res = TEE_ERROR_OVERFLOW;
			goto out;
		}
		break;
	default:
		res = TEE_ERROR_ITEM_NOT_FOUND;
		goto out;
	}

	res = utee_storage_obj_seek((unsigned long)object, offset, whence);

out:
	if (res != TEE_SUCCESS &&
	    res != TEE_ERROR_OVERFLOW &&
	    res != TEE_ERROR_CORRUPT_OBJECT &&
	    res != TEE_ERROR_STORAGE_NOT_AVAILABLE)
		TEE_Panic(0);

	return res;
}
Exemple #2
0
TEE_Result TEE_SeekObjectData(TEE_ObjectHandle object, int32_t offset,
                              TEE_Whence whence)
{
    TEE_Result res;
    TEE_ObjectInfo info;

    if (object == TEE_HANDLE_NULL)
        TEE_Panic(0);

    res = utee_cryp_obj_get_info((uint32_t)object, &info);
    if (res != TEE_SUCCESS)
        TEE_Panic(0);

    switch (whence) {
    case TEE_DATA_SEEK_SET:
        if (offset > 0 && (uint32_t)offset > TEE_DATA_MAX_POSITION)
            return TEE_ERROR_OVERFLOW;
        break;
    case TEE_DATA_SEEK_CUR:
        if (offset > 0 &&
                ((uint32_t)offset + info.dataPosition >
                 TEE_DATA_MAX_POSITION ||
                 (uint32_t)offset + info.dataPosition <
                 info.dataPosition))
            return TEE_ERROR_OVERFLOW;
        break;
    case TEE_DATA_SEEK_END:
        if (offset > 0 &&
                ((uint32_t)offset + info.dataSize > TEE_DATA_MAX_POSITION ||
                 (uint32_t)offset + info.dataSize < info.dataSize))
            return TEE_ERROR_OVERFLOW;
        break;
    default:
        TEE_Panic(0);
    }

    res = utee_storage_obj_seek(object, offset, whence);

    if (res != TEE_SUCCESS && res != TEE_ERROR_OVERFLOW)
        TEE_Panic(0);

    return res;
}