[Bf-committers] zlib patch

Bart bart at neeneenee.de
Sat Jul 9 16:33:53 CEST 2005


oh, forget the buffer overflow problem exists in 1.2.2 and it seems 
there is no fix at the moment.

Shaul Kedem schrieb:
> Hi all,
>  First, let me introduce myself; my name is Shaul Kedem, I am 30 and
> in the coding/developing/managing business for about 10 years now.
> 
>  Sirdude suggested I'll give a go at the zlib stuff, so I did - see
> attached diff from current CVS.
> 
>  I've also wrote a couple of notes on the wiki, check it out at
> http://wiki.blender.org/bin/view.pl/Blenderdev/Blendgz
> 
>  intrr, in the course of reviewing the code, suggested that the user
> preferences will be added with the compression option as well, if
> anyone like to propose where exactly in blender this should be done
> I'll gladly hear,
> 
>  constructive criticism is welcome,
> 
> Regards,
> Shaul
> 
> 
> ------------------------------------------------------------------------
> 
> ? Hypersrc.pl
> ? YBtest.tga
> ? YBtest.xml
> ? blender
> ? blenderplayer
> ? build.log
> ? config.opts
> ? config.opts.old.1
> ? ctags.pl
> ? doit.sh
> ? hypersrc
> ? intrr.txt
> ? kaito.txt
> ? obj/2.34
> ? obj/blender-2.34-linux-glibc2.3.3-i386
> ? obj/linux-glibc2.3.3-i386
> ? tools/__init__.pyc
> ? tools/scons/__init__.pyc
> ? tools/scons/bs/__init__.pyc
> ? tools/scons/bs/bs_arc.pyc
> ? tools/scons/bs/bs_bincopy.pyc
> ? tools/scons/bs/bs_clean.pyc
> ? tools/scons/bs/bs_config.pyc
> ? tools/scons/bs/bs_default.pyc
> ? tools/scons/bs/bs_dirs.pyc
> ? tools/scons/bs/bs_globals.pyc
> ? tools/scons/bs/bs_libs.pyc
> ? tools/scons/bs/bs_nsis.pyc
> Index: source/blender/blenkernel/intern/exotic.c
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/blenkernel/intern/exotic.c,v
> retrieving revision 1.40
> diff -u -r1.40 exotic.c
> --- source/blender/blenkernel/intern/exotic.c	3 Jul 2005 17:35:31 -0000	1.40
> +++ source/blender/blenkernel/intern/exotic.c	8 Jul 2005 14:59:36 -0000
> @@ -2399,7 +2399,7 @@
>  			read(file, str, 31);
>  			close(file);
>  
> -			if ((*s0 != FORM) && (strncmp(str, "BLEN", 4) != 0)) {
> +			if ((*s0 != FORM) && (strncmp(str, "BLEN", 4) != 0) && !BLI_testextensie(name,".blend.gz")) {
>  
>  				waitcursor(1);
>  				
> Index: source/blender/blenlib/BLI_blenlib.h
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/blenlib/BLI_blenlib.h,v
> retrieving revision 1.13
> diff -u -r1.13 BLI_blenlib.h
> --- source/blender/blenlib/BLI_blenlib.h	20 May 2005 12:18:11 -0000	1.13
> +++ source/blender/blenlib/BLI_blenlib.h	8 Jul 2005 14:59:37 -0000
> @@ -256,6 +256,7 @@
>  int   BLI_exists(char *file);
>  int   BLI_copy_fileops(char *file, char *to);
>  int   BLI_rename(char *from, char *to);
> +int   BLI_gzip(char *from, char *to);
>  int   BLI_delete(char *file, int dir, int recursive);
>  int   BLI_move(char *file, char *to);
>  int   BLI_touch(char *file);
> Index: source/blender/blenlib/intern/fileops.c
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/blenlib/intern/fileops.c,v
> retrieving revision 1.6
> diff -u -r1.6 fileops.c
> --- source/blender/blenlib/intern/fileops.c	9 Mar 2005 19:45:54 -0000	1.6
> +++ source/blender/blenlib/intern/fileops.c	8 Jul 2005 14:59:38 -0000
> @@ -55,6 +55,14 @@
>  #include "BLI_fileops.h"
>  #include "BLI_callbacks.h"
>  
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +
> +#include "BKE_utildefines.h"
> +#include "zlib.h"
> +#include <errno.h>
> +
>  /* implementations: */
>  char *first_slash(char *string) {
>  	char *ffslash, *fbslash;
> @@ -301,6 +309,37 @@
>  	if (BLI_exists(to))	if(BLI_delete(to, 0, 0)) return 1;
>  		
>  	return rename(from, to);
> +}
> +
> +/* gzip the file in from and write it to "to". 
> + return -1 if zlib fails, -2 if the originating file does not exist
> + note: will remove the "from" file
> +  */
> +int BLI_gzip(char *from, char *to) {
> +	char buffer[10240];
> +	int file;
> +	int readsize = 0;
> +	
> +	gzFile gzfile = gzopen(to,"wb"); 
> +	if (NULL == gzfile) return -1;
> +	
> +	file = open(from,O_BINARY|O_RDONLY);
> +	
> +	if ( -1 == file ) 	return -2;
> +
> +	while ( 1 )
> +	{
> +		readsize = read(file, buffer, 10240);
> +		
> +		if (readsize <= 0) break;
> +		
> +		gzwrite(gzfile,buffer,readsize);
> +	}
> +	
> +	gzclose(gzfile);
> +	close(file);
> +	
> +	remove(from);
>  }
>  
>  #endif
> Index: source/blender/blenlib/intern/util.c
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/blenlib/intern/util.c,v
> retrieving revision 1.26
> diff -u -r1.26 util.c
> --- source/blender/blenlib/intern/util.c	10 Jun 2005 13:12:59 -0000	1.26
> +++ source/blender/blenlib/intern/util.c	8 Jul 2005 14:59:40 -0000
> @@ -121,6 +121,11 @@
>  		else if (BLI_strncasecmp(string + len - 6, ".trace", 6) == 0) len -= 6;
>  	}
>  	
> +	if (len > 9) {
> +		if (BLI_strncasecmp(string + len - 9, ".blend.gz", 9) == 0) len -= 9;
> +	}
> +		
> +	
>  	if (len == len2) {
>  		if (len > 4) {
>  			/* handle .jf0 en .jf1 for jstreams */
> @@ -585,7 +590,7 @@
>  }
>  
>  void BLI_clean(char *path)
> -{
> +{
>  	if(path==0) return;
>  #ifdef WIN32
>  	if(path && strlen(path)>2) {
> @@ -597,7 +602,7 @@
>  }
>  
>  void BLI_char_switch(char *string, char from, char to) 
> -{
> +{
>  	if(string==0) return;
>  	while (*string != 0) {
>  		if (*string == from) *string = to;
> @@ -683,7 +688,7 @@
>  		
>  	strcat (string, file);
>  	
> -	/* Push all slashes to the system preferred direction */
> +	/* Push all slashes to the system preferred direction */
>  	BLI_clean(string);
>  }
>  
> Index: source/blender/blenloader/intern/readfile.c
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/blenloader/intern/readfile.c,v
> retrieving revision 1.136
> diff -u -r1.136 readfile.c
> --- source/blender/blenloader/intern/readfile.c	6 Jul 2005 05:10:31 -0000	1.136
> +++ source/blender/blenloader/intern/readfile.c	8 Jul 2005 14:59:50 -0000
> @@ -139,6 +139,10 @@
>  #include "mydevice.h"
>  #include "blendef.h"
>  
> +#include "zlib.h"
> +
> +#include <errno.h>
> +
>  /*
>   Remark: still a weak point is the newadress() function, that doesnt solve reading from
>   multiple files at the same time
> @@ -772,6 +776,19 @@
>  	return (readsize);
>  }
>  
> +static int fd_read_gzip_from_file(FileData *filedata, void *buffer, int size)
> +{
> +	int readsize = gzread(filedata->filedes, buffer, size);
> +
> +	if (readsize < 0) {
> +		readsize = EOF;
> +	} else {
> +		filedata->seek += readsize;
> +	}
> +
> +	return (readsize);
> +}
> +
>  static int fd_read_from_memory(FileData *filedata, void *buffer, int size)
>  {
>  		// don't read more bytes then there are available in the buffer
> @@ -854,7 +871,7 @@
>  
>  FileData *blo_openblenderfile(char *name)
>  {
> -	int file;
> +	gzFile file;
>  	char name1[FILE_MAXDIR+FILE_MAXFILE];
>  	
>  	/* library files can have stringcodes */
> @@ -864,16 +881,16 @@
>  	else
>  		strcpy(G.sce, name);	// global... is set in blender.c setup_app_data too. should be part of Main immediate?
>  	
> -	file= open(name1, O_BINARY|O_RDONLY);
> +	file= gzopen(name1, "rb");
>  
> -	if (file == -1) {
> +	if (NULL == file) {
>  		return NULL;
>  	} else {
>  		FileData *fd = filedata_new();
> -		fd->filedes = file;
> +		fd->filedes = (int)file;
>  		BLI_strncpy(fd->filename, name, sizeof(fd->filename));	// now only in use by library append
>  		fd->buffersize = BLI_filesize(file);
> -		fd->read = fd_read_from_file;
> +		fd->read = fd_read_gzip_from_file;
>  
>  		decode_blender_header(fd);
>  
> @@ -950,7 +967,7 @@
>  {
>  	if (fd) {
>  		if (fd->filedes != -1) {
> -			close(fd->filedes);
> +			gzclose(fd->filedes);
>  		}
>  
>  		if (fd->buffer && !(fd->flags & FD_FLAGS_NOT_MY_BUFFER)) {
> @@ -983,7 +1000,7 @@
>  
>  int BLO_has_bfile_extension(char *str)
>  {
> -	return (BLI_testextensie(str, ".ble") || BLI_testextensie(str, ".blend"));
> +	return (BLI_testextensie(str, ".ble") || BLI_testextensie(str, ".blend")||BLI_testextensie(str, ".blend.gz"));
>  }
>  
>  /* ************** OLD POINTERS ******************* */
> Index: source/blender/blenloader/intern/writefile.c
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/blenloader/intern/writefile.c,v
> retrieving revision 1.46
> diff -u -r1.46 writefile.c
> --- source/blender/blenloader/intern/writefile.c	3 Jul 2005 17:35:31 -0000	1.46
> +++ source/blender/blenloader/intern/writefile.c	8 Jul 2005 14:59:53 -0000
> @@ -165,6 +165,9 @@
>  #include "readfile.h"
>  #include "genfile.h"
>  
> +#include "zlib.h"
> +
> +#include <errno.h>
>  
>  /* ********* my write, buffered writing with minimum 50k chunks ************ */
>  
> @@ -199,7 +202,7 @@
>  
>  static void writedata_do_write(WriteData *wd, void *mem, int memlen)
>  {
> -	if (wd->error) return;
> + 	if (wd->error) return;
>  
>  	/* memory based save */
>  	if(wd->current) {
> @@ -1577,12 +1580,14 @@
>  /* return: success (1) */
>  int BLO_write_file(char *dir, int write_flags, char **error_r)
>  {
> +
>  	char userfilename[FILE_MAXDIR+FILE_MAXFILE];
>  	char tempname[FILE_MAXDIR+FILE_MAXFILE];
> +	char gzname[FILE_MAXDIR+FILE_MAXFILE];
>  	int file, fout, write_user_block;
>  
>  	sprintf(tempname, "%s@", dir);
> -
> +	
>  	file = open(tempname,O_BINARY+O_WRONLY+O_CREAT+O_TRUNC, 0666);
>  	if(file == -1) {
>  		*error_r= "Unable to open";
> @@ -1597,10 +1602,27 @@
>  	close(file);
>  
>  	if(!fout) {
> +		if(write_flags & G_FILE_COMPRESS)
> +		{	
> +			// .gz is concatenated to the name in filesel.c:
> +			int ret = BLI_gzip(tempname, dir);
> +			if(-1==ret) {
> +				*error_r= "Failed opening .gz file";
> +				return 0;
> +			}
> +			if(-2==ret) {
> +				*error_r= "Failed opening .blend file for compression";
> +				return 0;
> +			}
> +			
> +		}
> +		else
>  		if(BLI_rename(tempname, dir) < 0) {
>  			*error_r= "Can't change old file. File saved with @";
>  			return 0;
>  		}
> +
> +		
>  	} else {
>  		remove(tempname);
>  
> Index: source/blender/include/BSE_filesel.h
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/include/BSE_filesel.h,v
> retrieving revision 1.8
> diff -u -r1.8 BSE_filesel.h
> --- source/blender/include/BSE_filesel.h	17 Jul 2003 14:19:55 -0000	1.8
> +++ source/blender/include/BSE_filesel.h	8 Jul 2005 14:59:54 -0000
> @@ -56,7 +56,8 @@
>  void filesel_prevspace(void);
>  void free_filesel_spec(char *dir);
>  void winqreadfilespace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
> -void main_to_filelist(struct SpaceFile *sfile);   
> +void main_to_filelist(struct SpaceFile *sfile); 
> +void flip_gz_filename(void *arg1_unused, void *arg2_unused);  
>  
>  void clever_numbuts_filesel(void);
>  #endif
> Index: source/blender/src/filesel.c
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/src/filesel.c,v
> retrieving revision 1.55
> diff -u -r1.55 filesel.c
> --- source/blender/src/filesel.c	3 Jul 2005 17:35:37 -0000	1.55
> +++ source/blender/src/filesel.c	8 Jul 2005 15:00:19 -0000
> @@ -187,7 +187,7 @@
>  }
>  char *fsmenu_build_menu(void)
>  {
> -	DynStr *ds= BLI_dynstr_new();
> + 	DynStr *ds= BLI_dynstr_new();
>  	FSMenuEntry *fsme;
>  	char *menustr;
>  
> @@ -692,7 +692,7 @@
>  static void split_sfile(SpaceFile *sfile, char *s1)
>  {
>  	char string[FILE_MAXDIR+FILE_MAXFILE], dir[FILE_MAXDIR], file[FILE_MAXFILE];
> -
> +	
>  	strcpy(string, s1);
>  
>  	BLI_split_dirfile(string, dir, file);
> @@ -704,6 +704,7 @@
>  		else test_flags_file(sfile);
>  	}
>  	strcpy(sfile->file, file);
> +		
>  	BLI_make_file_string(G.sce, sfile->dir, dir, "");
>  }
>  
> @@ -917,6 +918,7 @@
>  		linerect(boxcol, x, y);
>  	}
>  
> +	// this is where the little boxes in the file view are being drawn according to the file type
>  	if(files->flags & BLENDERFILE) {
>  		cpack(0xA0A0);
>  		glRects(x-14,  y,  x-8,  y+7);
> @@ -1150,8 +1152,9 @@
>  	}
>  	else loadbutton= 0;
>  
> -	uiDefBut(block, TEX,	    1,"",	textrct.xmin, filebuty1, textrct.xmax-textrct.xmin-loadbutton, 21, sfile->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
> -	uiDefBut(block, TEX,	    2,"",	textrct.xmin, filebuty2, textrct.xmax-textrct.xmin-loadbutton, 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
> +	uiDefBut(block, TEX,1,"",	textrct.xmin, filebuty1, textrct.xmax-textrct.xmin-loadbutton, 21, sfile->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
> +	uiDefBut(block, TEX,2,"",	textrct.xmin, filebuty2, textrct.xmax-textrct.xmin-loadbutton, 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
> +
>  	if(loadbutton) {
>  		uiSetCurFont(block, UI_HELV);
>  		uiDefBut(block, BUT,	    5, sfile->title,	textrct.xmax-loadbutton, filebuty2, loadbutton, 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
> @@ -1857,7 +1860,13 @@
>  					else {
>  						if( strcmp(sfile->file, sfile->filelist[act].relname)) {
>  							do_draw= 1;
> -							strcpy(sfile->file, sfile->filelist[act].relname);
> +							
> +							if( (G.fileflags & G_FILE_COMPRESS) && (strncmp(sfile->title, "Save", 4)==0))
> +							{
> +								sprintf(sfile->file,"%s.gz",sfile->filelist[act].relname);
> +							}
> +							else 
> +								strcpy(sfile->file, sfile->filelist[act].relname);
>  						}
>  						if(event==MIDDLEMOUSE && sfile->type) filesel_execute(sfile);
>  					}
> @@ -2552,3 +2561,24 @@
>  	}
>  }
>  
> +// add/remove .gz from end of filename - event on the compression button (see header_filesel.c)
> +void flip_gz_filename(void *arg1_unused, void *arg2_unused)
> +{
> +	SpaceFile *sfile;
> +	
> +	sfile= curarea->spacedata.first;
> +	
> +	if( (G.fileflags & G_FILE_COMPRESS))	{
> +		if( !BLI_testextensie(sfile->file, ".blend.gz")) {
> +		strcat(sfile->file, ".gz");
> +		scrarea_queue_winredraw(curarea);
> +		}
> +	}
> +	else
> +	if(BLI_testextensie(sfile->file, ".blend.gz")) {
> +	//remove gz extension
> +	
> +	*strrchr(sfile->file, '.')=0;
> +	scrarea_queue_winredraw(curarea);
> +	}
> +}
> Index: source/blender/src/header_filesel.c
> ===================================================================
> RCS file: /cvsroot/bf-blender/blender/source/blender/src/header_filesel.c,v
> retrieving revision 1.17
> diff -u -r1.17 header_filesel.c
> --- source/blender/src/header_filesel.c	28 May 2005 16:11:11 -0000	1.17
> +++ source/blender/src/header_filesel.c	8 Jul 2005 15:00:20 -0000
> @@ -145,7 +145,20 @@
>  		uiBlockEndAlign(block);
>  	} else if(sfile->type==FILE_BLENDER) {
>  		uiDefButI(block, TOGN|BIT|10, B_REDR, "Load UI", xco+=XIC,0,80,YIC, &G.fileflags, 0, 0, 0, 0, "Load the UI setup as well as the scene data");
> -		xco+=100;
> +		
> +	
> +		xco+=60;
> +						
> +		if(strncmp(sfile->title, "Save", 4)==0)
> +		{
> +		uiBut *bt = uiDefIconButI(block, ICONTOG|BIT|G_FILE_COMPRESS_BIT, 0, ICON_CHECKBOX_DEHLT, xco+=20,0, 15,YIC, &G.fileflags, 0.0, 0.0, 0, 0, "Enable file compression");
> +		uiButSetFunc(bt, flip_gz_filename, NULL, NULL);
> +		}
> +		else
> +			xco+=20;
> +		
> +		xco+=20;
> +
>  	}
>  
>  	if(sfile->type==FILE_UNIX) {
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at projects.blender.org
> http://projects.blender.org/mailman/listinfo/bf-committers


-- 
|\/\/\/|
|      |
| (O)(O)        Bart.
C      _)       bart at neeneenee.de
|   ,_/
|   /    - Ich bin nicht berechtigt Aushilfslehrer zu feuern -
/   \
                 http://www.neeneenee.de


More information about the Bf-committers mailing list