prime_env_iter and zero-length values on VMS
Craig A. Berry [Thu, 8 Jul 2004 23:19:05 +0000 (18:19 -0500)]
From: "Craig A. Berry" <craigberry@mac.com>
Message-ID: <40EE1CB9.8030407@mac.com>

p4raw-id: //depot/perl@23071

vms/vms.c

index 03f2fbd..1b04dbe 100644 (file)
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -665,7 +665,21 @@ prime_env_iter(void)
         continue;
       }
       PERL_HASH(hash,key,keylen);
-      sv = newSVpvn(cp2,cp1 - cp2 + 1);
+
+      if (cp1 == cp2 && *cp2 == '.') {
+        /* A single dot usually means an unprintable character, such as a null
+         * to indicate a zero-length value.  Get the actual value to make sure.
+         */
+        char lnm[LNM$C_NAMLENGTH+1];
+        char eqv[LNM$C_NAMLENGTH+1];
+        strncpy(lnm, key, keylen);
+        int trnlen = vmstrnenv(lnm, eqv, 0, fildev, 0);
+        sv = newSVpvn(eqv, strlen(eqv));
+      }
+      else {
+        sv = newSVpvn(cp2,cp1 - cp2 + 1);
+      }
+
       SvTAINTED_on(sv);
       hv_store(envhv,key,keylen,sv,hash);
       hv_store(seenhv,key,keylen,&PL_sv_yes,hash);