From 939660528bf1568c55b6dcf982cc9020c1dbcdd2 Mon Sep 17 00:00:00 2001 From: Alan Dunn Date: Wed, 24 Feb 2016 08:12:25 -0800 Subject: Change parser interface to allow stat Currently, the GRUB2 parser incorrectly reports "[ -f ]" as false if the size of the file is above 1 MB. This patch changes the parser interface to allow stating files (with parser_stat_file). Then in the implementation of "[ -f ]", we can use parser_stat_file instead of parser_request_file which has the size limitation. I eliminate parser_check_dir in lieu of this new interface, which has the side effect of making "[ -d ]" work (the error code for stat was not checked correctly before). I add a basic test for the test file operations -f, -s, and -d (to show that my changes to test file operations do not break them) and minorly modify the test framework to ensure it has enough fidelity to cause the expected results. Unfortunately the test wouldn't have caught the issue with -d, since the test framework stubs out the parser interface itself. Nor can the test framework catch the initial problem with -f because the imposed limit is (transitively) in function parser_request_file. Note that -f and -d follow symlinks despite the fact that GRUB does not (see http://lists.gnu.org/archive/html/grub-devel/2016-02/msg00142.html discussing GRUB's behavior). This is not a change to Petitboot's behavior though. Tested: The test test-grub2-test-file-ops passes. I booted Petitboot against a GRUB snippet: status=success if [ ! -f /large_file -a $status = success ] then status=fail_large_file fi if [ ! -d /a_directory -a $status = success ] then status=fail_dir fi menuentry $status { linux /vmlinux } (after making /large_file a file of size > 1 MiB and /a_directory a directory) and the menuentry had title "success", as desired. Signed-off-by: Alan Dunn Signed-off-by: Sam Mendoza-Jonas --- discover/parser.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'discover/parser.c') diff --git a/discover/parser.c b/discover/parser.c index fbf31b2..5598f96 100644 --- a/discover/parser.c +++ b/discover/parser.c @@ -1,8 +1,6 @@ #include #include -#include -#include #include "types/types.h" #include @@ -49,24 +47,30 @@ int parser_request_file(struct discover_context *ctx, return rc; } -int parser_check_dir(struct discover_context *ctx, - struct discover_device *dev, const char *dirname) +int parser_stat_path(struct discover_context *ctx, + struct discover_device *dev, const char *path, + struct stat *statbuf) { - struct stat statbuf; - char *path; - int rc; + int rc = -1; + char *full_path; + /* we only support local files at present */ if (!dev->mount_path) return -1; - path = local_path(ctx, dev, dirname); + full_path = local_path(ctx, dev, path); - rc = stat(path, &statbuf); - talloc_free(path); - if (!rc) - return -1; + rc = stat(full_path, statbuf); + if (rc) { + rc = -1; + goto out; + } - return S_ISDIR(statbuf.st_mode) ? 0 : -1; + rc = 0; +out: + talloc_free(full_path); + + return rc; } int parser_replace_file(struct discover_context *ctx, -- cgit v1.2.1