Roxen.git / server / etc / include / roxen.pre.pike

version» Context lines:

Roxen.git/server/etc/include/roxen.pre.pike:1:   void perror(string format,mixed ... args);    - string popen(string s, void|mapping env) + string popen(string s, void|mapping env, int|void uid, int|void gid)   {    object p,p2;       p2 = File();    p=p2->pipe();    if(!p) error("Popen failed. (couldn't create pipe)\n");       if(!fork())    { -  array (int) olduid; +  array (int) olduid = ({ -1, -1 });    catch {    if(p->query_fd() < 0)    {    perror("File to dup2 to closed!\n");    exit(99);    }    p->dup2(File("stdout")); -  -  olduid = ({ geteuid(), getegid() }); -  seteuid(0); - #if efun(setegid) -  setegid(getgid()); - #endif +  if(uid || gid) +  { +  object privs = ((program)"privs")("Executing script as non-www user"); +  olduid = ({ uid, gid });    setgid(olduid[1]);    setuid(olduid[0]); -  + #if efun(initgroups) +  array pw = getpwuid((int)uid); +  if(pw) initgroups(pw[0], (int)olduid[0]); + #endif +  }    catch(exece("/bin/sh", ({ "-c", s }), (env||environment)));    };    exit(69);    }else{    string t;    destruct(p); -  t=p2->read(6553555); +  t=p2->read(0x7fffffff);    destruct(p2);    return t;    }   }         mapping make_mapping(string *f)   {    mapping foo=([ ]);    string s, a, b;
Roxen.git/server/etc/include/roxen.pre.pike:71:    cd(wd);    exece(s, args, env);    perror(sprintf("Spawne: Failed to exece %s\n", s));    exit(0);   }      int spawne(string s,string *args, mapping|array env, object stdin,    object stdout, object stderr, void|string wd, void|array (int) uid)   {    int pid, *olduid = allocate(2, "int"); -  if(pid=fork()) -  return pid; +  object privs; +  +  if(pid=fork()) return pid; +     if(arrayp(uid) && sizeof(uid) == 2)    { - #if efun(seteuid) -  olduid = ({ geteuid(), getegid() }); -  seteuid(0); - #endif - #if efun(setegid) -  setegid(getgid()); - #endif +  privs = ((program)"privs")("Executing program as non-www user (outside roxen)");    setgid(uid[1]);    setuid(uid[0]); -  if(!getuid()) -  { - #if efun(seteuid) -  setgid(olduid[1]); -  setuid(olduid[0]); - #else -  setgid(-1); -  setuid(-1); - #endif -  } else { -  olduid = ({ geteuid(), getegid() }); - #if efun(seteuid) -  seteuid(0); - #endif - #if efun(setegid) -  setegid(getgid()); - #endif -  setgid(olduid[1]); -  setuid(olduid[0]); +     } -  } +     catch(low_spawne(s, args, env, stdin, stdout, stderr, wd));    exit(0);   }      private static int perror_last_was_newline=1;      void perror(string format,mixed ... args)   {    string s;    int lwn;