[DVIPDFMx] dvipdfmx status?

Jin-Hwan CHO chof at ktug.kr
Sat Mar 5 10:50:00 KST 2011


Hi, Karl.

I will update the CVS source right now.

Best regards, ChoF.

2011/3/5 Karl Berry <karl at freefriends.org>:
> Hello?  Anyone :)?
>
> ---------------------------------------
> From: karl at freefriends.org (Karl Berry)
> To: dvipdfmx at ktug.or.kr
> Subject: dpxfile.c patch for system() protection
>
> Hi ChoF, Matthias, all,
>
> Akira sent this new code last fall:
>
>    Date: Sat, 09 Oct 2010 16:40:20 +0900
>    From: "Akira Kakuto" <kakuto at fuk.kindai.ac.jp>
>    Subject: Re: [XeTeX] File name bug when using \includegraphics
>
> The idea is that the simple invocation of system() is a security hazard,
> because it's run through /bin/sh and the filename can trivially contain
> stuff like `rm -rf /` or any other malicious command.
>
> The change protects things with quotes.  We do similar things now in TeX
> and dvips, etc.  Patch below.
>
> Ok?  Can you apply, if you haven't already?
>
>
> Also, I'll take this opportunity to mention that my goal for this year
> is to have the major software updates made by the beginning of April.
> I'm not sure if other changes have been made to dvipdfmx since last
> year, but it would be nice to have a new release just with this change.
> Possible?
>
> Thanks,
> Karl
>
> --- dpxfile.c   (revision 21543)
> +++ dpxfile.c   (working copy)
> @@ -35,6 +35,24 @@
>
>  #include "dpxfile.h"
>
> +#include <kpathsea/lib.h>
> +#include <kpathsea/concatn.h>
> +#include <string.h>
> +#ifdef WIN32
> +#include <io.h>
> +#include <process.h>
> +#else
> +#if HAVE_SYS_WAIT_H
> +# include <sys/wait.h>
> +#endif
> +#ifndef WEXITSTATUS
> +# define WEXITSTATUS(val) ((unsigned)(val) >> 8)
> +#endif
> +#ifndef WIFEXITED
> +# define WIFEXITED(val) (((val) & 255) == 0)
> +#endif
> +#endif
> +
>  static int verbose = 0;
>
>  void
> @@ -132,8 +150,98 @@
>  #endif
>  static char  _tmpbuf[_MAX_PATH+1];
>  #endif /* MIKTEX */
> +
> +static int exec_spawn (char *cmd)
> +{
> +  char **cmdv, **qv;
> +  char *p, *pp;
> +  char buf[512];
> +  int  i, ret;
>
> +  if (!cmd || !*cmd)
> +    return -1;
> +  i = 0;
> +  p = cmd;
> +  while (*p) {
> +    if (*p == ' ' || *p == '\t')
> +      i++;
> +    p++;
> +  }
> +  cmdv = (char **) xmalloc (sizeof (char *) * (i+2));
> +  p = cmd;
> +  qv = cmdv;
> +  while (*p == ' ' || *p == '\t')
> +    p++;
> +  while (*p) {
> +    pp = buf;
> +    if (*p == '"') {
> +      p++;
> +      while (*p != '"') {
> +        if (*p == '\0') {
> +          free (cmdv);
> +          return -1;
> +        }
> +        *pp++ = *p++;
> +      }
> +      p++;
> +    } else if (*p == '\'') {
> +      p++;
> +      while (*p != '\'') {
> +        if (*p == '\0') {
> +          free (cmdv);
> +          return -1;
> +        }
> +        *pp++ = *p++;
> +      }
> +      p++;
> +    } else {
> +      while (*p != ' ' && *p != '\t' && *p)
> +        *pp++ = *p++;
> +    }
> +    *pp = '\0';
> +    if ((pp = strchr (buf, ' ')) || (pp = strchr (buf, '\t'))) {
> +#ifdef WIN32
> +      *qv = concatn ("\"", buf, "\"", NULL);
> +#else
> +      *qv = concatn ("'", buf, "'", NULL);
> +#endif
> +    } else {
> +      *qv = concat (buf, "");
> +    }
> +    while (*p == ' ' || *p == '\t')
> +      p++;
> +    qv++;
> +  }
> +  *qv = NULL;
> +#ifdef WIN32
> +  ret = spawnvp (_P_WAIT, *cmdv, cmdv);
> +#else
> +  i = fork ();
> +  if (i < 0)
> +    ret = -1;
> +  else if (i == 0) {
> +    if (execvp (*cmdv, cmdv))
> +      ret = -1;
> +  } else {
> +    if (wait (&ret) == i) {
> +      ret = (WIFEXITED (ret) ? WEXITSTATUS (ret) : -1);
> +    } else {
> +      ret = -1;
> +    }
> +  }
> +#endif
> +  qv = cmdv;
> +  if (qv) {
> +    while (*qv) {
> +      free (*qv);
> +      qv++;
> +    }
> +    free (cmdv);
> +  }
> +  return ret;
> +}
>
> +
>  /* ensuresuffix() returns a copy of basename if sfx is "". */
>  static char *
>  ensuresuffix (const char *basename, const char *sfx)
> @@ -750,7 +858,7 @@
>     return -1;
>   }
>
> -  error = system(cmd);
> +  error = exec_spawn(cmd);
>   if (error)
>     WARN("Filtering file via command -->%s<-- failed.", cmd);
>   RELEASE(cmd);
>
>


More information about the dvipdfmx mailing list