Hello all,

I am new in the mailling list.
I am french and my english is probably not good.

I think i have a bug report ;)
I use Win32::GUI version 0.0.425.

I have a random error with GetOpenFileName.

my $ret = Win32::GUI::GetOpenFileName(
                  -title  => "Choose a text file",
                  -filter => [
                      'Text documents (*.txt)' => '*.txt',
                      'All files' => '*.*'
                   ],
                );

My script stop and i receive in my console :

Out of memory!
Callback called exit.

This error append only when i use the filter option of GetOpenFileName.

I look in gui.xs file and i think this error come from the filterlen variable.
filterlen is not set to 0 and use after like :  filterlen += SvCUR(*t) + 1;
so filterlen is not good.
filterlen must be declare to 0.

The code below come from an old Version: 0.0.340 (02 Jul 1999) but it's probably 
the same code in version 0425 for GetOPenFileName function.

I have not tested with correction. I want first found 0.0.425 source code.

        Laurent.

---- extract of GetOpenFileName function -----

            if(strcmp(option, "-filter") == 0) {
                next_i = i + 1;
                if(SvROK(ST(next_i)) && SvTYPE(SvRV(ST(next_i))) == SVt_PVAV) {
                    AV* filters;
                    SV** t;                    
                    int i, filterlen = 0; // Original code : int i,
filterlen;     
                    char *fpointer;
                    filters = (AV*)SvRV(ST(next_i));
                    for(i=0; i<=av_len(filters); i++) {
                        t = av_fetch(filters, i, 0);
                        if(t != NULL) {
                            filterlen += SvCUR(*t) + 1;   
                        }
                    }
                    filterlen += 2;
                    filter = (char *) safemalloc(filterlen);
                    fpointer = filter;
                    for(i=0; i<=av_len(filters); i++) {
                        t = av_fetch(filters, i, 0);
                        if(t != NULL) {
                            strcpy(fpointer, SvPV(*t, na));
                            fpointer += SvCUR(*t) + 1;
                            *fpointer = 0;
                        }
                        
                    }
                    fpointer++;
                    *fpointer = 0;
                    ofn.lpstrFilter = (LPCTSTR) filter;
                } else {
                    if(dowarn) warn("Win32::GUI: argument to -filter is not an
array reference!");
                }

------------------------------------------

Reply via email to