Sat Dec 05 06:41:48 2009: Request 52407 was acted upon.
Transaction: Correspondence added by SMUELLER
Queue: PAR-Packer
Subject: pp creates par-<user>/ in /, not /tmp
Broken in: 1.001
Severity: Normal
Owner: RSCHUPP
Requestors: [email protected]
Status: open
Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=52407 >
Hi,
On Fri Dec 04 11:24:50 2009, RSCHUPP wrote:
> I know what's goin' on: does a C construct like
>
> sprintf(stmpdir, "%s other %stuff", stmpdir, ...);
>
> (in mlydr/mktempdir.c) ring a bell?
> The big question is: this code has been in there for ages -
> why does it break now?
Quite honestly... I have no good idea. Looking at the differences to
0.991, there is some change to myldr/mktempdir.c:
--- myldr/mktmpdir.c (revision 7467)
+++ myldr/mktmpdir.c (local)
@@ -160,6 +160,29 @@
if (progname == NULL)
progname = argv[0];
+ /* If invoked as "/usr/bin/parl foo.par myscript.pl" then progname
should
+ * be ".../parl", and we don't want to base our checksum on that, but
+ * rather on "foo.par".
+ */
+ {
+#ifdef WIN32
+#define STREQ(a,b) (strcasecmp(a,b) == 0)
+#else
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#endif
+ int prog_len = strlen(progname);
+ int parl_len = strlen(PARL_EXE);
+
+ if (prog_len >= parl_len
+ && STREQ(progname + prog_len - parl_len, PARL_EXE)
+ && (prog_len == parl_len || progname[prog_len - parl_len -
1] == dir_sep[0])
+ && argv[1]
+ && strlen(argv[1]) >= 4
+ && STREQ(argv[1] + strlen(argv[1]) - 4, ".par"))
+ progname = argv[1];
+#undef STREQ
+ }
+
if ( !par_env_clean() && (f = open( progname, O_RDONLY |
OPEN_O_BINARY ))) {
lseek(f, -18, 2);
read(f, buf, 6);
@@ -176,6 +199,7 @@
}
else {
/* "$TEMP/par-$USER/cache-$SHA1" */
+ lseek(f, 0, 0);
sha_init( &sha_info );
while( ( j = read( f, buf, sizeof( buf ) ) ) > 0 )
{