Print this page
5433 at(1) doesn't properly handle being invoked from a path containing spaces
Reviewed by: Gary Mills <gary_mills@fastmail.fm>
*** 99,108 ****
--- 99,109 ----
static void atime(struct tm *, struct tm *);
static int not_this_project(char *);
static char *mkjobname(time_t);
static time_t parse_time(char *);
static time_t gtime(struct tm *);
+ static void escapestr(const char *);
void atabort(char *)__NORETURN;
void yyerror(void);
extern int yyparse(void);
extern void audit_at_delete(char *, char *, int);
*** 544,553 ****
--- 545,571 ----
tv = 60 * tv + tptr->tm_sec;
return (tv);
}
/*
+ * Escape a string to be used inside the job shell script.
+ */
+ static void
+ escapestr(const char *str)
+ {
+ char c;
+ (void) putchar('\'');
+ while ((c = *str++) != '\0') {
+ if (c != '\'')
+ (void) putchar(c);
+ else
+ (void) fputs("'\\''", stdout); /* ' -> '\'' */
+ }
+ (void) putchar('\'');
+ }
+
+ /*
* make job file from proto + stdin
*/
static void
copy(char *jobfile, FILE *inputfile, int when)
{
*** 631,646 ****
(void) printf(": project: %d\n", project);
}
}
for (ep = environ; *ep; ep++) {
- if (strchr(*ep, '\'') != NULL)
- continue;
if ((val = strchr(*ep, '=')) == NULL)
continue;
*val++ = '\0';
! printf("export %s; %s='%s'\n", *ep, *ep, val);
*--val = '=';
}
if ((pfp = fopen(pname1, "r")) == NULL &&
(pfp = fopen(pname, "r")) == NULL)
atabort("no prototype");
--- 649,664 ----
(void) printf(": project: %d\n", project);
}
}
for (ep = environ; *ep; ep++) {
if ((val = strchr(*ep, '=')) == NULL)
continue;
*val++ = '\0';
! (void) printf("export %s; %s=", *ep, *ep);
! escapestr(val);
! (void) putchar('\n');
*--val = '=';
}
if ((pfp = fopen(pname1, "r")) == NULL &&
(pfp = fopen(pname, "r")) == NULL)
atabort("no prototype");
*** 676,686 ****
}
/* change back afterwards */
if (seteuid(effeusr) < 0) {
atabort(CANTCHUID);
}
! printf("%s", dirbuf);
break;
case 'm':
printf("%o", um);
break;
case '<':
--- 694,704 ----
}
/* change back afterwards */
if (seteuid(effeusr) < 0) {
atabort(CANTCHUID);
}
! escapestr(dirbuf);
break;
case 'm':
printf("%o", um);
break;
case '<':