diff --git a/src/ftp.c b/src/ftp.c
index 73d3cb1d..d8d36d0f 100644
--- a/src/ftp.c
+++ b/src/ftp.c
@@ -2335,10 +2335,22 @@ The sizes do not match (local %s) -- retrieving.\n\n"),
                       size_t len = strlen (f->linkto) + 1;
                       if (S_ISLNK (st.st_mode))
                         {
-                          char *link_target = (char *)alloca (len);
-                          size_t n = readlink (con->target, link_target, len);
-                          if ((n == len - 1)
-                              && (memcmp (link_target, f->linkto, n) == 0))
+                          char buf[1024], *link_target;
+                          size_t n;
+                          bool res;
+
+                          if (len < sizeof (buf))
+                            link_target = buf;
+                          else
+                            link_target = xmalloc (len);
+
+                          n = readlink (con->target, link_target, len);
+                          res = (n == len - 1) && (memcmp (link_target, f->linkto, n) == 0);
+
+                          if (link_target != buf)
+                            xfree (link_target);
+
+                          if (res)
                             {
                               logprintf (LOG_VERBOSE, _("\
 Already have correct symlink %s -> %s\n\n"),