diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/lib/libdevinfo/devinfo_devperm.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/usr/src/lib/libdevinfo/devinfo_devperm.c b/usr/src/lib/libdevinfo/devinfo_devperm.c index 2b10a90ba3..3f7380a2de 100644 --- a/usr/src/lib/libdevinfo/devinfo_devperm.c +++ b/usr/src/lib/libdevinfo/devinfo_devperm.c @@ -446,20 +446,24 @@ dir_dev_acc(char *path, char *left_to_do, uid_t uid, gid_t gid, mode_t mode, finddev_close(handle); return (-1); } - match = (char *)calloc(MAXPATHLEN, 1); + match = (char *)calloc(MAXPATHLEN + 2, 1); if (match == NULL) { finddev_close(handle); free(newpath); return (-1); } - if (p) { - (void) strncpy(match, left_to_do, p - left_to_do); - } else { - (void) strcpy(match, left_to_do); + /* transform pattern into ^pattern$ for exact match */ + if (snprintf(match, MAXPATHLEN + 2, "^%.*s$", + p ? (p - left_to_do) : strlen(left_to_do), left_to_do) >= + MAXPATHLEN + 2) { + finddev_close(handle); + free(newpath); + free(match); + return (-1); } - if (strcmp(match, "*") == 0) { + if (strcmp(match, "^*$") == 0) { alwaysmatch = 1; } else { if (regcomp(®ex, match, REG_EXTENDED) != 0) { |