Skip to content
Snippets Groups Projects
Commit 9e5736eb authored by Simon McVittie's avatar Simon McVittie
Browse files

resolve_link: Stop resolving if out of space


If PATH_MAX bytes aren't enough for anyone, smashing the stack or heap
is a poor way to report it.

Signed-off-by: default avatarSimon McVittie <smcv@collabora.com>
parent 7ad8a17d
No related branches found
No related tags found
1 merge request!311Build capsule-capture-libs from a bundled copy of libcapsule
...@@ -214,6 +214,13 @@ int resolve_link(const char *prefix, char *path, char *dir) ...@@ -214,6 +214,13 @@ int resolve_link(const char *prefix, char *path, char *dir)
rv = readlinkat( dfd, path, rl, sizeof(rl) ); rv = readlinkat( dfd, path, rl, sizeof(rl) );
if( rv == sizeof(rl) )
{
// Either rl was truncated, or there is no longer space for '\0'
rv = -1;
goto out;
}
if( rv >= 0 ) if( rv >= 0 )
{ {
rl[ rv ] = '\0'; rl[ rv ] = '\0';
...@@ -222,6 +229,12 @@ int resolve_link(const char *prefix, char *path, char *dir) ...@@ -222,6 +229,12 @@ int resolve_link(const char *prefix, char *path, char *dir)
{ {
const int pl = strlen( prefix ); const int pl = strlen( prefix );
if( pl + rv > PATH_MAX )
{
rv = -1;
goto out;
}
safe_strncpy( path, prefix, PATH_MAX ); safe_strncpy( path, prefix, PATH_MAX );
safe_strncpy( path + pl, rl, PATH_MAX - pl ); safe_strncpy( path + pl, rl, PATH_MAX - pl );
} }
...@@ -229,12 +242,19 @@ int resolve_link(const char *prefix, char *path, char *dir) ...@@ -229,12 +242,19 @@ int resolve_link(const char *prefix, char *path, char *dir)
{ {
const int pl = strlen( dir ); const int pl = strlen( dir );
if( pl + rv + 1 > PATH_MAX )
{
rv = -1;
goto out;
}
safe_strncpy( path, dir, PATH_MAX ); safe_strncpy( path, dir, PATH_MAX );
path[ pl ] = '/'; path[ pl ] = '/';
safe_strncpy( path + pl + 1, rl, PATH_MAX - pl - 1 ); safe_strncpy( path + pl + 1, rl, PATH_MAX - pl - 1 );
} }
} }
out:
close( dfd ); close( dfd );
return rv != -1; return rv != -1;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment