Tease apart the keyword/subroutine test in S_checkcomma.
[p5sagit/p5-mst-13.2.git] / vms / vms.c
index ebfb2f9..82169ad 100644 (file)
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -331,7 +331,10 @@ int scnt;
            count++;
            scnt = strspn(inspec, "0123456789ABCDEFabcdef");
            if (scnt == 4) {
-               scnt = sscanf(inspec, "%2x%2x", outspec, &outspec[1]);
+               unsigned int c1, c2;
+               scnt = sscanf(inspec, "%2x%2x", &c1, &c2);
+               outspec[0] == c1 & 0xff;
+               outspec[1] == c2 & 0xff;
                if (scnt > 1) {
                    (*output_cnt) += 2;
                    count += 4;
@@ -351,7 +354,9 @@ int scnt;
            scnt = strspn(inspec, "0123456789ABCDEFabcdef");
            if (scnt == 2) {
                /* Hex encoded */
-               scnt = sscanf(inspec, "%2x", outspec);
+               unsigned int c1;
+               scnt = sscanf(inspec, "%2x", &c1);
+               outspec[0] = c1 & 0xff;
                if (scnt > 0) {
                    (*output_cnt++);
                    count += 2;
@@ -390,7 +395,7 @@ int SYS$FILESCAN
  * path.
  */
 static int vms_split_path
-   (const char * path,
+   (pTHX_ const char * path,
     char * * volume,
     int * vol_len,
     char * * root,
@@ -1512,9 +1517,11 @@ mp_do_kill_file(pTHX_ const char *name, int dirflag)
     /* Expand the input spec using RMS, since the CRTL remove() and
      * system services won't do this by themselves, so we may miss
      * a file "hiding" behind a logical name or search list. */
-    Newx(vmsname, NAM$C_MAXRSS+1, char);
-    if (do_tovmsspec(name,vmsname,0) == NULL) {
-      Safefree(vmsname);
+    vmsname = PerlMem_malloc(NAM$C_MAXRSS+1);
+    if (vmsname == NULL) _ckvmssts(SS$_INSFMEM);
+
+    if (do_rmsexpand(name, vmsname, 0, NULL, PERL_RMSEXPAND_M_VMS) == NULL) {
+      PerlMem_free(vmsname);
       return -1;
     }
 
@@ -1524,31 +1531,34 @@ mp_do_kill_file(pTHX_ const char *name, int dirflag)
       remove_name = (char *)name;
     }
     else {
-      Newx(rspec, NAM$C_MAXRSS+1, char);
-      if (do_rmsexpand(vmsname, rspec, 1, NULL, PERL_RMSEXPAND_M_VMS) == NULL) {
-       Safefree(rspec);
-        Safefree(vmsname);
+      rspec = PerlMem_malloc(NAM$C_MAXRSS+1);
+      if (rspec == NULL) _ckvmssts(SS$_INSFMEM);
+      if (do_rmsexpand(vmsname, rspec, 0, NULL, PERL_RMSEXPAND_M_VMS) == NULL) {
+       PerlMem_free(rspec);
+        PerlMem_free(vmsname);
        return -1;
       }
-      Safefree(vmsname);
+      PerlMem_free(vmsname);
       remove_name = rspec;
     }
 
 #if defined(__CRTL_VER) && __CRTL_VER >= 70000000
     if (dirflag != 0) {
        if (decc_dir_barename && decc_posix_compliant_pathnames) {
-         Newx(remove_name, NAM$C_MAXRSS+1, char);
+         remove_name = PerlMem_malloc(NAM$C_MAXRSS+1);
+         if (remove_name == NULL) _ckvmssts(SS$_INSFMEM);
+
          do_pathify_dirspec(name, remove_name, 0);
          if (!rmdir(remove_name)) {
 
-           Safefree(remove_name);
-           Safefree(rspec);
+           PerlMem_free(remove_name);
+           PerlMem_free(rspec);
            return 0;   /* Can we just get rid of it? */
          }
        }
         else {
          if (!rmdir(remove_name)) {
-           Safefree(rspec);
+           PerlMem_free(rspec);
            return 0;   /* Can we just get rid of it? */
          }
        }
@@ -1556,13 +1566,13 @@ mp_do_kill_file(pTHX_ const char *name, int dirflag)
     else
 #endif
       if (!remove(remove_name)) {
-       Safefree(rspec);
+       PerlMem_free(rspec);
        return 0;   /* Can we just get rid of it? */
       }
 
     /* If not, can changing protections help? */
     if (vaxc$errno != RMS$_PRV) {
-      Safefree(rspec);
+      PerlMem_free(rspec);
       return -1;
     }
 
@@ -1591,7 +1601,7 @@ mp_do_kill_file(pTHX_ const char *name, int dirflag)
           _ckvmssts(aclsts);
       }
       set_vaxc_errno(aclsts);
-      Safefree(rspec);
+      PerlMem_free(rspec);
       return -1;
     }
     /* Grab any existing ACEs with this identifier in case we fail */
@@ -1605,10 +1615,12 @@ mp_do_kill_file(pTHX_ const char *name, int dirflag)
 #if defined(__CRTL_VER) && __CRTL_VER >= 70000000
       if (dirflag != 0)
        if (decc_dir_barename && decc_posix_compliant_pathnames) {
-         Newx(remove_name, NAM$C_MAXRSS+1, char);
+         remove_name = PerlMem_malloc(NAM$C_MAXRSS+1);
+         if (remove_name == NULL) _ckvmssts(SS$_INSFMEM);
+
          do_pathify_dirspec(name, remove_name, 0);
          rmsts = rmdir(remove_name);
-         Safefree(remove_name);
+         PerlMem_free(remove_name);
        }
        else {
        rmsts = rmdir(remove_name);
@@ -1640,11 +1652,11 @@ mp_do_kill_file(pTHX_ const char *name, int dirflag)
     if (!(aclsts & 1)) {
       set_errno(EVMSERR);
       set_vaxc_errno(aclsts);
-      Safefree(rspec);
+      PerlMem_free(rspec);
       return -1;
     }
 
-    Safefree(rspec);
+    PerlMem_free(rspec);
     return rmsts;
 
 }  /* end of kill_file() */
@@ -1679,7 +1691,8 @@ Perl_do_rmdir(pTHX_ const char *name)
 int
 Perl_kill_file(pTHX_ const char *name)
 {
-    char vmsname[NAM$C_MAXRSS+1], rspec[NAM$C_MAXRSS+1];
+    char rspec[NAM$C_MAXRSS+1];
+    char *tspec;
     unsigned long int jpicode = JPI$_UIC, type = ACL$C_FILE;
     unsigned long int cxt = 0, aclsts, fndsts, rmsts = -1;
     struct dsc$descriptor_s fildsc = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
@@ -1703,8 +1716,8 @@ Perl_kill_file(pTHX_ const char *name)
     /* Expand the input spec using RMS, since the CRTL remove() and
      * system services won't do this by themselves, so we may miss
      * a file "hiding" behind a logical name or search list. */
-    if (do_tovmsspec(name,vmsname,0) == NULL) return -1;
-    if (do_rmsexpand(vmsname,rspec,1,NULL,0) == NULL) return -1;
+    tspec = do_rmsexpand(name, rspec, 0, NULL, PERL_RMSEXPAND_M_VMS);
+    if (tspec == NULL) return -1;
     if (!remove(rspec)) return 0;   /* Can we just get rid of it? */
     /* If not, can changing protections help? */
     if (vaxc$errno != RMS$_PRV) return -1;
@@ -1846,7 +1859,9 @@ my_tmpfile(void)
 
   if ((fp = tmpfile())) return fp;
 
-  Newx(cp,L_tmpnam+24,char);
+  cp = PerlMem_malloc(L_tmpnam+24);
+  if (cp == NULL) _ckvmssts_noperl(SS$_INSFMEM);
+
   if (decc_filename_unix_only == 0)
     strcpy(cp,"Sys$Scratch:");
   else
@@ -1854,7 +1869,7 @@ my_tmpfile(void)
   tmpnam(cp+strlen(cp));
   strcat(cp,".Perltmp");
   fp = fopen(cp,"w+","fop=dlt");
-  Safefree(cp);
+  PerlMem_free(cp);
   return fp;
 }
 /*}}}*/
@@ -3196,12 +3211,16 @@ store_pipelocs(pTHX)
 /*  the . directory from @INC comes last */
 
     p = (pPLOC) PerlMem_malloc(sizeof(PLOC));
+    if (p == NULL) _ckvmssts(SS$_INSFMEM);
     p->next = head_PLOC;
     head_PLOC = p;
     strcpy(p->dir,"./");
 
 /*  get the directory from $^X */
 
+    unixdir = PerlMem_malloc(VMS_MAXRSS);
+    if (unixdir == NULL) _ckvmssts(SS$_INSFMEM);
+
 #ifdef PERL_IMPLICIT_CONTEXT
     if (aTHX && PL_origargv && PL_origargv[0]) {    /* maybe nul if embedded Perl */
 #else
@@ -3224,13 +3243,14 @@ store_pipelocs(pTHX)
          temp[1] = '\0';
        }
 
-        if ((unixdir = tounixpath(temp, Nullch)) != Nullch) {
+        if ((tounixpath(temp, unixdir)) != Nullch) {
             p = (pPLOC) PerlMem_malloc(sizeof(PLOC));
+           if (p == NULL) _ckvmssts(SS$_INSFMEM);
             p->next = head_PLOC;
             head_PLOC = p;
             strncpy(p->dir,unixdir,sizeof(p->dir)-1);
             p->dir[NAM$C_MAXRSS] = '\0';
-        }
+       }
     }
 
 /*  reverse order of @INC entries, skip "." since entered above */
@@ -3246,7 +3266,7 @@ store_pipelocs(pTHX)
         if (SvROK(dirsv)) continue;
         dir = SvPVx(dirsv,n_a);
         if (strcmp(dir,".") == 0) continue;
-        if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
+        if ((tounixpath(dir, unixdir)) == Nullch)
             continue;
 
         p = (pPLOC) PerlMem_malloc(sizeof(PLOC));
@@ -3259,14 +3279,16 @@ store_pipelocs(pTHX)
 /* most likely spot (ARCHLIB) put first in the list */
 
 #ifdef ARCHLIB_EXP
-    if ((unixdir = tounixpath(ARCHLIB_EXP, Nullch)) != Nullch) {
+    if ((tounixpath(ARCHLIB_EXP, unixdir)) != Nullch) {
         p = (pPLOC) PerlMem_malloc(sizeof(PLOC));
+       if (p == NULL) _ckvmssts(SS$_INSFMEM);
         p->next = head_PLOC;
         head_PLOC = p;
         strncpy(p->dir,unixdir,sizeof(p->dir)-1);
         p->dir[NAM$C_MAXRSS] = '\0';
     }
 #endif
+    PerlMem_free(unixdir);
 }
 
 
@@ -3293,12 +3315,15 @@ find_vmspipe(pTHX)
         pPLOC  p = head_PLOC;
 
         while (p) {
+           char * exp_res;
             strcpy(file, p->dir);
             strncat(file, "vmspipe.com",NAM$C_MAXRSS);
             file[NAM$C_MAXRSS] = '\0';
             p = p->next;
 
-            if (!do_tovmsspec(file,vmspipe_file,0)) continue;
+            exp_res = do_rmsexpand
+               (file, vmspipe_file, 0, NULL, PERL_RMSEXPAND_M_VMS);
+            if (!exp_res) continue;
 
             if (cando_by_name(S_IRUSR, 0, vmspipe_file)
              && cando_by_name(S_IXUSR, 0, vmspipe_file)) {
@@ -4326,6 +4351,7 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
   static char __rmsexpand_retbuf[NAML$C_MAXRSS+1];
   char * vmsfspec, *tmpfspec;
   char * esa, *cp, *out = NULL;
+  char * tbuf;
   char * esal;
   char * outbufl;
   struct FAB myfab = cc$rms_fab;
@@ -4348,9 +4374,10 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
   outbufl = NULL;
   isunix = is_unix_filespec(filespec);
   if (isunix) {
-    Newx(vmsfspec, VMS_MAXRSS, char);
+    vmsfspec = PerlMem_malloc(VMS_MAXRSS);
+    if (vmsfspec == NULL) _ckvmssts(SS$_INSFMEM);
     if (do_tovmsspec(filespec,vmsfspec,0) == NULL) {
-       Safefree(vmsfspec);
+       PerlMem_free(vmsfspec);
        if (out)
           Safefree(out);
        return NULL;
@@ -4374,11 +4401,12 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
     int t_isunix;
     t_isunix = is_unix_filespec(defspec);
     if (t_isunix) {
-      Newx(tmpfspec, VMS_MAXRSS, char);
+      tmpfspec = PerlMem_malloc(VMS_MAXRSS);
+      if (tmpfspec == NULL) _ckvmssts(SS$_INSFMEM);
       if (do_tovmsspec(defspec,tmpfspec,0) == NULL) {
-       Safefree(tmpfspec);
+       PerlMem_free(tmpfspec);
        if (vmsfspec != NULL)
-           Safefree(vmsfspec);
+           PerlMem_free(vmsfspec);
        if (out)
           Safefree(out);
        return NULL;
@@ -4388,9 +4416,11 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
     rms_set_dna(myfab, mynam, (char *)defspec, strlen(defspec)); /* cast ok */
   }
 
-  Newx(esa, NAM$C_MAXRSS + 1, char);
+  esa = PerlMem_malloc(NAM$C_MAXRSS + 1);
+  if (esa == NULL) _ckvmssts(SS$_INSFMEM);
 #if !defined(__VAX) && defined(NAML$C_MAXRSS)
-  Newx(esal, NAML$C_MAXRSS + 1, char);
+  esal = PerlMem_malloc(NAML$C_MAXRSS + 1);
+  if (esal == NULL) _ckvmssts(SS$_INSFMEM);
 #endif
   rms_set_esal(mynam, esa, NAM$C_MAXRSS, esal, NAML$C_MAXRSS);
 
@@ -4399,7 +4429,8 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
   }
   else {
 #if !defined(__VAX) && defined(NAML$C_MAXRSS)
-    Newx(outbufl, VMS_MAXRSS, char);
+    outbufl = PerlMem_malloc(VMS_MAXRSS);
+    if (outbufl == NULL) _ckvmssts(SS$_INSFMEM);
     rms_set_rsal(mynam, outbuf, NAM$C_MAXRSS, outbufl, (VMS_MAXRSS - 1));
 #else
     rms_set_rsa(mynam, outbuf, NAM$C_MAXRSS);
@@ -4427,11 +4458,13 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
     sts = rms_free_search_context(&myfab); /* Free search context */
     if (out) Safefree(out);
     if (tmpfspec != NULL)
-       Safefree(tmpfspec);
+       PerlMem_free(tmpfspec);
     if (vmsfspec != NULL)
-       Safefree(vmsfspec);
-    Safefree(esa);
-    Safefree(esal);
+       PerlMem_free(vmsfspec);
+    if (outbufl != NULL)
+       PerlMem_free(outbufl);
+    PerlMem_free(esa);
+    PerlMem_free(esal);
     set_vaxc_errno(retsts);
     if      (retsts == RMS$_PRV) set_errno(EACCES);
     else if (retsts == RMS$_DEV) set_errno(ENODEV);
@@ -4444,11 +4477,13 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
     sts = rms_free_search_context(&myfab); /* Free search context */
     if (out) Safefree(out);
     if (tmpfspec != NULL)
-       Safefree(tmpfspec);
+       PerlMem_free(tmpfspec);
     if (vmsfspec != NULL)
-       Safefree(vmsfspec);
-    Safefree(esa);
-    Safefree(esal);
+       PerlMem_free(vmsfspec);
+    if (outbufl != NULL)
+       PerlMem_free(outbufl);
+    PerlMem_free(esa);
+    PerlMem_free(esal);
     set_vaxc_errno(retsts);
     if      (retsts == RMS$_PRV) set_errno(EACCES);
     else                         set_errno(EVMSERR);
@@ -4459,29 +4494,29 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
    * downcase the result for compatibility with Unix-minded code. */
   expanded:
   if (!decc_efs_case_preserve) {
-    for (out = rms_get_fna(myfab, mynam); *out; out++)
-      if (islower(*out)) { haslower = 1; break; }
+    for (tbuf = rms_get_fna(myfab, mynam); *tbuf; tbuf++)
+      if (islower(*tbuf)) { haslower = 1; break; }
   }
 
    /* Is a long or a short name expected */
   /*------------------------------------*/
   if ((opts & PERL_RMSEXPAND_M_LONG) != 0) {
     if (rms_nam_rsll(mynam)) {
-       out = outbuf;
+       tbuf = outbuf;
        speclen = rms_nam_rsll(mynam);
     }
     else {
-       out = esal; /* Not esa */
+       tbuf = esal; /* Not esa */
        speclen = rms_nam_esll(mynam);
     }
   }
   else {
     if (rms_nam_rsl(mynam)) {
-       out = outbuf;
+       tbuf = outbuf;
        speclen = rms_nam_rsl(mynam);
     }
     else {
-       out = esa; /* Not esal */
+       tbuf = esa; /* Not esal */
        speclen = rms_nam_esl(mynam);
     }
   }
@@ -4501,7 +4536,7 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
   if (trimver || trimtype) {
     if (defspec && *defspec) {
       char *defesal = NULL;
-      Newx(defesal, NAML$C_MAXRSS + 1, char);
+      defesal = PerlMem_malloc(NAML$C_MAXRSS + 1);
       if (defesal != NULL) {
        struct FAB deffab = cc$rms_fab;
        rms_setup_nam(defnam);
@@ -4528,35 +4563,35 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
            trimtype = !rms_is_nam_fnb(defnam, NAM$M_EXP_TYPE); 
          }
        }
-       Safefree(defesal);
+       PerlMem_free(defesal);
       }
     }
     if (trimver) {
       if ((opts & PERL_RMSEXPAND_M_LONG) != 0) {
        if (*(rms_nam_verl(mynam)) != '\"')
-         speclen = rms_nam_verl(mynam) - out;
+         speclen = rms_nam_verl(mynam) - tbuf;
       }
       else {
        if (*(rms_nam_ver(mynam)) != '\"')
-         speclen = rms_nam_ver(mynam) - out;
+         speclen = rms_nam_ver(mynam) - tbuf;
       }
     }
     if (trimtype) {
       /* If we didn't already trim version, copy down */
       if ((opts & PERL_RMSEXPAND_M_LONG) != 0) {
-       if (speclen > rms_nam_verl(mynam) - out)
+       if (speclen > rms_nam_verl(mynam) - tbuf)
          memmove
           (rms_nam_typel(mynam),
            rms_nam_verl(mynam),
-           speclen - (rms_nam_verl(mynam) - out));
+           speclen - (rms_nam_verl(mynam) - tbuf));
          speclen -= rms_nam_verl(mynam) - rms_nam_typel(mynam);
       }
       else {
-       if (speclen > rms_nam_ver(mynam) - out)
+       if (speclen > rms_nam_ver(mynam) - tbuf)
          memmove
           (rms_nam_type(mynam),
            rms_nam_ver(mynam),
-           speclen - (rms_nam_ver(mynam) - out));
+           speclen - (rms_nam_ver(mynam) - tbuf));
          speclen -= rms_nam_ver(mynam) - rms_nam_type(mynam);
       }
     }
@@ -4565,9 +4600,9 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
    /* Done with these copies of the input files */
   /*-------------------------------------------*/
   if (vmsfspec != NULL)
-       Safefree(vmsfspec);
+       PerlMem_free(vmsfspec);
   if (tmpfspec != NULL)
-       Safefree(tmpfspec);
+       PerlMem_free(tmpfspec);
 
   /* If we just had a directory spec on input, $PARSE "helpfully"
    * adds an empty name and type for us */
@@ -4575,24 +4610,24 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
     if (rms_nam_namel(mynam) == rms_nam_typel(mynam) &&
        rms_nam_verl(mynam)  == rms_nam_typel(mynam) + 1 &&
        !(rms_is_nam_fnb(mynam, NAM$M_EXP_NAME)))
-      speclen = rms_nam_namel(mynam) - out;
+      speclen = rms_nam_namel(mynam) - tbuf;
   }
   else {
     if (rms_nam_name(mynam) == rms_nam_type(mynam) &&
        rms_nam_ver(mynam)  == rms_nam_ver(mynam) + 1 &&
        !(rms_is_nam_fnb(mynam, NAM$M_EXP_NAME)))
-      speclen = rms_nam_name(mynam) - out;
+      speclen = rms_nam_name(mynam) - tbuf;
   }
 
   /* Posix format specifications must have matching quotes */
-  if (decc_posix_compliant_pathnames && (out[0] == '\"')) {
-    if ((speclen > 1) && (out[speclen-1] != '\"')) {
-      out[speclen] = '\"';
+  if (decc_posix_compliant_pathnames && (tbuf[0] == '\"')) {
+    if ((speclen > 1) && (tbuf[speclen-1] != '\"')) {
+      tbuf[speclen] = '\"';
       speclen++;
     }
   }
-  out[speclen] = '\0';
-  if (haslower && !decc_efs_case_preserve) __mystrtolower(out);
+  tbuf[speclen] = '\0';
+  if (haslower && !decc_efs_case_preserve) __mystrtolower(tbuf);
 
   /* Have we been working with an expanded, but not resultant, spec? */
   /* Also, convert back to Unix syntax if necessary. */
@@ -4600,29 +4635,38 @@ mp_do_rmsexpand(pTHX_ const char *filespec, char *outbuf, int ts, const char *de
   if (!rms_nam_rsll(mynam)) {
     if (isunix) {
       if (do_tounixspec(esa,outbuf,0) == NULL) {
-       Safefree(esal);
-       Safefree(esa);
+       if (out) Safefree(out);
+       PerlMem_free(esal);
+       PerlMem_free(esa);
+       if (outbufl != NULL)
+           PerlMem_free(outbufl);
        return NULL;
       }
     }
     else strcpy(outbuf,esa);
   }
   else if (isunix) {
-    Newx(tmpfspec, VMS_MAXRSS, char);
+    tmpfspec = PerlMem_malloc(VMS_MAXRSS);
+    if (tmpfspec == NULL) _ckvmssts(SS$_INSFMEM);
     if (do_tounixspec(outbuf,tmpfspec,0) == NULL) {
-       Safefree(esa);
-       Safefree(esal);
-       Safefree(tmpfspec);
+       if (out) Safefree(out);
+       PerlMem_free(esa);
+       PerlMem_free(esal);
+       PerlMem_free(tmpfspec);
+       if (outbufl != NULL)
+           PerlMem_free(outbufl);
        return NULL;
     }
     strcpy(outbuf,tmpfspec);
-    Safefree(tmpfspec);
+    PerlMem_free(tmpfspec);
   }
 
   rms_set_rsal(mynam, NULL, 0, NULL, 0);
   sts = rms_free_search_context(&myfab); /* Free search context */
-  Safefree(esa);
-  Safefree(esal);
+  PerlMem_free(esa);
+  PerlMem_free(esal);
+  if (outbufl != NULL)
+     PerlMem_free(outbufl);
   return outbuf;
 }
 #endif
@@ -4695,7 +4739,8 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
       set_errno(ENAMETOOLONG); set_vaxc_errno(RMS$_SYN);
       return NULL;
     }
-    Newx(trndir, VMS_MAXRSS + 1, char);
+    trndir = PerlMem_malloc(VMS_MAXRSS + 1);
+    if (trndir == NULL) _ckvmssts(SS$_INSFMEM);
     if (!strpbrk(dir+1,"/]>:")  &&
        (!decc_posix_compliant_pathnames && decc_disable_posix_root)) {
       strcpy(trndir,*dir == '/' ? dir + 1: dir);
@@ -4750,19 +4795,20 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
       }
     }
 
-    Newx(vmsdir, VMS_MAXRSS + 1, char);
+    vmsdir = PerlMem_malloc(VMS_MAXRSS + 1);
+    if (vmsdir == NULL) _ckvmssts(SS$_INSFMEM);
     cp1 = strpbrk(trndir,"]:>");
     if (hasfilename || !cp1) { /* Unix-style path or filename */
       if (trndir[0] == '.') {
         if (trndir[1] == '\0' || (trndir[1] == '/' && trndir[2] == '\0')) {
-         Safefree(trndir);
-         Safefree(vmsdir);
+         PerlMem_free(trndir);
+         PerlMem_free(vmsdir);
           return do_fileify_dirspec("[]",buf,ts);
        }
         else if (trndir[1] == '.' &&
                (trndir[2] == '\0' || (trndir[2] == '/' && trndir[3] == '\0'))) {
-         Safefree(trndir);
-         Safefree(vmsdir);
+         PerlMem_free(trndir);
+         PerlMem_free(vmsdir);
           return do_fileify_dirspec("[-]",buf,ts);
        }
       }
@@ -4779,8 +4825,8 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
           if (*(cp1+2) == '/' || *(cp1+2) == '\0') {
            char * ret_chr;
             if (do_tovmsspec(trndir,vmsdir,0) == NULL) {
-               Safefree(trndir);
-               Safefree(vmsdir);
+               PerlMem_free(trndir);
+               PerlMem_free(vmsdir);
                return NULL;
            }
             if (strchr(vmsdir,'/') != NULL) {
@@ -4789,19 +4835,19 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
                * the time to check this here only so we avoid a recursion
                * loop; otherwise, gigo.
                */
-             Safefree(trndir);
-             Safefree(vmsdir);
+             PerlMem_free(trndir);
+             PerlMem_free(vmsdir);
               set_errno(EINVAL);  set_vaxc_errno(RMS$_SYN);
              return NULL;
             }
             if (do_fileify_dirspec(vmsdir,trndir,0) == NULL) {
-               Safefree(trndir);
-               Safefree(vmsdir);
+               PerlMem_free(trndir);
+               PerlMem_free(vmsdir);
                return NULL;
            }
            ret_chr = do_tounixspec(trndir,buf,ts);
-           Safefree(trndir);
-           Safefree(vmsdir);
+           PerlMem_free(trndir);
+           PerlMem_free(vmsdir);
             return ret_chr;
           }
           cp1++;
@@ -4821,18 +4867,18 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
 
         trndir[dirlen] = '/'; trndir[dirlen+1] = '\0';
         if (do_tovmsspec(trndir,vmsdir,0) == NULL) {
-           Safefree(trndir);
-           Safefree(vmsdir);
+           PerlMem_free(trndir);
+           PerlMem_free(vmsdir);
            return NULL;
        }
         if (do_fileify_dirspec(vmsdir,trndir,0) == NULL) {
-           Safefree(trndir);
-           Safefree(vmsdir);
+           PerlMem_free(trndir);
+           PerlMem_free(vmsdir);
            return NULL;
        }
        ret_chr = do_tounixspec(trndir,buf,ts);
-       Safefree(trndir);
-       Safefree(vmsdir);
+       PerlMem_free(trndir);
+       PerlMem_free(vmsdir);
         return ret_chr;
       }
       else {
@@ -4854,8 +4900,8 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
                   (*(cp2+4) && ((*(cp2+4) != ';' && *(cp2+4) != '.')  ||
                   (*(cp2+5) && ((ver = strtol(cp2+5,&cp3,10)) != 1 &&
                             (ver || *cp3)))))) {
-                 Safefree(trndir);
-                 Safefree(vmsdir);
+                 PerlMem_free(trndir);
+                 PerlMem_free(vmsdir);
                   set_errno(ENOTDIR);
                   set_vaxc_errno(RMS$_DIR);
                   return NULL;
@@ -4868,8 +4914,8 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
                   (*(cp2+4) && ((*(cp2+4) != ';' && *(cp2+4) != '.')  ||
                   (*(cp2+5) && ((ver = strtol(cp2+5,&cp3,10)) != 1 &&
                             (ver || *cp3)))))) {
-                Safefree(trndir);
-                Safefree(vmsdir);
+                PerlMem_free(trndir);
+                PerlMem_free(vmsdir);
                  set_errno(ENOTDIR);
                  set_vaxc_errno(RMS$_DIR);
                  return NULL;
@@ -4892,8 +4938,8 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
        strcat(retspec,".dir;1");
       else
        strcat(retspec,".DIR;1");
-      Safefree(trndir);
-      Safefree(vmsdir);
+      PerlMem_free(trndir);
+      PerlMem_free(vmsdir);
       return retspec;
     }
     else {  /* VMS-style directory spec */
@@ -4906,7 +4952,8 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
       rms_setup_nam(savnam);
       rms_setup_nam(dirnam);
 
-      Newx(esa, VMS_MAXRSS + 1, char);
+      esa = PerlMem_malloc(VMS_MAXRSS + 1);
+      if (esa == NULL) _ckvmssts(SS$_INSFMEM);
       rms_set_fna(dirfab, dirnam, trndir, strlen(trndir));
       rms_bind_fab_nam(dirfab, dirnam);
       rms_set_dna(dirfab, dirnam, ".DIR;1", 6);
@@ -4924,9 +4971,9 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
           sts = sys$parse(&dirfab) & STS$K_SUCCESS;
         }
         if (!sts) {
-         Safefree(esa);
-         Safefree(trndir);
-         Safefree(vmsdir);
+         PerlMem_free(esa);
+         PerlMem_free(trndir);
+         PerlMem_free(vmsdir);
           set_errno(EVMSERR);
           set_vaxc_errno(dirfab.fab$l_sts);
           return NULL;
@@ -4942,9 +4989,9 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
         else { /* No; just work with potential name */
           if (dirfab.fab$l_sts == RMS$_FNF) dirnam = savnam;
           else { 
-           Safefree(esa);
-           Safefree(trndir);
-           Safefree(vmsdir);
+           PerlMem_free(esa);
+           PerlMem_free(trndir);
+           PerlMem_free(vmsdir);
             set_errno(EVMSERR);  set_vaxc_errno(dirfab.fab$l_sts);
            sts = rms_free_search_context(&dirfab);
             return NULL;
@@ -4965,9 +5012,9 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
         if (strncmp(rms_nam_typel(dirnam), ".DIR;1", cmplen)) { 
           /* Something other than .DIR[;1].  Bzzt. */
          sts = rms_free_search_context(&dirfab);
-         Safefree(esa);
-         Safefree(trndir);
-         Safefree(vmsdir);
+         PerlMem_free(esa);
+         PerlMem_free(trndir);
+         PerlMem_free(vmsdir);
           set_errno(ENOTDIR);
           set_vaxc_errno(RMS$_DIR);
           return NULL;
@@ -4981,9 +5028,9 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
         else retspec = __fileify_retbuf;
         strcpy(retspec,esa);
        sts = rms_free_search_context(&dirfab);
-       Safefree(trndir);
-       Safefree(esa);
-       Safefree(vmsdir);
+       PerlMem_free(trndir);
+       PerlMem_free(esa);
+       PerlMem_free(vmsdir);
         return retspec;
       }
       if ((cp1 = strstr(esa,".][000000]")) != NULL) {
@@ -4994,9 +5041,9 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
       if ((cp1 = strrchr(esa,']')) == NULL) cp1 = strrchr(esa,'>');
       if (cp1 == NULL) { /* should never happen */
        sts = rms_free_search_context(&dirfab);
-       Safefree(trndir);
-       Safefree(esa);
-       Safefree(vmsdir);
+       PerlMem_free(trndir);
+       PerlMem_free(esa);
+       PerlMem_free(vmsdir);
         return NULL;
       }
       term = *cp1;
@@ -5035,9 +5082,9 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
 #endif
           if (!(sys$parse(&dirfab) & STS$K_SUCCESS)) {
            sts = rms_free_search_context(&dirfab);
-           Safefree(esa);
-           Safefree(trndir);
-           Safefree(vmsdir);
+           PerlMem_free(esa);
+           PerlMem_free(trndir);
+           PerlMem_free(vmsdir);
             set_errno(EVMSERR);
             set_vaxc_errno(dirfab.fab$l_sts);
             return NULL;
@@ -5110,9 +5157,9 @@ static char *mp_do_fileify_dirspec(pTHX_ const char *dir,char *buf,int ts)
       /* $PARSE may have upcased filespec, so convert output to lower
        * case if input contained any lowercase characters. */
       if (haslower && !decc_efs_case_preserve) __mystrtolower(retspec);
-      Safefree(trndir);
-      Safefree(esa);
-      Safefree(vmsdir);
+      PerlMem_free(trndir);
+      PerlMem_free(esa);
+      PerlMem_free(vmsdir);
       return retspec;
     }
 }  /* end of do_fileify_dirspec() */
@@ -5137,7 +5184,8 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
       set_errno(EINVAL); set_vaxc_errno(SS$_BADPARAM); return NULL;
     }
 
-    Newx(trndir, VMS_MAXRSS, char);
+    trndir = PerlMem_malloc(VMS_MAXRSS);
+    if (trndir == NULL) _ckvmssts(SS$_INSFMEM);
     if (*dir) strcpy(trndir,dir);
     else getcwd(trndir,VMS_MAXRSS - 1);
 
@@ -5155,7 +5203,7 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
         else retpath = __pathify_retbuf;
         strcpy(retpath,dir);
         strcat(retpath,":[000000]");
-       Safefree(trndir);
+       PerlMem_free(trndir);
         return retpath;
       }
     }
@@ -5190,7 +5238,7 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
                   (*(cp2+4) && ((*(cp2+4) != ';' && *(cp2+4) != '.')  ||
                   (*(cp2+5) && ((ver = strtol(cp2+5,&cp3,10)) != 1 &&
                             (ver || *cp3)))))) {
-               Safefree(trndir);
+               PerlMem_free(trndir);
                 set_errno(ENOTDIR);
                 set_vaxc_errno(RMS$_DIR);
                 return NULL;
@@ -5203,7 +5251,7 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
                   (*(cp2+4) && ((*(cp2+4) != ';' && *(cp2+4) != '.')  ||
                   (*(cp2+5) && ((ver = strtol(cp2+5,&cp3,10)) != 1 &&
                             (ver || *cp3)))))) {
-               Safefree(trndir);
+               PerlMem_free(trndir);
                 set_errno(ENOTDIR);
                 set_vaxc_errno(RMS$_DIR);
                 return NULL;
@@ -5245,7 +5293,7 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
                   (*(cp2+4) && ((*(cp2+4) != ';' && *(cp2+4) != '.')  ||
                   (*(cp2+5) && ((ver = strtol(cp2+5,&cp3,10)) != 1 &&
                             (ver || *cp3)))))) {
-              Safefree(trndir);
+              PerlMem_free(trndir);
                set_errno(ENOTDIR);
                set_vaxc_errno(RMS$_DIR);
                return NULL;
@@ -5258,7 +5306,7 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
                   (*(cp2+4) && ((*(cp2+4) != ';' && *(cp2+4) != '.')  ||
                   (*(cp2+5) && ((ver = strtol(cp2+5,&cp3,10)) != 1 &&
                             (ver || *cp3)))))) {
-              Safefree(trndir);
+              PerlMem_free(trndir);
                set_errno(ENOTDIR);
                set_vaxc_errno(RMS$_DIR);
                return NULL;
@@ -5282,11 +5330,12 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
         else if (ts) Newx(retpath,strlen(trndir)+1,char);
         else retpath = __pathify_retbuf;
         strcpy(retpath,trndir);
-       Safefree(trndir);
+       PerlMem_free(trndir);
         return retpath;
       }
       rms_set_fna(dirfab, dirnam, trndir, dirlen);
-      Newx(esa, VMS_MAXRSS, char);
+      esa = PerlMem_malloc(VMS_MAXRSS);
+      if (esa == NULL) _ckvmssts(SS$_INSFMEM);
       rms_set_dna(dirfab, dirnam, ".DIR;1", 6);
       rms_bind_fab_nam(dirfab, dirnam);
       rms_set_esa(dirfab, dirnam, esa, VMS_MAXRSS - 1);
@@ -5304,8 +5353,8 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
           sts = sys$parse(&dirfab) & STS$K_SUCCESS;
         }
         if (!sts) {
-         Safefree(trndir);
-         Safefree(esa);
+         PerlMem_free(trndir);
+         PerlMem_free(esa);
           set_errno(EVMSERR);
           set_vaxc_errno(dirfab.fab$l_sts);
           return NULL;
@@ -5318,8 +5367,8 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
           if (dirfab.fab$l_sts != RMS$_FNF) {
            int sts1;
            sts1 = rms_free_search_context(&dirfab);
-           Safefree(trndir);
-           Safefree(esa);
+           PerlMem_free(trndir);
+           PerlMem_free(esa);
             set_errno(EVMSERR);
             set_vaxc_errno(dirfab.fab$l_sts);
             return NULL;
@@ -5334,8 +5383,8 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
          int sts2;
           /* Something other than .DIR[;1].  Bzzt. */
          sts2 = rms_free_search_context(&dirfab);
-         Safefree(trndir);
-         Safefree(esa);
+         PerlMem_free(trndir);
+         PerlMem_free(esa);
           set_errno(ENOTDIR);
           set_vaxc_errno(RMS$_DIR);
           return NULL;
@@ -5355,14 +5404,14 @@ static char *mp_do_pathify_dirspec(pTHX_ const char *dir,char *buf, int ts)
       else if (ts) Newx(retpath,retlen,char);
       else retpath = __pathify_retbuf;
       strcpy(retpath,esa);
-      Safefree(esa);
+      PerlMem_free(esa);
       sts = rms_free_search_context(&dirfab);
       /* $PARSE may have upcased filespec, so convert output to lower
        * case if input contained any lowercase characters. */
       if (haslower && !decc_efs_case_preserve) __mystrtolower(retpath);
     }
 
-    Safefree(trndir);
+    PerlMem_free(trndir);
     return retpath;
 }  /* end of do_pathify_dirspec() */
 /*}}}*/
@@ -5376,7 +5425,7 @@ char *Perl_pathify_dirspec_ts(pTHX_ const char *dir, char *buf)
 static char *mp_do_tounixspec(pTHX_ const char *spec, char *buf, int ts)
 {
   static char __tounixspec_retbuf[VMS_MAXRSS];
-  char *dirend, *rslt, *cp1, *cp3, tmp[VMS_MAXRSS];
+  char *dirend, *rslt, *cp1, *cp3, *tmp;
   const char *cp2;
   int devlen, dirlen, retlen = VMS_MAXRSS;
   int expand = 1; /* guarantee room for leading and trailing slashes */
@@ -5411,7 +5460,8 @@ static char *mp_do_tounixspec(pTHX_ const char *spec, char *buf, int ts)
       int tunix_len;
       int nl_flag;
 
-      Newx(tunix, VMS_MAXRSS + 1,char);
+      tunix = PerlMem_malloc(VMS_MAXRSS);
+      if (tunix == NULL) _ckvmssts(SS$_INSFMEM);
       strcpy(tunix, spec);
       tunix_len = strlen(tunix);
       nl_flag = 0;
@@ -5422,7 +5472,7 @@ static char *mp_do_tounixspec(pTHX_ const char *spec, char *buf, int ts)
        nl_flag = 1;
       }
       uspec = decc$translate_vms(tunix);
-      Safefree(tunix);
+      PerlMem_free(tunix);
       if ((int)uspec > 0) {
        strcpy(rslt,uspec);
        if (nl_flag) {
@@ -5523,6 +5573,8 @@ static char *mp_do_tounixspec(pTHX_ const char *spec, char *buf, int ts)
 #else
   cmp_rslt = strncasecmp(spec,"SYS$SCRATCH:", 12);
 #endif
+  tmp = PerlMem_malloc(VMS_MAXRSS);
+  if (tmp == NULL) _ckvmssts(SS$_INSFMEM);
   if (cmp_rslt == 0) {
   int islnm;
 
@@ -5546,11 +5598,13 @@ static char *mp_do_tounixspec(pTHX_ const char *spec, char *buf, int ts)
     cp2++;
     if (*cp2 == ']' || *cp2 == '>') {
       *(cp1++) = '.'; *(cp1++) = '/'; *(cp1++) = '\0';
+      PerlMem_free(tmp);
       return rslt;
     }
     else if ( *cp2 != '^' && *cp2 != '.' && *cp2 != '-') { /* add the implied device */
-      if (getcwd(tmp,sizeof tmp,1) == NULL) {
+      if (getcwd(tmp, VMS_MAXRSS-1 ,1) == NULL) {
         if (ts) Safefree(rslt);
+       PerlMem_free(tmp);
         return NULL;
       }
       trnlnm_iter_count = 0;
@@ -5572,7 +5626,10 @@ static char *mp_do_tounixspec(pTHX_ const char *spec, char *buf, int ts)
       *(cp1++) = '/';
       while (*cp3) {
         *(cp1++) = *(cp3++);
-        if (cp1 - rslt > NAM$C_MAXRSS && !ts && !buf) return NULL; /* No room */
+        if (cp1 - rslt > (VMS_MAXRSS - 1) && !ts && !buf) {
+           PerlMem_free(tmp);
+           return NULL; /* No room */
+       }
       }
       *(cp1++) = '/';
     }
@@ -5589,6 +5646,7 @@ static char *mp_do_tounixspec(pTHX_ const char *spec, char *buf, int ts)
       else cp2++;
     }
   }
+  PerlMem_free(tmp);
   for (; cp2 <= dirend; cp2++) {
     if ((*cp2 == '^')) {
        /* EFS file escape, pass the next character as is */
@@ -5697,7 +5755,8 @@ int unixlen;
   vmspath[vmspath_len] = 0;
   if (unixpath[unixlen - 1] == '/')
   dir_flag = 1;
-  Newx(esa, VMS_MAXRSS, char);
+  esa = PerlMem_malloc(VMS_MAXRSS);
+  if (esa == NULL) _ckvmssts_noperl(SS$_INSFMEM);
   myfab.fab$l_fna = vmspath;
   myfab.fab$b_fns = strlen(vmspath);
   myfab.fab$l_naml = &mynam;
@@ -5716,7 +5775,7 @@ int unixlen;
 
   /* It failed! Try again as a UNIX filespec */
   if (!(sts & 1)) {
-    Safefree(esa);
+    PerlMem_free(esa);
     return sts;
   }
 
@@ -5724,7 +5783,7 @@ int unixlen;
    sts = sys$search(&myfab);
    /* on any failure, returned the POSIX ^UP^ filespec */
    if (!(sts & 1)) {
-      Safefree(esa);
+      PerlMem_free(esa);
       return sts;
    }
    specdsc.dsc$a_pointer = vmspath;
@@ -5798,7 +5857,7 @@ int unixlen;
       }
     }
   }
-  Safefree(esa);
+  PerlMem_free(esa);
   return sts;
 }
 
@@ -5947,7 +6006,8 @@ int quoted;
      * here that are a VMS device name or concealed logical name instead.
      * So to make things work, this procedure must be tolerant.
      */
-    Newx(esa, vmspath_len, char);
+    esa = PerlMem_malloc(vmspath_len);
+    if (esa == NULL) _ckvmssts_noperl(SS$_INSFMEM);
 
     sts = SS$_NORMAL;
     nextslash = strchr(&unixptr[1],'/');
@@ -6061,7 +6121,7 @@ int quoted;
       }
 
     } /* non-POSIX translation */
-    Safefree(esa);
+    PerlMem_free(esa);
   } /* End of relative/absolute path handling */
 
   while ((*unixptr) && (vmslen < vmspath_len)){
@@ -6418,7 +6478,8 @@ static char *mp_do_tovmsspec(pTHX_ const char *path, char *buf, int ts) {
     }
     while (*(++cp2) != '/' && *cp2) *(cp1++) = *cp2;
     *cp1 = '\0';
-    Newx(trndev, VMS_MAXRSS, char);
+    trndev = PerlMem_malloc(VMS_MAXRSS);
+    if (trndev == NULL) _ckvmssts(SS$_INSFMEM);
     islnm =  my_trnlnm(rslt,trndev,0);
 
      /* DECC special handling */
@@ -6483,7 +6544,7 @@ static char *mp_do_tovmsspec(pTHX_ const char *path, char *buf, int ts) {
        }
       }
     }
-    Safefree(trndev);
+    PerlMem_free(trndev);
   }
   else {
     *(cp1++) = '[';
@@ -6671,20 +6732,23 @@ static char *mp_do_tovmspath(pTHX_ const char *path, char *buf, int ts) {
   char *pathified, *vmsified, *cp;
 
   if (path == NULL) return NULL;
-  Newx(pathified, VMS_MAXRSS, char);
+  pathified = PerlMem_malloc(VMS_MAXRSS);
+  if (pathified == NULL) _ckvmssts(SS$_INSFMEM);
   if (do_pathify_dirspec(path,pathified,0) == NULL) {
-    Safefree(pathified);
+    PerlMem_free(pathified);
     return NULL;
   }
-  Newx(vmsified, VMS_MAXRSS, char);
-  if (do_tovmsspec(pathified,buf ? buf : vmsified,0) == NULL) {
-    Safefree(pathified);
-    Safefree(vmsified);
+
+  vmsified = NULL;
+  if (buf == NULL)
+     Newx(vmsified, VMS_MAXRSS, char);
+  if (do_tovmsspec(pathified, buf ? buf : vmsified, 0) == NULL) {
+    PerlMem_free(pathified);
+    if (vmsified) Safefree(vmsified);
     return NULL;
   }
-  Safefree(pathified);
+  PerlMem_free(pathified);
   if (buf) {
-    Safefree(vmsified);
     return buf;
   }
   else if (ts) {
@@ -6715,20 +6779,24 @@ static char *mp_do_tounixpath(pTHX_ const char *path, char *buf, int ts) {
   char *pathified, *unixified, *cp;
 
   if (path == NULL) return NULL;
-  Newx(pathified, VMS_MAXRSS, char);
+  pathified = PerlMem_malloc(VMS_MAXRSS);
+  if (pathified == NULL) _ckvmssts(SS$_INSFMEM);
   if (do_pathify_dirspec(path,pathified,0) == NULL) {
-    Safefree(pathified);
+    PerlMem_free(pathified);
     return NULL;
   }
-  Newx(unixified, VMS_MAXRSS, char);
+
+  unixified = NULL;
+  if (buf == NULL) {
+      Newx(unixified, VMS_MAXRSS, char);
+  }
   if (do_tounixspec(pathified,buf ? buf : unixified,0) == NULL) {
-    Safefree(pathified);
-    Safefree(unixified);
+    PerlMem_free(pathified);
+    if (unixified) Safefree(unixified);
     return NULL;
   }
-  Safefree(pathified);
+  PerlMem_free(pathified);
   if (buf) {
-    Safefree(unixified);
     return buf;
   }
   else if (ts) {
@@ -6953,8 +7021,8 @@ mp_getredirection(pTHX_ int *ac, char ***av)
      * Allocate and fill in the new argument vector, Some Unix's terminate
      * the list with an extra null pointer.
      */
-    Newx(argv, item_count+1, char *);
     argv = (char **) PerlMem_malloc((item_count+1) * sizeof(char *));
+    if (argv == NULL) _ckvmssts_noperl(SS$_INSFMEM);
     *av = argv;
     for (j = 0; j < item_count; ++j, list_head = list_head->next)
        argv[j] = list_head->value;
@@ -7050,10 +7118,12 @@ static void add_item(struct list_item **head,
     if (*head == 0)
        {
        *head = (struct list_item *) PerlMem_malloc(sizeof(struct list_item));
+       if (head == NULL) _ckvmssts_noperl(SS$_INSFMEM);
        *tail = *head;
        }
     else {
        (*tail)->next = (struct list_item *) PerlMem_malloc(sizeof(struct list_item));
+       if ((*tail)->next == NULL) _ckvmssts_noperl(SS$_INSFMEM);
        *tail = (*tail)->next;
        }
     (*tail)->value = value;
@@ -7111,7 +7181,8 @@ int rms_sts;
     resultspec.dsc$b_dtype = DSC$K_DTYPE_T;
     resultspec.dsc$b_class = DSC$K_CLASS_D;
     resultspec.dsc$a_pointer = NULL;
-    Newx(vmsspec, VMS_MAXRSS, char);
+    vmsspec = PerlMem_malloc(VMS_MAXRSS);
+    if (vmsspec == NULL) _ckvmssts_noperl(SS$_INSFMEM);
     if ((isunix = (int) strchr(item,'/')) != (int) NULL)
       filespec.dsc$a_pointer = do_tovmsspec(item,vmsspec,0);
     if (!isunix || !filespec.dsc$a_pointer)
@@ -7134,7 +7205,8 @@ int rms_sts;
        char *string;
        char *c;
 
-       Newx(string,resultspec.dsc$w_length+1,char);
+       string = PerlMem_malloc(resultspec.dsc$w_length+1);
+        if (string == NULL) _ckvmssts_noperl(SS$_INSFMEM);
        strncpy(string, resultspec.dsc$a_pointer, resultspec.dsc$w_length);
        string[resultspec.dsc$w_length] = '\0';
        if (NULL == had_version)
@@ -7158,7 +7230,7 @@ int rms_sts;
        add_item(head, tail, string, count);
        ++expcount;
     }
-    Safefree(vmsspec);
+    PerlMem_free(vmsspec);
     if (sts != RMS$_NMF)
        {
        set_vaxc_errno(sts);
@@ -7383,6 +7455,7 @@ vms_image_init(int *argcp, char ***argvp)
       }
       if (jpilist[1].bufadr != rlst) PerlMem_free(jpilist[1].bufadr);
       jpilist[1].bufadr = mask = (unsigned long int *) PerlMem_malloc(rsz * sizeof(unsigned long int));
+      if (mask == NULL) _ckvmssts_noperl(SS$_INSFMEM);
       jpilist[1].buflen = rsz * sizeof(unsigned long int);
       _ckvmssts_noperl(sys$getjpiw(0,NULL,NULL,&jpilist[1],iosb,NULL,NULL));
       _ckvmssts_noperl(iosb[0]);
@@ -7397,7 +7470,7 @@ vms_image_init(int *argcp, char ***argvp)
         break;
       }
     }
-    if (mask != rlst) Safefree(mask);
+    if (mask != rlst) PerlMem_free(mask);
   }
 
   /* When Perl is in decc_filename_unix_report mode and is run from a concealed
@@ -7434,8 +7507,10 @@ vms_image_init(int *argcp, char ***argvp)
     char **newargv, **oldargv;
     oldargv = *argvp;
     newargv = (char **) PerlMem_malloc(((*argcp)+2) * sizeof(char *));
+    if (newargv == NULL) _ckvmssts_noperl(SS$_INSFMEM);
     newargv[0] = oldargv[0];
-    newargv[1] = (char *) PerlMem_malloc(3 * sizeof(char));
+    newargv[1] = PerlMem_malloc(3 * sizeof(char));
+    if (newargv[1] == NULL) _ckvmssts_noperl(SS$_INSFMEM);
     strcpy(newargv[1], "-T");
     Copy(&oldargv[1],&newargv[2],(*argcp)-1,char **);
     (*argcp)++;
@@ -7462,12 +7537,18 @@ vms_image_init(int *argcp, char ***argvp)
   for (tabidx = 0;
        len = my_trnlnm("PERL_ENV_TABLES",eqv,tabidx);
        tabidx++) {
-    if (!tabidx) tabvec = (struct dsc$descriptor_s **) PerlMem_malloc(tabct * sizeof(struct dsc$descriptor_s *));
+    if (!tabidx) {
+      tabvec = (struct dsc$descriptor_s **)
+           PerlMem_malloc(tabct * sizeof(struct dsc$descriptor_s *));
+      if (tabvec == NULL) _ckvmssts_noperl(SS$_INSFMEM);
+    }
     else if (tabidx >= tabct) {
       tabct += 8;
       tabvec = (struct dsc$descriptor_s **) PerlMem_realloc(tabvec, tabct * sizeof(struct dsc$descriptor_s *));
+      if (tabvec == NULL) _ckvmssts_noperl(SS$_INSFMEM);
     }
     tabvec[tabidx] = (struct dsc$descriptor_s *) PerlMem_malloc(sizeof(struct dsc$descriptor_s));
+    if (tabvec[tabidx] == NULL) _ckvmssts_noperl(SS$_INSFMEM);
     tabvec[tabidx]->dsc$w_length  = 0;
     tabvec[tabidx]->dsc$b_dtype   = DSC$K_DTYPE_T;
     tabvec[tabidx]->dsc$b_class   = DSC$K_CLASS_D;
@@ -7511,12 +7592,13 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
        *template, *base, *end, *cp1, *cp2;
   register int tmplen, reslen = 0, dirs = 0;
 
-  Newx(unixwild, VMS_MAXRSS, char);
+  unixwild = PerlMem_malloc(VMS_MAXRSS);
+  if (unixwild == NULL) _ckvmssts(SS$_INSFMEM);
   if (!wildspec || !fspec) return 0;
   template = unixwild;
   if (strpbrk(wildspec,"]>:") != NULL) {
     if (do_tounixspec(wildspec,unixwild,0) == NULL) {
-       Safefree(unixwild);
+        PerlMem_free(unixwild);
        return 0;
     }
   }
@@ -7524,11 +7606,12 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
     strncpy(unixwild, wildspec, VMS_MAXRSS-1);
     unixwild[VMS_MAXRSS-1] = 0;
   }
-  Newx(unixified, VMS_MAXRSS, char);
+  unixified = PerlMem_malloc(VMS_MAXRSS);
+  if (unixified == NULL) _ckvmssts(SS$_INSFMEM);
   if (strpbrk(fspec,"]>:") != NULL) {
     if (do_tounixspec(fspec,unixified,0) == NULL) {
-       Safefree(unixwild);
-       Safefree(unixified);
+        PerlMem_free(unixwild);
+        PerlMem_free(unixified);
        return 0;
     }
     else base = unixified;
@@ -7540,19 +7623,19 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
 
   /* No prefix or absolute path on wildcard, so nothing to remove */
   if (!*template || *template == '/') {
-    Safefree(unixwild);
+    PerlMem_free(unixwild);
     if (base == fspec) {
-       Safefree(unixified);
+        PerlMem_free(unixified);
        return 1;
     }
     tmplen = strlen(unixified);
     if (tmplen > reslen) {
-       Safefree(unixified);
+        PerlMem_free(unixified);
        return 0;  /* not enough space */
     }
     /* Copy unixified resultant, including trailing NUL */
     memmove(fspec,unixified,tmplen+1);
-    Safefree(unixified);
+    PerlMem_free(unixified);
     return 1;
   }
 
@@ -7563,8 +7646,8 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
       if ((*cp1 == '/') && !dirs--) /* postdec so we get front of rel path */
         { cp1++; break; }
     if (cp1 != fspec) memmove(fspec,cp1, end - cp1 + 1);
-    Safefree(unixified);
-    Safefree(unixwild);
+    PerlMem_free(unixified);
+    PerlMem_free(unixwild);
     return 1;
   }
   else {
@@ -7577,7 +7660,8 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
     while ((cp1 = strstr(ellipsis+4,".../")) != NULL) {ellipsis = cp1; ells++;}
     totells = ells;
     for (cp1 = ellipsis+4; *cp1; cp1++) if (*cp1 == '/') dirs++;
-    Newx(tpl, VMS_MAXRSS, char);
+    tpl = PerlMem_malloc(VMS_MAXRSS);
+    if (tpl == NULL) _ckvmssts(SS$_INSFMEM);
     if (ellipsis == template && opts & 1) {
       /* Template begins with an ellipsis.  Since we can't tell how many
        * directory names at the front of the resultant to keep for an
@@ -7588,9 +7672,9 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
        * could match template).
        */
       if (getcwd(tpl, (VMS_MAXRSS - 1),0) == NULL) {
-         Safefree(tpl);
-         Safefree(unixified);
-         Safefree(unixwild);
+         PerlMem_free(tpl);
+         PerlMem_free(unixified);
+         PerlMem_free(unixwild);
          return 0;
       }
       if (!decc_efs_case_preserve) {
@@ -7601,9 +7685,9 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
       for (front = cp2+1; *front; front++) if (*front == '/') segdirs--;
       if (*cp1 == '\0' && *cp2 == '/' && segdirs < 1) {
         memmove(fspec,cp2+1,end - cp2);
-       Safefree(unixified);
-       Safefree(unixwild);
-       Safefree(tpl);
+       PerlMem_free(tpl);
+       PerlMem_free(unixified);
+       PerlMem_free(unixwild);
         return 1;
       }
     }
@@ -7612,7 +7696,8 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
       for (front = end ; front >= base; front--)
          if (*front == '/' && !dirs--) { front++; break; }
     }
-    Newx(lcres, VMS_MAXRSS, char);
+    lcres = PerlMem_malloc(VMS_MAXRSS);
+    if (lcres == NULL) _ckvmssts(SS$_INSFMEM);
     for (cp1=template,cp2=lcres; *cp1 && cp2 <= lcres + (VMS_MAXRSS - 1);
          cp1++,cp2++) {
            if (!decc_efs_case_preserve) {
@@ -7623,10 +7708,10 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
            }
     }
     if (cp1 != '\0') {
-       Safefree(unixified);
-       Safefree(unixwild);
-       Safefree(lcres);
-       Safefree(tpl);
+       PerlMem_free(tpl);
+       PerlMem_free(unixified);
+       PerlMem_free(unixwild);
+       PerlMem_free(lcres);
        return 0;  /* Path too long. */
     }
     lcend = cp2;
@@ -7659,10 +7744,10 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
          if (*cp2 == '/') segdirs++;
       }
       if (cp1 != ellipsis - 1) {
-         Safefree(unixified);
-         Safefree(unixwild);
-         Safefree(lcres);
-         Safefree(tpl);
+         PerlMem_free(tpl);
+         PerlMem_free(unixified);
+         PerlMem_free(unixwild);
+         PerlMem_free(lcres);
          return 0; /* Path too long */
       }
       /* Back up at least as many dirs as in template before matching */
@@ -7677,10 +7762,10 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
         for ( ; cp1 >= lcres; cp1--) if (*cp1 == '/') { cp1++; break; }
       }
       if (!match) {
-       Safefree(unixified);
-       Safefree(unixwild);
-       Safefree(lcres);
-       Safefree(tpl);
+       PerlMem_free(tpl);
+       PerlMem_free(unixified);
+       PerlMem_free(unixwild);
+       PerlMem_free(lcres);
        return 0;  /* Can't find prefix ??? */
       }
       if (match > 1 && opts & 1) {
@@ -7709,20 +7794,20 @@ Perl_trim_unixpath(pTHX_ char *fspec, const char *wildspec, int opts)
         for (st = cp2+1; *st; st++) if (*st == '/') segdirs--;
         if (*cp1 == '\0' && *cp2 == '/') {
           memmove(fspec,cp2+1,end - cp2);
-         Safefree(lcres);
-         Safefree(unixified);
-         Safefree(unixwild);
-         Safefree(tpl);
+         PerlMem_free(tpl);
+         PerlMem_free(unixified);
+         PerlMem_free(unixwild);
+         PerlMem_free(lcres);
           return 1;
         }
         /* Nope -- stick with lcfront from above and keep going. */
       }
     }
     memmove(fspec,base + (lcfront - lcres), lcend - lcfront + 1);
-    Safefree(unixified);
-    Safefree(unixwild);
-    Safefree(lcres);
-    Safefree(tpl);
+    PerlMem_free(tpl);
+    PerlMem_free(unixified);
+    PerlMem_free(unixwild);
+    PerlMem_free(lcres);
     return 1;
     ellipsis = nextell;
   }
@@ -7972,7 +8057,7 @@ Perl_readdir(pTHX_ DIR *dd)
 
     /* Skip any directory component and just copy the name. */
     sts = vms_split_path
-       (buff,
+       (aTHX_ buff,
        &v_spec,
        &v_len,
        &r_spec,
@@ -8139,9 +8224,9 @@ vms_execfree(struct dsc$descriptor_s *vmscmd)
 {
   if (vmscmd) {
       if (vmscmd->dsc$a_pointer) {
-          Safefree(vmscmd->dsc$a_pointer);
+          PerlMem_free(vmscmd->dsc$a_pointer);
       }
-      Safefree(vmscmd);
+      PerlMem_free(vmscmd);
   }
 }
 
@@ -8169,7 +8254,7 @@ setup_argstr(pTHX_ SV *really, SV **mark, SV **sp)
       cmdlen += rlen ? rlen + 1 : 0;
     }
   }
-  Newx(PL_Cmd,cmdlen+1,char);
+  Newx(PL_Cmd, cmdlen+1, char);
 
   if (tmps && *tmps) {
     strcpy(PL_Cmd,tmps);
@@ -8207,11 +8292,13 @@ setup_cmddsc(pTHX_ const char *incmd, int check_img, int *suggest_quote,
   int cmdlen;
   register int isdcl;
 
-  Newx(vmscmd,sizeof(struct dsc$descriptor_s),struct dsc$descriptor_s);
+  vmscmd = PerlMem_malloc(sizeof(struct dsc$descriptor_s));
+  if (vmscmd == NULL) _ckvmssts(SS$_INSFMEM);
 
   /* Make a copy for modification */
   cmdlen = strlen(incmd);
-  Newx(cmd, cmdlen+1, char);
+  cmd = PerlMem_malloc(cmdlen+1);
+  if (cmd == NULL) _ckvmssts(SS$_INSFMEM);
   strncpy(cmd, incmd, cmdlen);
   cmd[cmdlen] = 0;
   image_name[0] = 0;
@@ -8226,8 +8313,8 @@ setup_cmddsc(pTHX_ const char *incmd, int check_img, int *suggest_quote,
   if (suggest_quote) *suggest_quote = 0;
 
   if (strlen(cmd) > MAX_DCL_LINE_LENGTH) {
+    PerlMem_free(cmd);
     return CLI$_BUFOVF;                /* continuation lines currently unsupported */
-    Safefree(cmd);
   }
 
   s = cmd;
@@ -8409,7 +8496,8 @@ setup_cmddsc(pTHX_ const char *incmd, int check_img, int *suggest_quote,
       if (check_img && isdcl) return RMS$_FNF;
 
       if (cando_by_name(S_IXUSR,0,resspec)) {
-        Newx(vmscmd->dsc$a_pointer, MAX_DCL_LINE_LENGTH ,char);
+        vmscmd->dsc$a_pointer = PerlMem_malloc(MAX_DCL_LINE_LENGTH);
+       if (vmscmd->dsc$a_pointer == NULL) _ckvmssts(SS$_INSFMEM);
         if (!isdcl) {
             strcpy(vmscmd->dsc$a_pointer,"$ MCR ");
            if (image_name[0] != 0) {
@@ -8448,22 +8536,21 @@ setup_cmddsc(pTHX_ const char *incmd, int check_img, int *suggest_quote,
             retsts = CLI$_BUFOVF;
        }
         vmscmd->dsc$w_length = strlen(vmscmd->dsc$a_pointer);
-        Safefree(cmd);
+        PerlMem_free(cmd);
         return (vmscmd->dsc$w_length > MAX_DCL_LINE_LENGTH ? CLI$_BUFOVF : retsts);
       }
-      else retsts = RMS$_PRV;
+      else
+       retsts = RMS$_PRV;
     }
   }
   /* It's either a DCL command or we couldn't find a suitable image */
   vmscmd->dsc$w_length = strlen(cmd);
-/*  if (cmd == PL_Cmd) {
-      vmscmd->dsc$a_pointer = PL_Cmd;
-      if (suggest_quote) *suggest_quote = 1;
-  }
-  else  */
-      vmscmd->dsc$a_pointer = savepvn(cmd,vmscmd->dsc$w_length);
 
-  Safefree(cmd);
+  vmscmd->dsc$a_pointer = PerlMem_malloc(vmscmd->dsc$w_length);
+  strncpy(vmscmd->dsc$a_pointer,cmd,vmscmd->dsc$w_length);
+  vmscmd->dsc$a_pointer[vmscmd->dsc$w_length];
+
+  PerlMem_free(cmd);
 
   /* check if it's a symbol (for quoting purposes) */
   if (suggest_quote && !*suggest_quote) { 
@@ -8492,6 +8579,9 @@ setup_cmddsc(pTHX_ const char *incmd, int check_img, int *suggest_quote,
 bool
 Perl_vms_do_aexec(pTHX_ SV *really,SV **mark,SV **sp)
 {
+bool exec_sts;
+char * cmd;
+
   if (sp > mark) {
     if (vfork_called) {           /* this follows a vfork - act Unixish */
       vfork_called--;
@@ -8502,8 +8592,10 @@ Perl_vms_do_aexec(pTHX_ SV *really,SV **mark,SV **sp)
       else return do_aexec(really,mark,sp);
     }
                                            /* no vfork - act VMSish */
-    return vms_do_exec(setup_argstr(aTHX_ really,mark,sp));
-
+    cmd = setup_argstr(aTHX_ really,mark,sp);
+    exec_sts = vms_do_exec(cmd);
+    Safefree(cmd);  /* Clean up from setup_argstr() */
+    return exec_sts;
   }
 
   return FALSE;
@@ -8570,8 +8662,15 @@ unsigned long int Perl_do_spawn(pTHX_ const char *);
 unsigned long int
 Perl_do_aspawn(pTHX_ void *really,void **mark,void **sp)
 {
-  if (sp > mark) return do_spawn(setup_argstr(aTHX_ (SV *)really,(SV **)mark,(SV **)sp));
+unsigned long int sts;
+char * cmd;
 
+  if (sp > mark) {
+    cmd = setup_argstr(aTHX_ (SV *)really,(SV **)mark,(SV **)sp);
+    sts = do_spawn(cmd);
+    /* pp_sys will clean up cmd */
+    return sts;
+  }
   return SS$_ABORT;
 }  /* end of do_aspawn() */
 /*}}}*/
@@ -8582,6 +8681,9 @@ Perl_do_spawn(pTHX_ const char *cmd)
 {
   unsigned long int sts, substs;
 
+  /* The caller of this routine expects to Safefree(PL_Cmd) */
+  Newx(PL_Cmd,10,char);
+
   TAINT_ENV();
   TAINT_PROPER("spawn");
   if (!cmd || !*cmd) {
@@ -9950,7 +10052,7 @@ Perl_cando_by_name(pTHX_ I32 bit, bool effective, const char *fname)
 
   if (!fname || !*fname) return FALSE;
   /* Make sure we expand logical names, since sys$check_access doesn't */
-  Newx(fileified, VMS_MAXRSS, char);
+  fileified = PerlMem_malloc(VMS_MAXRSS);
   if (!strpbrk(fname,"/]>:")) {
     strcpy(fileified,fname);
     trnlnm_iter_count = 0;
@@ -9960,8 +10062,8 @@ Perl_cando_by_name(pTHX_ I32 bit, bool effective, const char *fname)
     }
     fname = fileified;
   }
-  if (!do_rmsexpand(fname, vmsname, 1, NULL, PERL_RMSEXPAND_M_VMS)) {
-    Safefree(fileified);
+  if (!do_rmsexpand(fname, vmsname, 0, NULL, PERL_RMSEXPAND_M_VMS)) {
+    PerlMem_free(fileified);
     return FALSE;
   }
   retlen = namdsc.dsc$w_length = strlen(vmsname);
@@ -9983,7 +10085,7 @@ Perl_cando_by_name(pTHX_ I32 bit, bool effective, const char *fname)
     case S_IDUSR: case S_IDGRP: case S_IDOTH:
       access = ARM$M_DELETE; break;
     default:
-      Safefree(fileified);
+      PerlMem_free(fileified);
       return FALSE;
   }
 
@@ -10005,13 +10107,14 @@ Perl_cando_by_name(pTHX_ I32 bit, bool effective, const char *fname)
                                     &usrprodsc.dsc$w_length,0));
 
   /* allocate space for the profile and get it filled in */
-  Newx(usrprodsc.dsc$a_pointer,usrprodsc.dsc$w_length,char);
+  usrprodsc.dsc$a_pointer = PerlMem_malloc(usrprodsc.dsc$w_length);
+  if (usrprodsc.dsc$a_pointer == NULL) _ckvmssts(SS$_INSFMEM);
   _ckvmssts(sys$create_user_profile(&usrdsc,&usrprolst,0,usrprodsc.dsc$a_pointer,
                                     &usrprodsc.dsc$w_length,0));
 
   /* use the profile to check access to the file; free profile & analyze results */
   retsts = sys$check_access(&objtyp,&namdsc,0,armlst,0,0,0,&usrprodsc);
-  Safefree(usrprodsc.dsc$a_pointer);
+  PerlMem_free(usrprodsc.dsc$a_pointer);
   if (retsts == SS$_NOCALLPRIV) retsts = SS$_NOPRIV; /* not really 3rd party */
 
 #else
@@ -10027,16 +10130,16 @@ Perl_cando_by_name(pTHX_ I32 bit, bool effective, const char *fname)
     if (retsts == SS$_NOPRIV) set_errno(EACCES);
     else if (retsts == SS$_INVFILFOROP) set_errno(EINVAL);
     else set_errno(ENOENT);
-    Safefree(fileified);
+    PerlMem_free(fileified);
     return FALSE;
   }
   if (retsts == SS$_NORMAL || retsts == SS$_ACCONFLICT) {
-    Safefree(fileified);
+    PerlMem_free(fileified);
     return TRUE;
   }
   _ckvmssts(retsts);
 
-  Safefree(fileified);
+  PerlMem_free(fileified);
   return FALSE;  /* Should never get here */
 
 }  /* end of cando_by_name() */
@@ -10453,17 +10556,20 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
     struct XABRDT xabrdt;
     struct XABSUM xabsum;
 
-    Newx(vmsin, VMS_MAXRSS, char);
-    Newx(vmsout, VMS_MAXRSS, char);
+    vmsin = PerlMem_malloc(VMS_MAXRSS);
+    if (vmsin == NULL) _ckvmssts(SS$_INSFMEM);
+    vmsout = PerlMem_malloc(VMS_MAXRSS);
+    if (vmsout == NULL) _ckvmssts(SS$_INSFMEM);
     if (!spec_in  || !*spec_in  || !do_tovmsspec(spec_in,vmsin,1) ||
         !spec_out || !*spec_out || !do_tovmsspec(spec_out,vmsout,1)) {
-      Safefree(vmsin);
-      Safefree(vmsout);
+      PerlMem_free(vmsin);
+      PerlMem_free(vmsout);
       set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG);
       return 0;
     }
 
-    Newx(esa, VMS_MAXRSS, char);
+    esa = PerlMem_malloc(VMS_MAXRSS);
+    if (esa == NULL) _ckvmssts(SS$_INSFMEM);
     nam = cc$rms_naml;
     fab_in = cc$rms_fab;
     fab_in.fab$l_fna = (char *) -1;
@@ -10476,7 +10582,8 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
     fab_in.fab$l_naml =  &nam;
     fab_in.fab$l_xab = (void *) &xabdat;
 
-    Newx(rsa, VMS_MAXRSS, char);
+    rsa = PerlMem_malloc(VMS_MAXRSS);
+    if (rsa == NULL) _ckvmssts(SS$_INSFMEM);
     nam.naml$l_rsa = NULL;
     nam.naml$b_rss = 0;
     nam.naml$l_long_result = rsa;
@@ -10502,10 +10609,10 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
     xabsum = cc$rms_xabsum;        /* To get key and area information */
 
     if (!((sts = sys$open(&fab_in)) & 1)) {
-      Safefree(vmsin);
-      Safefree(vmsout);
-      Safefree(esa);
-      Safefree(rsa);
+      PerlMem_free(vmsin);
+      PerlMem_free(vmsout);
+      PerlMem_free(esa);
+      PerlMem_free(rsa);
       set_vaxc_errno(sts);
       switch (sts) {
         case RMS$_FNF: case RMS$_DNF:
@@ -10542,7 +10649,8 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
        nam.naml$l_long_name ?
           nam.naml$l_long_name_size + nam.naml$l_long_type_size : 0;
 
-    Newx(esa_out, VMS_MAXRSS, char);
+    esa_out = PerlMem_malloc(VMS_MAXRSS);
+    if (esa_out == NULL) _ckvmssts(SS$_INSFMEM);
     nam_out.naml$l_rsa = NULL;
     nam_out.naml$b_rss = 0;
     nam_out.naml$l_long_result = NULL;
@@ -10556,11 +10664,11 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
       nam_out.naml$b_nop |= NAM$M_SYNCHK;
       fab_out.fab$l_xab = NULL;  /* Don't disturb data from input file */
       if (!((sts = sys$parse(&fab_out)) & 1)) {
-       Safefree(vmsin);
-       Safefree(vmsout);
-       Safefree(esa);
-       Safefree(rsa);
-       Safefree(esa_out);
+       PerlMem_free(vmsin);
+       PerlMem_free(vmsout);
+       PerlMem_free(esa);
+       PerlMem_free(rsa);
+       PerlMem_free(esa_out);
         set_errno(sts == RMS$_SYN ? EINVAL : EVMSERR);
         set_vaxc_errno(sts);
         return 0;
@@ -10573,11 +10681,11 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
 
     if (!(preserve_dates & 1)) fab_out.fab$l_xab = (void *) &xabfhc;
     if (!((sts = sys$create(&fab_out)) & 1)) {
-      Safefree(vmsin);
-      Safefree(vmsout);
-      Safefree(esa);
-      Safefree(rsa);
-      Safefree(esa_out);
+      PerlMem_free(vmsin);
+      PerlMem_free(vmsout);
+      PerlMem_free(esa);
+      PerlMem_free(rsa);
+      PerlMem_free(esa_out);
       set_vaxc_errno(sts);
       switch (sts) {
         case RMS$_DNF:
@@ -10609,7 +10717,8 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
       fab_out.fab$l_xab = (void *) &xabrdt;
     }
 
-    Newx(ubf, 32256, char);
+    ubf = PerlMem_malloc(32256);
+    if (ubf == NULL) _ckvmssts(SS$_INSFMEM);
     rab_in = cc$rms_rab;
     rab_in.rab$l_fab = &fab_in;
     rab_in.rab$l_rop = RAB$M_BIO;
@@ -10617,12 +10726,12 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
     rab_in.rab$w_usz = 32256;
     if (!((sts = sys$connect(&rab_in)) & 1)) {
       sys$close(&fab_in); sys$close(&fab_out);
-      Safefree(vmsin);
-      Safefree(vmsout);
-      Safefree(esa);
-      Safefree(ubf);
-      Safefree(rsa);
-      Safefree(esa_out);
+      PerlMem_free(vmsin);
+      PerlMem_free(vmsout);
+      PerlMem_free(esa);
+      PerlMem_free(ubf);
+      PerlMem_free(rsa);
+      PerlMem_free(esa_out);
       set_errno(EVMSERR); set_vaxc_errno(sts);
       return 0;
     }
@@ -10632,12 +10741,12 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
     rab_out.rab$l_rbf = ubf;
     if (!((sts = sys$connect(&rab_out)) & 1)) {
       sys$close(&fab_in); sys$close(&fab_out);
-      Safefree(vmsin);
-      Safefree(vmsout);
-      Safefree(esa);
-      Safefree(ubf);
-      Safefree(rsa);
-      Safefree(esa_out);
+      PerlMem_free(vmsin);
+      PerlMem_free(vmsout);
+      PerlMem_free(esa);
+      PerlMem_free(ubf);
+      PerlMem_free(rsa);
+      PerlMem_free(esa_out);
       set_errno(EVMSERR); set_vaxc_errno(sts);
       return 0;
     }
@@ -10647,12 +10756,12 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
       rab_out.rab$w_rsz = rab_in.rab$w_rsz;
       if (!(sts & 1) || !((sts = sys$write(&rab_out)) & 1)) {
         sys$close(&fab_in); sys$close(&fab_out);
-       Safefree(vmsin);
-       Safefree(vmsout);
-       Safefree(esa);
-       Safefree(ubf);
-       Safefree(rsa);
-       Safefree(esa_out);
+       PerlMem_free(vmsin);
+       PerlMem_free(vmsout);
+       PerlMem_free(esa);
+       PerlMem_free(ubf);
+       PerlMem_free(rsa);
+       PerlMem_free(esa_out);
         set_errno(EVMSERR); set_vaxc_errno(sts);
         return 0;
       }
@@ -10663,22 +10772,22 @@ Perl_rmscopy(pTHX_ const char *spec_in, const char *spec_out, int preserve_dates
     sys$close(&fab_in);  sys$close(&fab_out);
     sts = (fab_in.fab$l_sts & 1) ? fab_out.fab$l_sts : fab_in.fab$l_sts;
     if (!(sts & 1)) {
-      Safefree(vmsin);
-      Safefree(vmsout);
-      Safefree(esa);
-      Safefree(ubf);
-      Safefree(rsa);
-      Safefree(esa_out);
+      PerlMem_free(vmsin);
+      PerlMem_free(vmsout);
+      PerlMem_free(esa);
+      PerlMem_free(ubf);
+      PerlMem_free(rsa);
+      PerlMem_free(esa_out);
       set_errno(EVMSERR); set_vaxc_errno(sts);
       return 0;
     }
 
-    Safefree(vmsin);
-    Safefree(vmsout);
-    Safefree(esa);
-    Safefree(ubf);
-    Safefree(rsa);
-    Safefree(esa_out);
+    PerlMem_free(vmsin);
+    PerlMem_free(vmsout);
+    PerlMem_free(esa);
+    PerlMem_free(ubf);
+    PerlMem_free(rsa);
+    PerlMem_free(esa_out);
     return 1;
 
 }  /* end of rmscopy() */
@@ -11085,7 +11194,7 @@ Perl_vms_start_glob
 
             /* Find where all the components are */
             v_sts = vms_split_path
-                      (rstr,
+                      (aTHX_ rstr,
                        &v_spec,
                        &v_len,
                        &r_spec,