vi encryption bug nailed

utzoo!decvax!harpo!eagle!mhuxt!cbosg!cbosgd!mark utzoo!decvax!harpo!eagle!mhuxt!cbosg!cbosgd!mark
Wed Apr 7 12:48:49 AEST 1982


From: mark (Mark Horton)
The long outstanding bug that caused vi to mess up when editing encrypted
files (the temp file would be unencrypted in spots, and the file as
shown to you would be encrypted) has finally been nailed.  Thanks to
Ed Bradford who reproduced it for me.  The problem was that the calls
to routine blkio in ex_temp.c in routine synctmp were not encrypting
the buffer before writing it out to the temp file.  This bug is now fixed
in vi version 3.8.  If you edit encrypted files and want the fix now,
I'm enclosing a diff -c.
	Mark
***************
*** 283,288
  	register int cnt;
  	register line *a;
  	register short *bp;
  
  #ifdef VMUNIX
  	if (stilinc)

--- 283,290 -----
  	register int cnt;
  	register line *a;
  	register short *bp;
+ 	register char *p1, *p2;
+ 	register int n;
  
  #ifdef VMUNIX
  	if (stilinc)
***************
*** 290,295
  #endif
  	if (dol == zero)
  		return;
  	if (ichanged)
  		blkio(iblock, ibuff, write);
  	ichanged = 0;

--- 292,303 -----
  #endif
  	if (dol == zero)
  		return;
+ 	/*
+ 	 * In theory, we need to encrypt iblock and iblock2 before writing
+ 	 * them out, as well as oblock, but in practice ichanged and ichang2
+ 	 * can never be set, so this isn't really needed.  Likewise, the
+ 	 * code in getblock above for iblock+iblock2 isn't needed.
+ 	 */
  	if (ichanged)
  		blkio(iblock, ibuff, write);
  	ichanged = 0;
***************
*** 297,302
  		blkio(iblock2, ibuff2, write);
  	ichang2 = 0;
  	if (oblock != -1)
  		blkio(oblock, obuff, write);
  	time(&H.Time);
  	uid = getuid();

--- 305,325 -----
  		blkio(iblock2, ibuff2, write);
  	ichang2 = 0;
  	if (oblock != -1)
+ #ifdef CRYPT
+ 	if(xtflag) {
+ 		/*
+ 		 * Encrypt block before writing, so some devious
+ 		 * person can't look at temp file while editing.
+ 		 */
+ 		p1 = obuff;
+ 		p2 = crbuf;
+ 		n = CRSIZE;
+ 		while(n--)
+ 			*p2++ = *p1++;
+ 		crblock(tperm, crbuf, CRSIZE, (long)0);
+ 		blkio(oblock, crbuf, write);
+ 	} else
+ #endif
  		blkio(oblock, obuff, write);
  	time(&H.Time);
  	uid = getuid();



More information about the Comp.bugs.4bsd.ucb-fixes mailing list