Print this page
5433 at(1) doesn't properly handle being invoked from a path containing spaces


  84         "       at [-c|-k|-s] [-m] [-f file] [-p project] [-q queuename] "\
  85             "timespec\n"\
  86         "       at -l [-p project] [-q queuename] [at_job_id...]\n"\
  87         "       at -r at_job_id ...\n"
  88 
  89 #define FORMAT          "%a %b %e %H:%M:%S %Y"
  90 
  91 static int leap(int);
  92 static int atoi_for2(char *);
  93 static int check_queue(char *, int);
  94 static int list_jobs(int, char **, int, int);
  95 static int remove_jobs(int, char **, char *);
  96 static void usage(void);
  97 static void catch(int);
  98 static void copy(char *, FILE *, int);
  99 static void atime(struct tm *, struct tm *);
 100 static int not_this_project(char *);
 101 static char *mkjobname(time_t);
 102 static time_t parse_time(char *);
 103 static time_t gtime(struct tm *);

 104 void atabort(char *)__NORETURN;
 105 void yyerror(void);
 106 extern int yyparse(void);
 107 
 108 extern void     audit_at_delete(char *, char *, int);
 109 extern int      audit_at_create(char *, int);
 110 extern int      audit_cron_is_anc_name(char *);
 111 extern int      audit_cron_delete_anc_file(char *, char *);
 112 
 113 /*
 114  * Error in getdate(3G)
 115  */
 116 static char     *errlist[] = {
 117 /* 0 */         "",
 118 /* 1 */ "getdate: The DATEMSK environment variable is not set",
 119 /* 2 */ "getdate: Error on \"open\" of the template file",
 120 /* 3 */ "getdate: Error on \"stat\" of the template file",
 121 /* 4 */ "getdate: The template file is not a regular file",
 122 /* 5 */ "getdate: An error is encountered while reading the template",
 123 /* 6 */ "getdate: Malloc(3C) failed",


 529                  * We call isleap since leap() adds
 530                  * 1900 onto any value passed
 531                  */
 532 
 533         if (!leap(tptr->tm_year) && at.tm_mday == 29 && at.tm_mon == 1)
 534                 atabort("bad date - not a leap year");
 535 
 536         if ((leap(tptr->tm_year)) && tptr->tm_mon >= 2)
 537                 ++tv;
 538 
 539         for (i = 0; i < tptr->tm_mon; ++i)
 540                 tv += dmsize[i];
 541         tv += tptr->tm_mday - 1;
 542         tv = 24 * tv + tptr->tm_hour;
 543         tv = 60 * tv + tptr->tm_min;
 544         tv = 60 * tv + tptr->tm_sec;
 545         return (tv);
 546 }
 547 
 548 /*

















 549  * make job file from proto + stdin
 550  */
 551 static void
 552 copy(char *jobfile, FILE *inputfile, int when)
 553 {
 554         int c;
 555         FILE *pfp;
 556         char *shell;
 557         char    dirbuf[PATH_MAX + 1];
 558         char    line[LINE_MAX];
 559         char **ep;
 560         mode_t um;
 561         char *val;
 562         extern char **environ;
 563         uid_t realusr, effeusr;
 564         int ttyinput;
 565         int ulimit_flag = 0;
 566         struct rlimit rlp;
 567         struct project prj, *pprj;
 568         char pbuf[PROJECT_BUFSZ];


 661                 case 'd':
 662                         /*
 663                          * Must obtain current working directory as the user
 664                          */
 665 
 666                         dirbuf[0] = '\0';
 667                         realusr = getuid();
 668                         effeusr = geteuid();
 669                         /* change euid for getcwd */
 670                         if (seteuid(realusr) < 0) {
 671                                 atabort(CANTCHUID);
 672                         }
 673                         if (getcwd(dirbuf, sizeof (dirbuf)) == NULL) {
 674                                 atabort(
 675                                     "can't obtain current working directory");
 676                         }
 677                         /* change back afterwards */
 678                         if (seteuid(effeusr) < 0) {
 679                                 atabort(CANTCHUID);
 680                         }
 681                         printf("%s", dirbuf);
 682                         break;
 683                 case 'm':
 684                         printf("%o", um);
 685                         break;
 686                 case '<':
 687                         if (ulimit_flag) {
 688                                 if (getrlimit(RLIMIT_FSIZE, &rlp) == 0) {
 689                                         if (rlp.rlim_cur == RLIM_INFINITY)
 690                                                 printf("ulimit unlimited\n");
 691                                         else
 692                                                 printf("ulimit %lld\n",
 693                                                     rlp.rlim_cur / 512);
 694                                 }
 695                         }
 696                         /*
 697                          * fix for 1113572 - use fputs() so that a
 698                          * newline isn't appended to the one returned
 699                          * with fgets(); 1099381 - prompt for input.
 700                          */
 701                         while (fgets(line, LINE_MAX, inputfile) != NULL) {




  84         "       at [-c|-k|-s] [-m] [-f file] [-p project] [-q queuename] "\
  85             "timespec\n"\
  86         "       at -l [-p project] [-q queuename] [at_job_id...]\n"\
  87         "       at -r at_job_id ...\n"
  88 
  89 #define FORMAT          "%a %b %e %H:%M:%S %Y"
  90 
  91 static int leap(int);
  92 static int atoi_for2(char *);
  93 static int check_queue(char *, int);
  94 static int list_jobs(int, char **, int, int);
  95 static int remove_jobs(int, char **, char *);
  96 static void usage(void);
  97 static void catch(int);
  98 static void copy(char *, FILE *, int);
  99 static void atime(struct tm *, struct tm *);
 100 static int not_this_project(char *);
 101 static char *mkjobname(time_t);
 102 static time_t parse_time(char *);
 103 static time_t gtime(struct tm *);
 104 static void escapestr(char *);
 105 void atabort(char *)__NORETURN;
 106 void yyerror(void);
 107 extern int yyparse(void);
 108 
 109 extern void     audit_at_delete(char *, char *, int);
 110 extern int      audit_at_create(char *, int);
 111 extern int      audit_cron_is_anc_name(char *);
 112 extern int      audit_cron_delete_anc_file(char *, char *);
 113 
 114 /*
 115  * Error in getdate(3G)
 116  */
 117 static char     *errlist[] = {
 118 /* 0 */         "",
 119 /* 1 */ "getdate: The DATEMSK environment variable is not set",
 120 /* 2 */ "getdate: Error on \"open\" of the template file",
 121 /* 3 */ "getdate: Error on \"stat\" of the template file",
 122 /* 4 */ "getdate: The template file is not a regular file",
 123 /* 5 */ "getdate: An error is encountered while reading the template",
 124 /* 6 */ "getdate: Malloc(3C) failed",


 530                  * We call isleap since leap() adds
 531                  * 1900 onto any value passed
 532                  */
 533 
 534         if (!leap(tptr->tm_year) && at.tm_mday == 29 && at.tm_mon == 1)
 535                 atabort("bad date - not a leap year");
 536 
 537         if ((leap(tptr->tm_year)) && tptr->tm_mon >= 2)
 538                 ++tv;
 539 
 540         for (i = 0; i < tptr->tm_mon; ++i)
 541                 tv += dmsize[i];
 542         tv += tptr->tm_mday - 1;
 543         tv = 24 * tv + tptr->tm_hour;
 544         tv = 60 * tv + tptr->tm_min;
 545         tv = 60 * tv + tptr->tm_sec;
 546         return (tv);
 547 }
 548 
 549 /*
 550  * Escape a string to be used inside the job shell script.
 551  */
 552 static void
 553 escapestr(char *str)
 554 {
 555         char c;
 556         putchar('\'');
 557         while ((c = *str++) != '\0') {
 558                 if (c != '\'')
 559                         putchar(c);
 560                 else
 561                         printf("\'\\\'\'"); /* ' -> '\'' */
 562         }
 563         putchar('\'');
 564 }
 565 
 566 /*
 567  * make job file from proto + stdin
 568  */
 569 static void
 570 copy(char *jobfile, FILE *inputfile, int when)
 571 {
 572         int c;
 573         FILE *pfp;
 574         char *shell;
 575         char    dirbuf[PATH_MAX + 1];
 576         char    line[LINE_MAX];
 577         char **ep;
 578         mode_t um;
 579         char *val;
 580         extern char **environ;
 581         uid_t realusr, effeusr;
 582         int ttyinput;
 583         int ulimit_flag = 0;
 584         struct rlimit rlp;
 585         struct project prj, *pprj;
 586         char pbuf[PROJECT_BUFSZ];


 679                 case 'd':
 680                         /*
 681                          * Must obtain current working directory as the user
 682                          */
 683 
 684                         dirbuf[0] = '\0';
 685                         realusr = getuid();
 686                         effeusr = geteuid();
 687                         /* change euid for getcwd */
 688                         if (seteuid(realusr) < 0) {
 689                                 atabort(CANTCHUID);
 690                         }
 691                         if (getcwd(dirbuf, sizeof (dirbuf)) == NULL) {
 692                                 atabort(
 693                                     "can't obtain current working directory");
 694                         }
 695                         /* change back afterwards */
 696                         if (seteuid(effeusr) < 0) {
 697                                 atabort(CANTCHUID);
 698                         }
 699                         escapestr(dirbuf);
 700                         break;
 701                 case 'm':
 702                         printf("%o", um);
 703                         break;
 704                 case '<':
 705                         if (ulimit_flag) {
 706                                 if (getrlimit(RLIMIT_FSIZE, &rlp) == 0) {
 707                                         if (rlp.rlim_cur == RLIM_INFINITY)
 708                                                 printf("ulimit unlimited\n");
 709                                         else
 710                                                 printf("ulimit %lld\n",
 711                                                     rlp.rlim_cur / 512);
 712                                 }
 713                         }
 714                         /*
 715                          * fix for 1113572 - use fputs() so that a
 716                          * newline isn't appended to the one returned
 717                          * with fgets(); 1099381 - prompt for input.
 718                          */
 719                         while (fgets(line, LINE_MAX, inputfile) != NULL) {