If one had a mountpoint at '/e' (don't ask), a file being installed to
'/etc' would map to it incorrectly. Ensure we do more than just prefix
matching on paths by doing some more sanity checks once the simple
strncmp() call succeeds.

Signed-off-by: Dan McGee <d...@archlinux.org>
---
 lib/libalpm/diskspace.c |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/lib/libalpm/diskspace.c b/lib/libalpm/diskspace.c
index d0f52a6..45908b2 100644
--- a/lib/libalpm/diskspace.c
+++ b/lib/libalpm/diskspace.c
@@ -179,8 +179,20 @@ static alpm_mountpoint_t *match_mount_point(const 
alpm_list_t *mount_points,
        for(mp = mount_points; mp != NULL; mp = mp->next) {
                alpm_mountpoint_t *data = mp->data;
 
+               /* first, check if the prefix matches */
                if(strncmp(data->mount_dir, real_path, data->mount_dir_len) == 
0) {
-                       return data;
+                       /* now, the hard work- a file like '/etc/myconfig' 
shouldn't map to a
+                        * mountpoint '/e', but only '/etc'. If the mountpoint 
ends in a trailing
+                        * slash, we know we didn't have a mismatch, otherwise 
we have to do some
+                        * more sanity checks. */
+                       if(data->mount_dir[data->mount_dir_len - 1] == '/') {
+                               return data;
+                       } else if(strlen(real_path) >= data->mount_dir_len) {
+                               const char next = 
real_path[data->mount_dir_len];
+                               if(next == '/' || next == '\0') {
+                                       return data;
+                               }
+                       }
                }
        }
 
-- 
1.7.9.1


Reply via email to