Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
1f786b0f
Commit
1f786b0f
authored
Feb 20, 2017
by
danh-arm
Committed by
GitHub
Feb 20, 2017
Browse files
Merge pull request #842 from jeenu-arm/io-memmap-asserts
Add bounds checking asserts to memmap IO driver
parents
1a80e885
69c043b2
Changes
1
Hide whitespace changes
Inline
Side-by-side
drivers/io/io_memmap.c
View file @
1f786b0f
...
...
@@ -119,13 +119,14 @@ static int memmap_dev_close(io_dev_info_t *dev_info)
/* Open a file on the memmap device */
/* TODO: Can we do any sensible limit checks on requested memory */
static
int
memmap_block_open
(
io_dev_info_t
*
dev_info
,
const
uintptr_t
spec
,
io_entity_t
*
entity
)
{
int
result
=
-
ENOMEM
;
const
io_block_spec_t
*
block_spec
=
(
io_block_spec_t
*
)
spec
;
assert
(
block_spec
->
length
>=
0
);
/* Since we need to track open state for seek() we only allow one open
* spec at a time. When we have dynamic memory we can malloc and set
* entity->info.
...
...
@@ -153,13 +154,19 @@ static int memmap_block_open(io_dev_info_t *dev_info, const uintptr_t spec,
static
int
memmap_block_seek
(
io_entity_t
*
entity
,
int
mode
,
ssize_t
offset
)
{
int
result
=
-
ENOENT
;
file_state_t
*
fp
;
/* We only support IO_SEEK_SET for the moment. */
if
(
mode
==
IO_SEEK_SET
)
{
assert
(
entity
!=
NULL
);
/* TODO: can we do some basic limit checks on seek? */
((
file_state_t
*
)
entity
->
info
)
->
file_pos
=
offset
;
fp
=
(
file_state_t
*
)
entity
->
info
;
/* Assert that new file position is valid */
assert
((
offset
>=
0
)
&&
(
offset
<
fp
->
size
));
/* Reset file position */
fp
->
file_pos
=
offset
;
result
=
0
;
}
...
...
@@ -184,18 +191,24 @@ static int memmap_block_read(io_entity_t *entity, uintptr_t buffer,
size_t
length
,
size_t
*
length_read
)
{
file_state_t
*
fp
;
size_t
pos_after
;
assert
(
entity
!=
NULL
);
assert
(
buffer
!=
(
uintptr_t
)
NULL
);
assert
(
length_read
!=
NULL
);
fp
=
(
file_state_t
*
)
entity
->
info
;
fp
=
(
file_state_t
*
)
entity
->
info
;
/* Assert that file position is valid for this read operation */
pos_after
=
fp
->
file_pos
+
length
;
assert
((
pos_after
>=
fp
->
file_pos
)
&&
(
pos_after
<=
fp
->
size
));
memcpy
((
void
*
)
buffer
,
(
void
*
)(
fp
->
base
+
fp
->
file_pos
),
length
);
*
length_read
=
length
;
/* advance the file 'cursor' for incremental reads */
fp
->
file_pos
+=
length
;
/* Set file position after read */
fp
->
file_pos
=
pos_after
;
return
0
;
}
...
...
@@ -206,19 +219,24 @@ static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer,
size_t
length
,
size_t
*
length_written
)
{
file_state_t
*
fp
;
size_t
pos_after
;
assert
(
entity
!=
NULL
);
assert
(
buffer
!=
(
uintptr_t
)
NULL
);
assert
(
length_written
!=
NULL
);
fp
=
(
file_state_t
*
)
entity
->
info
;
fp
=
(
file_state_t
*
)
entity
->
info
;
/* Assert that file position is valid for this write operation */
pos_after
=
fp
->
file_pos
+
length
;
assert
((
pos_after
>=
fp
->
file_pos
)
&&
(
pos_after
<=
fp
->
size
));
memcpy
((
void
*
)(
fp
->
base
+
fp
->
file_pos
),
(
void
*
)
buffer
,
length
);
*
length_written
=
length
;
/*
advance the file 'cursor' for incremental
write
s
*/
fp
->
file_pos
+
=
length
;
/*
Set file position after
write */
fp
->
file_pos
=
pos_after
;
return
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment