Import upstream version 1.29
[debian/tar] / src / compare.c
index d29cfdd4822f683dec5c7dfb8dc01544c62330ce..3f91279bde0930c451296560452c28de9eb7850c 100644 (file)
@@ -1,7 +1,7 @@
 /* Diff files from a tar archive.
 
    Copyright 1988, 1992-1994, 1996-1997, 1999-2001, 2003-2007,
-   2009-2010, 2012-2014 Free Software Foundation, Inc.
+   2009-2010, 2012-2014, 2016 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 (&current_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 (&current_stat_info, _("Symlink differs"));
+
+  if (linkbuf != buf)
+    free (linkbuf);
 }
 #endif