[RFC PATCH 1/1] patch: Fix to error out for invalid patch
Athira Rajeev
atrajeev at linux.vnet.ibm.com
Fri Feb 26 13:57:28 UTC 2016
When given an invalid patch, busybox reports zero exit code even if the patch is not applied.
With GNU patch, the behaviour is:
# patch < test.patch
patch: **** Only garbage was found in the patch input.
With busybox patch, I get the following output:
busybox patch < test.patch
[root at localhost ~]# echo $?
0
Input patch file contents:
==================
cat test.patch:
-- test.c.org 2015-07-15 11:27:51.100000000 +0000
++ test.c 2015-07-15 11:28:11.189000000 +0000
@@ -1,8 +1,8 @@
#include <stdio.h>
int main()
{
- int i;
- for (int j ; j <10; j++)
+ int i,j;
+ for (j ; j <10; j++)
{
printf("j is %d\n", j);
}
and test.c file contents:
# cat test.c
#include <stdio.h>
int main()
{
int i;
for (int j ; j <10; j++)
{
printf("j is %d\n", j);
}
}
busybox code loops through patchlines and check for +++, switches state when patches found.
// state 0: Not in a hunk, look for +++.
// state 1: Found +++ file indicator, look for @@
// state 2: In hunk: counting initial context lines
// state 3: In hunk: getting body
state 2 implies code is getting into the hunk.
Loop exits if patchline is empty
Adding a patch which has following changes:
- When state is 2, set patch_found to true ( implies a valid patch exists )
- when patchline is NULL, ( i.e. when end of patch is reached ), set exitval to 1 if:
patchfile size is non-zero ( that means some content is there in the patch file )
and patch_found is false ( that means no valid patches were found )
Signed-off-by: Athira Rajeev<atrajeev at linux.vnet.ibm.com>
diff --git a/editors/patch.c b/editors/patch.c
index 988021d..6bfdf19 100644
--- a/editors/patch.c
+++ b/editors/patch.c
@@ -352,11 +352,13 @@ int patch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int patch_main(int argc UNUSED_PARAM, char **argv)
{
int opts;
- int reverse, state = 0;
+ int reverse, size, state = 0;
+ bool patch_found = false;
char *oldname = NULL, *newname = NULL;
char *opt_p, *opt_i;
long oldlen = oldlen; /* for compiler */
long newlen = newlen; /* for compiler */
+ struct stat buf;
INIT_TT();
@@ -373,12 +375,22 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
}
}
+ // Get the file size using fstat
+ fstat(STDIN_FILENO, &buf);
+ size = buf.st_size;
+
// Loop through the lines in the patch
for(;;) {
char *patchline;
patchline = xmalloc_fgetline(stdin);
- if (!patchline) break;
+ if (!patchline) {
+ if (size !=0 && !patch_found) {
+ printf("Couldnt find a valid patch. \n");
+ TT.exitval = 1;
+ }
+ break;
+ }
// Other versions of patch accept damaged patches,
// so we need to also.
@@ -460,6 +472,9 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
TT.context = 0;
state = 2;
+ // In hunk, found unified diff, set patch_found
+ patch_found = true;
+
// If the --- line is missing or malformed, either oldname
// or (for -R) newname could be NULL -- but not both. Like
// GNU patch, proceed based on the +++ line, and avoid SEGVs.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/busybox/attachments/20160226/4a9c3e19/attachment.html>
More information about the busybox
mailing list