X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mg.c;h=cab0e5973ef292c9bbf92bf49f313b613f1e980d;hb=ba51d756f9ffaa3939ada6861397f27ce3967220;hp=f1dc828029e8777cc7d4bcf1a43ecfac4a7cb13a;hpb=5aabfad66ac77650f584e2f07af91645e19fe296;p=p5sagit%2Fp5-mst-13.2.git diff --git a/mg.c b/mg.c index f1dc828..cab0e59 100644 --- a/mg.c +++ b/mg.c @@ -20,7 +20,7 @@ # include #endif -#ifdef HAS_GETGROUPS +#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS) # ifndef NGROUPS # define NGROUPS 32 # endif @@ -307,7 +307,7 @@ MAGIC *mg; if (rx->subend && (s = rx->endp[0])) { i = rx->subend - s; if (i >= 0) - return 0; + return i; } } return 0; @@ -531,27 +531,20 @@ MAGIC *mg; break; case '(': sv_setiv(sv, (IV)gid); - s = buf; - (void)sprintf(s,"%d",(int)gid); + sv_setpvf(sv, "%Vd", (IV)gid); goto add_groups; case ')': sv_setiv(sv, (IV)egid); - s = buf; - (void)sprintf(s,"%d",(int)egid); + sv_setpvf(sv, "%Vd", (IV)egid); add_groups: - while (*s) s++; #ifdef HAS_GETGROUPS { Groups_t gary[NGROUPS]; - i = getgroups(NGROUPS,gary); - while (--i >= 0) { - (void)sprintf(s," %d", (int)gary[i]); - while (*s) s++; - } + while (--i >= 0) + sv_catpvf(sv, " %Vd", (IV)gary[i]); } #endif - sv_setpv(sv,buf); SvIOK_on(sv); /* what a wonderful hack! */ break; case '*': @@ -634,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; @@ -769,10 +764,8 @@ MAGIC* mg; * access to a known hint bit in a known OP, we can't * tell whether HINT_STRICT_REFS is in force or not. */ - if (!strchr(s,':') && !strchr(s,'\'')) { - sprintf(tokenbuf, "main::%s",s); - sv_setpv(sv,tokenbuf); - } + if (!strchr(s,':') && !strchr(s,'\'')) + sv_setpv(sv, form("main::%s", s)); if (i) (void)rsignal(i, sighandler); else @@ -1518,7 +1511,30 @@ MAGIC* mg; tainting |= (uid && (euid != uid || egid != gid)); break; case ')': +#ifdef HAS_SETGROUPS + { + char *p = SvPV(sv, na); + Groups_t gary[NGROUPS]; + + SET_NUMERIC_STANDARD(); + while (isSPACE(*p)) + ++p; + egid = I_V(atof(p)); + for (i = 0; i < NGROUPS; ++i) { + while (*p && !isSPACE(*p)) + ++p; + while (isSPACE(*p)) + ++p; + if (!*p) + break; + gary[i] = I_V(atof(p)); + } + if (i) + (void)setgroups(i, gary); + } +#else /* HAS_SETGROUPS */ egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv); +#endif /* HAS_SETGROUPS */ if (delaymagic) { delaymagic |= DM_EGID; break; /* don't do magic till later */