X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mg.c;h=eb5888605f8243e1fdf2a91ff87116c60a5bc6d9;hb=64f14228217abb04a437553319642d6e7a82a3e8;hp=7d8cd046f831030d24edd1bb1b5ab167d96a0624;hpb=46fc3d4c69a0adf236bfcba70daee7fd597cf30d;p=p5sagit%2Fp5-mst-13.2.git diff --git a/mg.c b/mg.c index 7d8cd04..eb58886 100644 --- a/mg.c +++ b/mg.c @@ -531,18 +531,18 @@ MAGIC *mg; break; case '(': sv_setiv(sv, (IV)gid); - sv_setpvf(sv, "%vd", (IV)gid); + sv_setpvf(sv, "%Vd", (IV)gid); goto add_groups; case ')': sv_setiv(sv, (IV)egid); - sv_setpvf(sv, "%vd", (IV)egid); + sv_setpvf(sv, "%Vd", (IV)egid); add_groups: #ifdef HAS_GETGROUPS { Groups_t gary[NGROUPS]; i = getgroups(NGROUPS,gary); while (--i >= 0) - sv_catpvf(sv, " %vd", (IV)gary[i]); + sv_catpvf(sv, " %Vd", (IV)gary[i]); } #endif SvIOK_on(sv); /* what a wonderful hack! */ @@ -591,7 +591,7 @@ MAGIC* mg; } #endif -#if !defined(OS2) && !defined(AMIGAOS) && !defined(_WIN32) +#if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) /* And you'll never guess what the dog had */ /* in its mouth... */ if (tainting) { @@ -627,9 +627,11 @@ MAGIC* mg; while (s < strend) { struct stat st; - s = cpytill(tokenbuf, s, strend, ':', &i); + s = delimcpy(tokenbuf, tokenbuf + sizeof tokenbuf, + s, strend, ':', &i); s++; - if (*tokenbuf != '/' + if (i >= sizeof tokenbuf /* too long -- assume the worst */ + || *tokenbuf != '/' || (Stat(tokenbuf, &st) == 0 && (st.st_mode & 2)) ) { MgTAINTEDDIR_on(mg); return 0; @@ -637,7 +639,7 @@ MAGIC* mg; } } } -#endif /* neither OS2 nor AMIGAOS nor _WIN32 */ +#endif /* neither OS2 nor AMIGAOS nor WIN32 */ return 0; } @@ -652,6 +654,45 @@ MAGIC* mg; } int +magic_clear_all_env(sv,mg) +SV* sv; +MAGIC* mg; +{ +#if defined(VMS) + die("Can't make list assignment to %%ENV on this system"); +#else +#ifdef WIN32 + char *envv = GetEnvironmentStrings(); + char *cur = envv; + STRLEN len; + while (*cur) { + char *end = strchr(cur,'='); + if (end && end != cur) { + *end = '\0'; + my_setenv(cur,Nullch); + *end = '='; + cur += strlen(end+1)+1; + } + else if ((len = strlen(cur))) + cur += len+1; + } + FreeEnvironmentStrings(envv); +#else + I32 i; + + if (environ == origenviron) + New(901, environ, 1, char*); + else + for (i = 0; environ[i]; i++) + Safefree(environ[i]); + environ[0] = Nullch; + +#endif +#endif + return 0; +} + +int magic_getsig(sv,mg) SV* sv; MAGIC* mg; @@ -1195,7 +1236,7 @@ SV* sv; croak(no_aelem, (I32)LvTARGOFF(sv)); } } - SvREFCNT_inc(value); + (void)SvREFCNT_inc(value); SvREFCNT_dec(LvTARG(sv)); LvTARG(sv) = value; LvTARGLEN(sv) = 0; @@ -1572,7 +1613,7 @@ MAGIC* mg; } /* can grab env area too? */ if (origenviron && origenviron[0] == s + 1) { - my_setenv("NoNeSuCh", Nullch); + my_setenv("NoNe SuCh", Nullch); /* force copy of environment */ for (i = 0; origenviron[i]; i++) if (origenviron[i] == s + 1)