diff: fix SEGV (NULL deref) in diff -N
This commit is contained in:
parent
17a1526f9e
commit
3983bd5593
@ -997,24 +997,30 @@ 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)
|
||||||
@ -1022,7 +1028,7 @@ static void do_diff(char *dir1, char *path1, char *dir2, char *path2)
|
|||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user