1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-13 11:42:21 +00:00

dtprintinfo: try to mitigate some stupid in ParseJob.C for sun

Marco Ivaldi pointed me to some unsafe code in ParseJob.c.  I do not
have a sun machine (well, not currently operational anyway), so the
code is not tested.  But seriously, this is some horrible code.  This
local parser for sun needs to be rewritten!
This commit is contained in:
Jon Trulson 2021-03-14 14:51:54 -06:00
parent 0b7849e210
commit 297918bb56

View file

@ -53,6 +53,8 @@ extern "C" in_addr_t inet_addr(const char *);
#include <ctype.h>
#include <X11/Intrinsic.h>
#include <string>
#include "dtprintinfomsg.h"
#ifdef NO_REGCOMP
@ -342,6 +344,15 @@ void LocalPrintJobs(char *printer, char **job_list, int *n_jobs)
#if defined(sun)
// JET - this *really* needs to be re-written for sun
// I tried to mitigate some of the more stupider code segments in
// check_dir() for example, but... It's a C++ file, yet someone who
// does not appear to know C++ very well wrote this crap in... C, sort
// of.
#warning "This SUN local parser code is unsafe, please re-write"
// SUN LOCAL PARSER, actually this gets the local information from the file
// system, it should have the good performance since no processes (lpstat)
// are needed.
@ -438,6 +449,7 @@ void LocalPrintJobs(char *printer, char **return_job_list, int *return_n_jobs)
SETEUID(getuid());
}
// JET - this whole function is atrocious and should be re-written in C++
static void check_dir(char *printer, char *tmp_dir, StatusLineList *job_list,
int *n_jobs, int prev_n_jobs)
{
@ -466,11 +478,11 @@ static void check_dir(char *printer, char *tmp_dir, StatusLineList *job_list,
char *spool_dir = new char[300];
if (getenv("REQ_DIR"))
sprintf(request, getenv("REQ_DIR"), tmp_dir);
snprintf(request, sizeof(request), "%s/%s", getenv("REQ_DIR"), tmp_dir);
else
sprintf(request, REQ_DIR, tmp_dir);
sprintf(request, sizeof(request), "%s", REQ_DIR, tmp_dir);
req_len = strlen(request);
sprintf(spool_dir, SPOOL_DIR, tmp_dir);
snprintf(spool_dir, sizeof(spool_dir), "%s/%s", SPOOL_DIR, tmp_dir);
spool_len = strlen(spool_dir);
if (!(lp_tmp_dir = opendir(".")))
@ -490,9 +502,13 @@ static void check_dir(char *printer, char *tmp_dir, StatusLineList *job_list,
continue;
if (strcmp(dir_struct->d_name + len - 2, "-0"))
continue;
*(request + req_len) = '\0';
strcat(request + req_len, dir_struct->d_name);
if (!(req = fopen(request, "r")))
// *(request + req_len) = '\0';
// strcat(request + req_len, dir_struct->d_name);
std:string file_req(request);
file_req.append(dir_struct->d_name);
if (!(req = fopen(file_req.c_str(), "r")))
continue;
if (!(job = fopen(dir_struct->d_name, "r")))
{
@ -521,14 +537,19 @@ static void check_dir(char *printer, char *tmp_dir, StatusLineList *job_list,
found = 0;
break;
case 'F':
*(spool_dir + spool_len) = '\0';
strncat(spool_dir, dir_struct->d_name, len - 1);
strcat(spool_dir, "1");
if (strcmp(spool_dir, line + 2))
strcpy(filename1, line + 2);
{
// *(spool_dir + spool_len) = '\0';
// strncat(spool_dir, dir_struct->d_name, len - 1);
// strcat(spool_dir, "1");
std::string spool_chk(spool_dir);
spool_chk.append(dir_struct->d_name);
spool_chk.append("1");
if (strcmp(spool_chk.c_str(), line + 2))
snprintf(filename1, sizeof(filename1), "%s", line + 2);
else
*filename1 = '\0';
break;
}
break;
case 'O':
if (s = strrchr(line, ':'))
*s = '\0';