Modify the part of the test that is scanning for hugepages mount point to use existing getmntent library calls.
As a result, the maximum mount path is smaller which is ok since this is all handled by the standard library. And the resulting huge path arguments don't overflow. Signed-off-by: Stephen Hemminger <[email protected]> --- app/test/test_eal_flags.c | 115 ++++++++++++++------------------------ 1 file changed, 43 insertions(+), 72 deletions(-) diff --git a/app/test/test_eal_flags.c b/app/test/test_eal_flags.c index c2e6c00edb..0aebb5f611 100644 --- a/app/test/test_eal_flags.c +++ b/app/test/test_eal_flags.c @@ -107,6 +107,7 @@ test_misc_flags(void) #include <sys/wait.h> #include <limits.h> #include <fcntl.h> +#include <mntent.h> #include <rte_lcore.h> #include <rte_debug.h> @@ -123,6 +124,8 @@ test_misc_flags(void) #define vdev "--vdev" #define file_prefix "--file-prefix" +#define FS_HUGETLB "hugetlbfs" + #define memtest "memtest" #define memtest1 "memtest1" #define memtest2 "memtest2" @@ -136,24 +139,6 @@ enum hugepage_action { HUGEPAGE_INVALID }; -/* if string contains a hugepage path */ -static int -get_hugepage_path(char * src, int src_len, char * dst, int dst_len) -{ -#define NUM_TOKENS 4 - char *tokens[NUM_TOKENS]; - - /* if we couldn't properly split the string */ - if (rte_strsplit(src, src_len, tokens, NUM_TOKENS, ' ') < NUM_TOKENS) - return 0; - - if (strncmp(tokens[2], "hugetlbfs", sizeof("hugetlbfs")) == 0) { - strlcpy(dst, tokens[1], dst_len); - return 1; - } - return 0; -} - /* * Cycles through hugepage directories and looks for hugepage * files associated with a given prefix. Depending on value of @@ -165,45 +150,39 @@ get_hugepage_path(char * src, int src_len, char * dst, int dst_len) * Returns -1 if it encounters an error */ static int -process_hugefiles(const char * prefix, enum hugepage_action action) +process_hugefiles(const char *prefix, enum hugepage_action action) { - FILE * hugedir_handle = NULL; - DIR * hugepage_dir = NULL; - struct dirent *dirent = NULL; - - char hugefile_prefix[PATH_MAX] = {0}; - char hugedir[PATH_MAX] = {0}; - char line[PATH_MAX] = {0}; - - int fd, lck_result, result = 0; + const struct mntent *entry; + char hugefile_prefix[PATH_MAX]; + int result = 0; - const int prefix_len = snprintf(hugefile_prefix, - sizeof(hugefile_prefix), "%smap_", prefix); - if (prefix_len <= 0 || prefix_len >= (int)sizeof(hugefile_prefix) - || prefix_len >= (int)sizeof(dirent->d_name)) { + const int prefix_len = snprintf(hugefile_prefix, sizeof(hugefile_prefix), "%smap_", prefix); + if (prefix_len <= 0 || prefix_len >= NAME_MAX) { printf("Error creating hugefile filename prefix\n"); return -1; } /* get hugetlbfs mountpoints from /proc/mounts */ - hugedir_handle = fopen("/proc/mounts", "r"); - - if (hugedir_handle == NULL) { + FILE *mounts = setmntent("/proc/mounts", "r"); + if (mounts == NULL) { printf("Error parsing /proc/mounts!\n"); return -1; } - /* read and parse script output */ - while (fgets(line, sizeof(line), hugedir_handle) != NULL) { + /* foreach mountpoint */ + while ((entry = getmntent(mounts)) != NULL) { + DIR *hugepage_dir; + struct dirent *dirent; - /* check if we have a hugepage filesystem path */ - if (!get_hugepage_path(line, sizeof(line), hugedir, sizeof(hugedir))) + /* only want hugetlbfs filesystems */ + if (strcmp(entry->mnt_type, FS_HUGETLB) != 0) continue; /* check if directory exists */ - if ((hugepage_dir = opendir(hugedir)) == NULL) { - fclose(hugedir_handle); - printf("Error reading %s: %s\n", hugedir, strerror(errno)); + hugepage_dir = opendir(entry->mnt_dir); + if (hugepage_dir == NULL) { + endmntent(mounts); + printf("Error reading %s: %s\n", entry->mnt_dir, strerror(errno)); return -1; } @@ -222,10 +201,10 @@ process_hugefiles(const char * prefix, enum hugepage_action action) break; case HUGEPAGE_DELETE: { - char file_path[PATH_MAX] = {0}; + char file_path[PATH_MAX]; snprintf(file_path, sizeof(file_path), - "%s/%s", hugedir, dirent->d_name); + "%s/%s", entry->mnt_dir, dirent->d_name); /* remove file */ if (remove(file_path) < 0) { @@ -240,6 +219,8 @@ process_hugefiles(const char * prefix, enum hugepage_action action) break; case HUGEPAGE_CHECK_LOCKED: { + int fd; + /* try and lock the file */ fd = openat(dirfd(hugepage_dir), dirent->d_name, O_RDONLY); @@ -253,10 +234,7 @@ process_hugefiles(const char * prefix, enum hugepage_action action) } /* non-blocking lock */ - lck_result = flock(fd, LOCK_EX | LOCK_NB); - - /* if lock succeeds, there's something wrong */ - if (lck_result != -1) { + if (flock(fd, LOCK_EX | LOCK_NB) != -1) { result = 0; /* unlock the resulting lock */ @@ -278,7 +256,7 @@ process_hugefiles(const char * prefix, enum hugepage_action action) closedir(hugepage_dir); } /* read /proc/mounts */ end: - fclose(hugedir_handle); + endmntent(mounts); return result; } @@ -873,10 +851,10 @@ test_no_huge_flag(void) static int test_misc_flags(void) { - char hugepath[PATH_MAX] = {0}; - char hugepath_dir[PATH_MAX] = {0}; - char hugepath_dir2[PATH_MAX] = {0}; - char hugepath_dir3[PATH_MAX] = {0}; + const char *hugepath = ""; + char hugepath_dir[PATH_MAX]; + char hugepath_dir2[PATH_MAX]; + char hugepath_dir3[PATH_MAX]; #ifdef RTE_EXEC_ENV_FREEBSD /* BSD target doesn't support prefixes at this point */ const char * prefix = ""; @@ -884,9 +862,7 @@ test_misc_flags(void) #else const char *prefix = get_file_prefix(); const char * nosh_prefix = "--file-prefix=noshconf"; - FILE * hugedir_handle = NULL; - char line[PATH_MAX] = {0}; - unsigned i, isempty = 1; + struct mntent *entry; if (prefix == NULL) return -1; @@ -896,29 +872,24 @@ test_misc_flags(void) */ /* get hugetlbfs mountpoints from /proc/mounts */ - hugedir_handle = fopen("/proc/mounts", "r"); - - if (hugedir_handle == NULL) { + FILE *mounts = setmntent("/proc/mounts", "r"); + if (mounts == NULL) { printf("Error opening /proc/mounts!\n"); return -1; } - /* read /proc/mounts */ - while (fgets(line, sizeof(line), hugedir_handle) != NULL) { - - /* find first valid hugepath */ - if (get_hugepage_path(line, sizeof(line), hugepath, sizeof(hugepath))) + /* foreach mount point */ + hugepath = NULL; + while ((entry = getmntent(mounts)) != NULL) { + /* only want hugetlbfs filesystems */ + if (strcmp(entry->mnt_type, FS_HUGETLB) == 0) { + hugepath = strdupa(entry->mnt_dir); break; + } } + endmntent(mounts); - fclose(hugedir_handle); - - /* check if path is not empty */ - for (i = 0; i < sizeof(hugepath); i++) - if (hugepath[i] != '\0') - isempty = 0; - - if (isempty) { + if (hugepath == NULL) { printf("No mounted hugepage dir found!\n"); return -1; } -- 2.51.0

