diff: fix SEGV (NULL deref) in diff -N

This commit is contained in:
Denis Vlasenko 2007-03-26 22:58:21 +00:00
parent 17a1526f9e
commit 3983bd5593

View File

@ -997,32 +997,38 @@ static void do_diff(char *dir1, char *path1, char *dir2, char *path2)
{ {
int flags = D_HEADER; int flags = D_HEADER;
int val; int val;
char *fullpath1 = NULL; /* if -N */
char *fullpath2 = NULL;
char *fullpath1 = concat_path_file(dir1, path1); if (path1)
char *fullpath2 = concat_path_file(dir2, path2); fullpath1 = concat_path_file(dir1, path1);
if (path2)
fullpath2 = concat_path_file(dir2, path2);
if (stat(fullpath1, &stb1) != 0) { if (!fullpath1 || stat(fullpath1, &stb1) != 0) {
flags |= D_EMPTY1; flags |= D_EMPTY1;
memset(&stb1, 0, sizeof(stb1)); memset(&stb1, 0, sizeof(stb1));
if (ENABLE_FEATURE_CLEAN_UP) if (path2) {
free(fullpath1); free(fullpath1);
fullpath1 = concat_path_file(dir1, path2); fullpath1 = concat_path_file(dir1, path2);
} }
if (stat(fullpath2, &stb2) != 0) { }
if (!fullpath2 || stat(fullpath2, &stb2) != 0) {
flags |= D_EMPTY2; flags |= D_EMPTY2;
memset(&stb2, 0, sizeof(stb2)); memset(&stb2, 0, sizeof(stb2));
stb2.st_mode = stb1.st_mode; stb2.st_mode = stb1.st_mode;
if (ENABLE_FEATURE_CLEAN_UP) if (path1) {
free(fullpath2); free(fullpath2);
fullpath2 = concat_path_file(dir2, path1); fullpath2 = concat_path_file(dir2, path1);
} }
}
if (stb1.st_mode == 0) if (stb1.st_mode == 0)
stb1.st_mode = stb2.st_mode; stb1.st_mode = stb2.st_mode;
if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) { if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) {
printf("Common subdirectories: %s and %s\n", fullpath1, fullpath2); printf("Common subdirectories: %s and %s\n", fullpath1, fullpath2);
return; goto ret;
} }
if (!S_ISREG(stb1.st_mode) && !S_ISDIR(stb1.st_mode)) 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)
val = diffreg(fullpath1, fullpath2, flags); val = diffreg(fullpath1, fullpath2, flags);
print_status(val, fullpath1, fullpath2, NULL); print_status(val, fullpath1, fullpath2, NULL);
ret:
free(fullpath1);
free(fullpath2);
} }
#endif #endif