Remove another PATH_MAX.
authorJeremy Allison <jra@samba.org>
Wed, 1 Jun 2011 23:40:05 +0000 (16:40 -0700)
committerJeremy Allison <jra@samba.org>
Thu, 2 Jun 2011 00:51:06 +0000 (02:51 +0200)
Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Thu Jun  2 02:51:06 CEST 2011 on sn-devel-104

source3/libads/kerberos.c

index 0b62ebf4e4b7f305c20f79468890eb8d93966260..48a832e1a902c5cd9967a9576d846f9296b1ac8e 100644 (file)
@@ -958,22 +958,37 @@ bool create_local_private_krb5_conf_for_domain(const char *realm,
        /* Insanity, sheer insanity..... */
 
        if (strequal(realm, lp_realm())) {
-               char linkpath[PATH_MAX+1];
-               int lret;
-
-               lret = readlink(SYSTEM_KRB5_CONF_PATH, linkpath, sizeof(linkpath)-1);
-               if (lret != -1) {
-                       linkpath[lret] = '\0';
-               }
-
-               if (lret != -1 || strcmp(linkpath, fname) == 0) {
-                       /* Symlink already exists. */
-                       goto done;
+               SMB_STRUCT_STAT sbuf;
+
+               if (sys_lstat(SYSTEM_KRB5_CONF_PATH, &sbuf, false) == 0) {
+                       if (S_ISLNK(sbuf.st_ex_mode) && sbuf.st_ex_size) {
+                               int lret;
+                               size_t alloc_size = sbuf.st_ex_size + 1;
+                               char *linkpath = TALLOC_ARRAY(talloc_tos(), char,
+                                               alloc_size);
+                               if (!linkpath) {
+                                       goto done;
+                               }
+                               lret = readlink(SYSTEM_KRB5_CONF_PATH, linkpath,
+                                               alloc_size - 1);
+                               if (lret == -1) {
+                                       TALLOC_FREE(linkpath);
+                                       goto done;
+                               }
+                               linkpath[lret] = '\0';
+
+                               if (strcmp(linkpath, fname) == 0) {
+                                       /* Symlink already exists. */
+                                       TALLOC_FREE(linkpath);
+                                       goto done;
+                               }
+                               TALLOC_FREE(linkpath);
+                       }
                }
 
                /* Try and replace with a symlink. */
                if (symlink(fname, SYSTEM_KRB5_CONF_PATH) == -1) {
-                       const char *newpath = SYSTEM_KRB5_CONF_PATH ## ".saved";
+                       const char *newpath = SYSTEM_KRB5_CONF_PATH ".saved";
                        if (errno != EEXIST) {
                                DEBUG(0,("create_local_private_krb5_conf_for_domain: symlink "
                                        "of %s to %s failed. Errno %s\n",