[Bf-committers] zlib patch
Shaul Kedem
shaul.kedem at gmail.com
Wed Jul 13 11:21:54 CEST 2005
Hi all,
Anyone had a chance at looking into this patch? should I put it in
the patch tracker?
Regards,
shul
On 7/9/05, Bart <bart at neeneenee.de> wrote:
>
> 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