X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcompare.c;h=7ed455848791cd40433dd52aea4b17155e970b3b;hb=3828942550fba1f88136ffbc018a72bdeb930902;hp=407fd4016952a7eed858092f19f257c5e82d50fc;hpb=cd7bdd4076ca154575bbef85eb2157e59befcfe2;p=chaz%2Ftar diff --git a/src/compare.c b/src/compare.c index 407fd40..7ed4558 100644 --- a/src/compare.c +++ b/src/compare.c @@ -1,7 +1,7 @@ /* Diff files from a tar archive. Copyright 1988, 1992-1994, 1996-1997, 1999-2001, 2003-2007, - 2009-2010, 2012-2013 Free Software Foundation, Inc. + 2009-2010, 2012-2014 Free Software Foundation, Inc. This file is part of GNU tar. @@ -270,11 +270,12 @@ diff_link (void) static void diff_symlink (void) { + char buf[1024]; size_t len = strlen (current_stat_info.link_name); - char *linkbuf = alloca (len + 1); + char *linkbuf = len < sizeof buf ? buf : xmalloc (len + 1); - int status = readlinkat (chdir_fd, current_stat_info.file_name, - linkbuf, len + 1); + ssize_t status = readlinkat (chdir_fd, current_stat_info.file_name, + linkbuf, len + 1); if (status < 0) { @@ -285,8 +286,11 @@ diff_symlink (void) report_difference (¤t_stat_info, NULL); } else if (status != len - || strncmp (current_stat_info.link_name, linkbuf, len) != 0) + || memcmp (current_stat_info.link_name, linkbuf, len) != 0) report_difference (¤t_stat_info, _("Symlink differs")); + + if (linkbuf != buf) + free (linkbuf); } #endif @@ -371,7 +375,10 @@ diff_dumpdir (struct tar_stat_info *dir) if (fd < 0) diag = open_diag; else if (fstat (fd, &dir->stat)) - diag = stat_diag; + { + diag = stat_diag; + close (fd); + } else dir->fd = fd; if (diag) @@ -439,10 +446,9 @@ diff_multivol (void) { seek_error_details (current_stat_info.file_name, offset); report_difference (¤t_stat_info, NULL); - return; } - - read_and_process (¤t_stat_info, process_rawdata); + else + read_and_process (¤t_stat_info, process_rawdata); status = close (fd); if (status != 0)