diff -ruN xv-3.10a.orig/xvbrowse.c xv-3.10a/xvbrowse.c --- xv-3.10a.orig/xvbrowse.c 2005-04-13 14:15:46.000000000 +0100 +++ xv-3.10a/xvbrowse.c 2005-04-13 14:29:06.000000000 +0100 @@ -4950,7 +4950,21 @@ if (dstdir) { #ifndef VMS /* we don't delete directories in VMS */ + char *x, *y, *name; + + x = (char *) malloc((5 * strlen(dst))+3);*x++ = 0x27; + if (!x) + FatalError("malloc failure in xvbrowse.c moveFile"); + name = x; + *x++ = 0x27; + for (y = dst; *y; ++y) { + if (0x27 == *y) { + strcpy(x, "'\"'\"'"); + x += strlen(x); + } else *x++ = *y; + } sprintf(buf, "rm -rf %s", dst); + free(name); if (system(buf)) { /* okay, so it's cheating... */ SetISTR(ISTR_WARNING, "Unable to remove directory %s", dst); return 1; diff -ruN xv-3.10a.orig/xvpds.c xv-3.10a/xvpds.c --- xv-3.10a.orig/xvpds.c 2005-04-13 14:15:41.000000000 +0100 +++ xv-3.10a/xvpds.c 2005-04-13 14:16:16.000000000 +0100 @@ -77,8 +77,7 @@ * Huffman-encoded, and the encoding histogram follows the ASCII headers. * To decode these, we use a slightly modified version of "vdcomp.c" from the * NASA Viking CD-ROMS. For xv to work, you need to have vdcomp compiled - * and in your search path. vdcomp.c should be included with this -distribution. + * and in your search path. vdcomp.c should be included with this distribution. * * I've heard that newer discs have FITS images on them. If they do, support * for them will be added when I get one. Until then, you can use fitstopgm. @@ -129,27 +128,32 @@ /* This is arbitrary. Everything I've seen so far fits in 50 chars */ #define COMMENTSIZE 50 +#define INOTESIZE 1000 static int lastwasinote = FALSE; -static char scanbuff [MAX_SIZE], - rtbuff [RTBUFFSIZE], - inote [20*COMMENTSIZE], - infobuff [COMMENTSIZE], - spacecraft [COMMENTSIZE], - target [COMMENTSIZE], - filtname [COMMENTSIZE], - gainmode [COMMENTSIZE], - editmode [COMMENTSIZE], - scanmode [COMMENTSIZE], - exposure [COMMENTSIZE], - shuttermode [COMMENTSIZE], - mphase [COMMENTSIZE], - iname [COMMENTSIZE], - itime [COMMENTSIZE], - garbage [1020], +static char scanbuff [MAX_SIZE+1], + rtbuff [RTBUFFSIZE+1], + inote [INOTESIZE+1], + infobuff [COMMENTSIZE+1], + spacecraft [COMMENTSIZE+1], + target [COMMENTSIZE+1], + filtname [COMMENTSIZE+1], + gainmode [COMMENTSIZE+1], + editmode [COMMENTSIZE+1], + scanmode [COMMENTSIZE+1], + exposure [COMMENTSIZE+1], + shuttermode [COMMENTSIZE+1], + mphase [COMMENTSIZE+1], + iname [COMMENTSIZE+1], + itime [COMMENTSIZE+1], + garbage [1024], *tmptmp, pdsuncompfname[FNAMESIZE]; + +#define SSTR(l) "%" #l "s" +#define S(l) SSTR(l) + byte *image; static int elaphe; @@ -397,7 +401,7 @@ if (strcmp(scanbuff,"END") == 0) { break; - } else if (sscanf(scanbuff," RECORD_TYPE = %s",rtbuff) == 1) { + } else if (sscanf(scanbuff, " RECORD_TYPE = " S(RTBUFFSIZE), rtbuff) == 1) { if (strncmp(rtbuff,"VARIABLE_LENGTH", (size_t) 15) == 0) { /* itype=PDSVARIABLE; */ } else if (strncmp(rtbuff,"FIXED_LENGTH", (size_t) 12) == 0) { @@ -416,7 +420,7 @@ if (irecsize == 0) irecsize=recsize; lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," FILE_TYPE = %s", rtbuff) != 0) { + } else if (sscanf(scanbuff, " FILE_TYPE = " S(RTBUFFSIZE), rtbuff) != 0) { lastwasinote=FALSE; if (strncmp(rtbuff,"IMAGE", (size_t) 5) == 0) { isimage=TRUE; @@ -445,74 +449,74 @@ lastwasinote=FALSE; continue; } else if (sscanf(scanbuff," SAMPLE_BITS = %d", &samplesize) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," SAMPLE_TYPE = %s", sampletype) == 1) { + } else if (sscanf(scanbuff, " SAMPLE_TYPE = " S(64), sampletype) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," SPACECRAFT_NAME = %s %s", + } else if (sscanf(scanbuff," SPACECRAFT_NAME = " S(COMMENTSIZE) " " S(1023), spacecraft,garbage) == 2 ) { - strcat(spacecraft,xv_strstr(scanbuff, spacecraft)+strlen(spacecraft)); + const char *tmp = xv_strstr(scanbuff, spacecraft) + strlen(spacecraft); + strncat(spacecraft, tmp, COMMENTSIZE - strlen(spacecraft)); lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," SPACECRAFT_NAME = %s", spacecraft) == 1) { + } else if (sscanf(scanbuff, " SPACECRAFT_NAME = " S(COMMENTSIZE), spacecraft) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," TARGET_NAME = %s", target) == 1) { + } else if (sscanf(scanbuff, " TARGET_NAME = " S(COMMENTSIZE), target) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," TARGET_BODY = %s", target) == 1) { + } else if (sscanf(scanbuff, " TARGET_BODY = " S(COMMENTSIZE), target) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," MISSION_PHASE_NAME = %s", mphase) == 1) { + } else if (sscanf(scanbuff, " MISSION_PHASE_NAME = " S(COMMENTSIZE), mphase) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," MISSION_PHASE = %s", mphase) == 1) { + } else if (sscanf(scanbuff, " MISSION_PHASE = " S(COMMENTSIZE), mphase) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," INSTRUMENT_NAME = %s", iname) == 1) { + } else if (sscanf(scanbuff, " INSTRUMENT_NAME = " S(COMMENTSIZE), iname) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," GAIN_MODE_ID = %s", gainmode) == 1) { + } else if (sscanf(scanbuff, " GAIN_MODE_ID = " S(COMMENTSIZE), gainmode) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," INSTRUMENT_GAIN_STATE = %s",gainmode)==1) { + } else if (sscanf(scanbuff, " INSTRUMENT_GAIN_STATE = " S(COMMENTSIZE), gainmode) ==1 ) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," EDIT_MODE_ID = %s", editmode) == 1) { + } else if (sscanf(scanbuff, " EDIT_MODE_ID = " S(COMMENTSIZE), editmode) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," INSTRUMENT_EDIT_MODE = %s", editmode)==1) { + } else if (sscanf(scanbuff, " INSTRUMENT_EDIT_MODE = " S(COMMENTSIZE), editmode) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," SCAN_MODE_ID = %s", scanmode) == 1) { + } else if (sscanf(scanbuff, " SCAN_MODE_ID = " S(COMMENTSIZE), scanmode) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," INSTRUMENT_SCAN_RATE = %s", scanmode)==1) { + } else if (sscanf(scanbuff, " INSTRUMENT_SCAN_RATE = " S(COMMENTSIZE), scanmode) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," SHUTTER_MODE_ID = %s", shuttermode) == 1) { + } else if (sscanf(scanbuff, " SHUTTER_MODE_ID = " S(COMMENTSIZE), shuttermode) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," INSTRUMENT_SHUTTER_MODE = %s", - shuttermode) == 1) { + } else if (sscanf(scanbuff, " INSTRUMENT_SHUTTER_MODE = " S(COMMENTSIZE), shuttermode) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," SCAN_MODE_ID = %s", scanmode) == 1) { + } else if (sscanf(scanbuff, " SCAN_MODE_ID = " S(COMMENTSIZE), scanmode) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," INSTRUMENT_SCAN_RATE = %s", scanmode)==1) { + } else if (sscanf(scanbuff, " INSTRUMENT_SCAN_RATE = " S(COMMENTSIZE), scanmode) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," SPACECRAFT_EVENT_TIME = %s", itime) == 1) { + } else if (sscanf(scanbuff, " SPACECRAFT_EVENT_TIME = " S(COMMENTSIZE), itime) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," IMAGE_TIME = %s", itime) == 1) { + } else if (sscanf(scanbuff, " IMAGE_TIME = " S(COMMENTSIZE), itime) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," FILTER_NAME = %s", filtname) == 1) { + } else if (sscanf(scanbuff, " FILTER_NAME = " S(COMMENTSIZE), filtname) == 1) { lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff," INSTRUMENT_FILTER_NAME = %s",filtname)==1) { + } else if (sscanf(scanbuff, " INSTRUMENT_FILTER_NAME = " S(COMMENTSIZE), filtname) == 1) { lastwasinote=FALSE; continue; - } else if ((sscanf(scanbuff," EXPOSURE_DURATION = %s", exposure) == 1) - || (sscanf(scanbuff," INSTRUMENT_EXPOSURE_DURATION = %s", - exposure) == 1)) { + } else if ((sscanf(scanbuff, " EXPOSURE_DURATION = " S(COMMENTSIZE), exposure) == 1) + || (sscanf(scanbuff, " INSTRUMENT_EXPOSURE_DURATION = " S(COMMENTSIZE), + exposure)) == 1) { tmptmp = (char *) index(scanbuff,'='); tmptmp++; while((*tmptmp) == ' ') @@ -520,10 +524,10 @@ strcpy(exposure,tmptmp); lastwasinote=FALSE; continue; - } else if (sscanf(scanbuff, "NOTE = %s", inote) == 1) { + } else if (sscanf(scanbuff, "NOTE = " S(INOTESIZE), inote) == 1) { tmptmp = (char *) index(scanbuff,'='); tmptmp++; while (((*tmptmp) == ' ') || ((*tmptmp) == '"')) tmptmp++; - strcpy(inote,tmptmp); + strncpy(inote, tmptmp, INOTESIZE - 1); strcat(inote," "); /* evil and somewhat risky: A "note" (really, any textual @@ -548,7 +552,7 @@ } else if (lastwasinote) { tmptmp=scanbuff; while (((*tmptmp) == ' ') || ((*tmptmp) == '"')) tmptmp++; - strcat(inote,tmptmp); + strncat(inote, tmptmp, INOTESIZE - strlen(inote) - 1); strcat(inote," "); if (index(tmptmp,'"') != NULL) lastwasinote=FALSE; @@ -647,27 +651,27 @@ *infobuff='\0'; if (*spacecraft) { - strcat(infobuff,spacecraft); + strncat(infobuff, spacecraft, sizeof(infobuff) - 1); } if (*target) { - strcat(infobuff,", "); - strcat(infobuff,target); + strncat(infobuff, ", ", sizeof(infobuff) - strlen(infobuff) - 1); + strncat(infobuff, target, sizeof(infobuff) - strlen(infobuff) - 1); } if (*filtname) { - strcat(infobuff,", "); - strcat(infobuff,filtname); + strncat(infobuff, ", ", sizeof(infobuff) - strlen(infobuff) - 1); + strncat(infobuff, filtname, sizeof(infobuff) - strlen(infobuff) - 1); } if (*itime) { - strcat(infobuff,", "); - strcat(infobuff,itime); + strncat(infobuff, ", ", sizeof(infobuff) - strlen(infobuff) - 1); + strncat(infobuff, itime, sizeof(infobuff) - strlen(infobuff) - 1); } - SetISTR(ISTR_WARNING,infobuff); + SetISTR(ISTR_WARNING, "%s", infobuff); - strcpy(pdsuncompfname,fname); + strncpy(pdsuncompfname,fname,sizeof(pdsuncompfname) - 1); ftypstr = ""; switch (itype) { @@ -695,7 +699,7 @@ fclose(zf); #ifndef VMS - sprintf(pdsuncompfname,"%s/xvhuffXXXXXX", tmpdir); + snprintf(pdsuncompfname, sizeof(pdsuncompfname) - 1, "%s/xvhuffXXXXXX", tmpdir); #else strcpy(pdsuncompfname,"sys$disk:[]xvhuffXXXXXX"); #endif @@ -707,7 +711,7 @@ #endif #ifndef VMS - sprintf(scanbuff,"%s %s - 4 >%s",PDSUNCOMP,fname,pdsuncompfname); + sprintf(scanbuff,"%s '%s' - 4 > %s", PDSUNCOMP, fname, pdsuncompfname); #else sprintf(scanbuff,"%s %s %s 4",PDSUNCOMP,fname,pdsuncompfname); #endif @@ -824,25 +828,25 @@ *(pinfo->comment) = '\0'; sprintf(tmp, "Spacecraft: %-28sTarget: %-32s\n", spacecraft, target); - strcat(pinfo->comment, tmp); + strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); sprintf(tmp, "Filter: %-32sMission phase: %-24s\n", filtname, mphase); - strcat(pinfo->comment, tmp); + strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); sprintf(tmp, "Image time: %-28sGain mode: %-29s\n", itime, gainmode); - strcat(pinfo->comment, tmp); + strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); sprintf(tmp, "Edit mode: %-29sScan mode: %-29s\n", editmode, scanmode); - strcat(pinfo->comment, tmp); + strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); sprintf(tmp, "Exposure: %-30sShutter mode: %-25s\n", exposure,shuttermode); - strcat(pinfo->comment, tmp); + strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); sprintf(tmp, "Instrument: %-28sImage time: %-28s\n", iname, itime); - strcat(pinfo->comment, tmp); + strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); - sprintf(tmp, "Image Note: %-28s", inote); - strcat(pinfo->comment, tmp); + sprintf(tmp, "Image Note: %-28.28s", inote); + strncat(pinfo->comment, tmp, 2000 - strlen(pinfo->comment) - 1); } if (LoadPDSPalette(fname, pinfo)) return 1; diff -ruN xv-3.10a.orig/xvps.c xv-3.10a/xvps.c --- xv-3.10a.orig/xvps.c 2005-04-13 14:15:46.000000000 +0100 +++ xv-3.10a/xvps.c 2005-04-13 14:16:16.000000000 +0100 @@ -1561,7 +1561,8 @@ the first one is loaded (but not deleted) */ #ifdef GS_PATH - char tmp[512], gscmd[512], cmdstr[512], tmpname[64]; + #define CMDSIZE 1024 + char tmp[512], gscmd[512], cmdstr[CMDSIZE], tmpname[64]; int gsresult, nump, i, filetype, doalert, epsf; #endif @@ -1733,32 +1734,48 @@ /******************************************************************/ #ifdef GS_PATH -void buildCmdStr(str, gscmd, fname, quick, epsf) - char *str, *gscmd, *fname; +void buildCmdStr(str, gscmd, xname, quick, epsf) + char *str, *gscmd, *xname; int quick, epsf; { /* note 'epsf' set only on files that don't have a showpage cmd */ + char *x, *y, *fname; + + x = (char *) malloc((5 * strlen(xname))+3); + if (!x) + FatalError("malloc failure in xvps.c buildCmdStr"); + fname = x; + *x++ = 0x27; + + for (y = xname; *y; ++y) { + if (0x27 == *y) { + strcpy(x, "'\"'\"'"); + x += strlen(x); + } else *x++ = *y; + } + strcpy (x, "'"); #ifndef VMS - if (epsf) sprintf(str, "echo '\n showpage ' | cat '%s' - | %s -", + if (epsf) snprintf(str, CMDSIZE, "echo '\n showpage ' | cat %s - | %s -", fname, gscmd); - else if (quick) sprintf(str, "echo '%s' | cat - '%s' | %s -", + else if (quick) snprintf(str, CMDSIZE, "echo %s | cat - %s | %s -", "/showpage { showpage quit } bind def", fname, gscmd); - else sprintf(str, "%s -- %s", gscmd, fname); + else snprintf(str, CMDSIZE, "%s -- %s", gscmd, fname); #else /* VMS */ /* VMS doesn't have pipes or an 'echo' command and GS doesn't like - Unix-style file names as input files in the VMS version */ + Unix-style file fnames as input files in the VMS version */ strcat(tmp, " -- "); rld = strrchr(fname, '/'); /* Pointer to last '/' */ if (rld) rld++; /* Pointer to filename */ else rld = fname; /* No path - use original string */ strcat(tmp, rld); #endif /* VMS */ + free(fname); } #endif /* GS_PATH */ diff -ruN xv-3.10a.orig/xvtiff.c xv-3.10a/xvtiff.c --- xv-3.10a.orig/xvtiff.c 2005-04-13 14:15:46.000000000 +0100 +++ xv-3.10a/xvtiff.c 2005-04-13 14:16:16.000000000 +0100 @@ -512,7 +512,7 @@ vsprintf(cp, fmt, ap); strcat(cp, "."); - SetISTR(ISTR_WARNING,buf); + SetISTR(ISTR_WARNING, "%s", buf); error_occurred = 1; } @@ -536,7 +536,7 @@ vsprintf(cp, fmt, ap); strcat(cp, "."); - SetISTR(ISTR_WARNING,buf); + SetISTR(ISTR_WARNING, "%s", buf); }