aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2007-03-26 22:58:21 +0000
committervda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2007-03-26 22:58:21 +0000
commit35b8d51c2ec7714ce4a43f53bdd8f66d9b6faa05 (patch)
treec90f6a907087a587d4a72366164233eb7d5a8e3a
parent839a580583d0b255b6b1a9bbb7a75fe836a81366 (diff)
downloadbusybox-w32-35b8d51c2ec7714ce4a43f53bdd8f66d9b6faa05.tar.gz
busybox-w32-35b8d51c2ec7714ce4a43f53bdd8f66d9b6faa05.tar.bz2
busybox-w32-35b8d51c2ec7714ce4a43f53bdd8f66d9b6faa05.zip
diff: fix SEGV (NULL deref) in diff -N
git-svn-id: svn://busybox.net/trunk/busybox@18252 69ca8d6d-28ef-0310-b511-8ec308f3f277
-rw-r--r--coreutils/diff.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/coreutils/diff.c b/coreutils/diff.c
index fa6ef105e..911bfcf4d 100644
--- a/coreutils/diff.c
+++ b/coreutils/diff.c
@@ -997,24 +997,30 @@ static void do_diff(char *dir1, char *path1, char *dir2, char *path2)
997{ 997{
998 int flags = D_HEADER; 998 int flags = D_HEADER;
999 int val; 999 int val;
1000 char *fullpath1 = NULL; /* if -N */
1001 char *fullpath2 = NULL;
1000 1002
1001 char *fullpath1 = concat_path_file(dir1, path1); 1003 if (path1)
1002 char *fullpath2 = concat_path_file(dir2, path2); 1004 fullpath1 = concat_path_file(dir1, path1);
1005 if (path2)
1006 fullpath2 = concat_path_file(dir2, path2);
1003 1007
1004 if (stat(fullpath1, &stb1) != 0) { 1008 if (!fullpath1 || stat(fullpath1, &stb1) != 0) {
1005 flags |= D_EMPTY1; 1009 flags |= D_EMPTY1;
1006 memset(&stb1, 0, sizeof(stb1)); 1010 memset(&stb1, 0, sizeof(stb1));
1007 if (ENABLE_FEATURE_CLEAN_UP) 1011 if (path2) {
1008 free(fullpath1); 1012 free(fullpath1);
1009 fullpath1 = concat_path_file(dir1, path2); 1013 fullpath1 = concat_path_file(dir1, path2);
1014 }
1010 } 1015 }
1011 if (stat(fullpath2, &stb2) != 0) { 1016 if (!fullpath2 || stat(fullpath2, &stb2) != 0) {
1012 flags |= D_EMPTY2; 1017 flags |= D_EMPTY2;
1013 memset(&stb2, 0, sizeof(stb2)); 1018 memset(&stb2, 0, sizeof(stb2));
1014 stb2.st_mode = stb1.st_mode; 1019 stb2.st_mode = stb1.st_mode;
1015 if (ENABLE_FEATURE_CLEAN_UP) 1020 if (path1) {
1016 free(fullpath2); 1021 free(fullpath2);
1017 fullpath2 = concat_path_file(dir2, path1); 1022 fullpath2 = concat_path_file(dir2, path1);
1023 }
1018 } 1024 }
1019 1025
1020 if (stb1.st_mode == 0) 1026 if (stb1.st_mode == 0)
@@ -1022,7 +1028,7 @@ static void do_diff(char *dir1, char *path1, char *dir2, char *path2)
1022 1028
1023 if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) { 1029 if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) {
1024 printf("Common subdirectories: %s and %s\n", fullpath1, fullpath2); 1030 printf("Common subdirectories: %s and %s\n", fullpath1, fullpath2);
1025 return; 1031 goto ret;
1026 } 1032 }
1027 1033
1028 if (!S_ISREG(stb1.st_mode) && !S_ISDIR(stb1.st_mode)) 1034 if (!S_ISREG(stb1.st_mode) && !S_ISDIR(stb1.st_mode))
@@ -1033,6 +1039,9 @@ static void do_diff(char *dir1, char *path1, char *dir2, char *path2)
1033 val = diffreg(fullpath1, fullpath2, flags); 1039 val = diffreg(fullpath1, fullpath2, flags);
1034 1040
1035 print_status(val, fullpath1, fullpath2, NULL); 1041 print_status(val, fullpath1, fullpath2, NULL);
1042 ret:
1043 free(fullpath1);
1044 free(fullpath2);
1036} 1045}
1037#endif 1046#endif
1038 1047